From ea71d96dd7c82a519c6ff618dd7d8301cf799aa9 Mon Sep 17 00:00:00 2001 From: Jeremy Fleischman Date: Wed, 14 Sep 2022 00:26:00 -0700 Subject: [PATCH] Don't assume that `size` file is valid I don't know how my cache got into this state, but I had an empty size file: $ cat ~/.cache/mcg/127.0.0.1/size $ stat ~/.cache/mcg/127.0.0.1/size File: /home/jeremy/.cache/mcg/127.0.0.1/size Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 254,0 Inode: 18493061 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ jeremy) Gid: ( 100/ users) Access: 2022-09-14 00:18:32.942885525 -0700 Modify: 2022-09-07 12:32:44.151734944 -0700 Change: 2022-09-07 12:32:44.151734944 -0700 Birth: 2022-08-25 10:01:01.729717504 -0700 This was causing mcg's Library view to crash like this: (.mcg-wrapped:879276): Gtk-CRITICAL **: 00:19:15.727: gtk_window_add_accel_group: assertion 'GTK_IS_WINDOW (window)' failed Exception in thread Thread-1 (_set_playlist): Traceback (most recent call last): File "/nix/store/c1vb2z3c64i0sd92iz7fv0lb720qcvhb-python3-3.10.6/lib/python3.10/threading.py", line 1016, in _bootstrap_inner self.run() File "/nix/store/c1vb2z3c64i0sd92iz7fv0lb720qcvhb-python3-3.10.6/lib/python3.10/threading.py", line 953, in run self._target(*self._args, **self._kwargs) File "/nix/store/l935dwmk93sq2chr4xxiipv9amyfcg43-CoverGrid-3.1/share/mcg/mcg/playlistpanel.py", line 256, in _set_playlist cache = client.MCGCache(host, size) File "/nix/store/l935dwmk93sq2chr4xxiipv9amyfcg43-CoverGrid-3.1/share/mcg/mcg/client.py", line 1279, in __init__ self._read_size() File "/nix/store/l935dwmk93sq2chr4xxiipv9amyfcg43-CoverGrid-3.1/share/mcg/mcg/client.py", line 1293, in _read_size size = int(f.readline()) ValueError: invalid literal for int() with base 10: '' Maybe mcg crashed while writing the `size` file at some point? I see that it writes directly to the size file, which seems potentially risky: it would probably be safer to write to a temp file and then (atomically) move it. Still, it seems like a good practice to be resilient here. After this change, here's what I see get printed by mcg: (.mcg-wrapped:889856): Gtk-CRITICAL **: 00:37:00.045: gtk_window_add_accel_group: assertion 'GTK_IS_WINDOW (window)' failed 2022-09-14 00:37:00,076 WARNING: invalid cache file: /home/jeremy/.cache/mcg/127.0.0.1/size, deleting file Traceback (most recent call last): File "/nix/store/vzgcfs00nq543hjk8hrk81k1rs8aqpqw-CoverGrid-3.1/share/mcg/mcg/client.py", line 1295, in _read_size size = int(f.readline()) ValueError: invalid literal for int() with base 10: '' And then the problem goes away =) --- src/client.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/client.py b/src/client.py index 3367205..b2a5d69 100644 --- a/src/client.py +++ b/src/client.py @@ -1271,6 +1271,7 @@ class MCGCache(): def __init__(self, host, size): + self._logger = logging.getLogger(__name__) self._host = host self._size = size self._dirname = os.path.expanduser(os.path.join(MCGCache.DIRNAME, host)) @@ -1290,7 +1291,11 @@ class MCGCache(): filename = os.path.join(self._dirname, MCGCache.SIZE_FILENAME) if os.path.exists(filename): with open(filename, 'r') as f: - size = int(f.readline()) + try: + size = int(f.readline()) + except: + self._logger.warning("invalid cache file: %s, deleting file", filename, exc_info=True) + size = None # Clear cache if size has changed if size != self._size: self._clear()