diff --git a/nilmdb/fsck/fsck.py b/nilmdb/fsck/fsck.py index 032c54e..b4bc0db 100644 --- a/nilmdb/fsck/fsck.py +++ b/nilmdb/fsck/fsck.py @@ -248,23 +248,22 @@ class Fsck(object): # Check that we can open bulkdata tab = nilmdb.server.bulkdata.Table(bulk) - except FsckFormatError: + except FsckFormatError as e: # If there are no files except _format, try deleting # the entire stream; this may remove metadata, but # it's probably unimportant. files = list(os.listdir(bulk)) if len(files) > 1: - raise - if len(files) == 1 and files[0] != b'_format': - raise + raise FsckFormatError(f"{path}: can't load _format, " + f"but data is also present") # Since the stream was empty, just remove it self.fix_remove_stream(sid, path, bulk, "empty, with corrupted format file") - - except FsckError: - raise - except Exception as e: + except FsckError as e: + raise e + except Exception as e: # pragma: no cover + # No coverage because this is an unknown/unexpected error raise FsckError("%s: can't open bulkdata: %s", path, str(e)) tab.close() @@ -278,6 +277,7 @@ class Fsck(object): fmt = pickle.load(f) except Exception as e: raise FsckFormatError(f"{path}: can't load _format file ({e})") + if fmt["version"] != 3: raise FsckFormatError("%s: bad or unsupported bulkdata version %d", path, fmt["version"]) diff --git a/tests/test_fsck.py b/tests/test_fsck.py index 50d566f..83bc650 100644 --- a/tests/test_fsck.py +++ b/tests/test_fsck.py @@ -163,3 +163,8 @@ class TestFsck(object): raise Exception("hi") with assert_raises(Exception): foo() + + self.failmsg("test2v", "can't load _format, but data is also present") + self.failmsg("test2v1", "bad bulkdata table") + self.failmsg("test2v2", "empty, with corrupted format file", fix=False) + self.okmsg("test2v2", "empty, with corrupted format file")