diff --git a/src/nixglhost_wrapper.py b/src/nixglhost_wrapper.py index f866aff..800a693 100755 --- a/src/nixglhost_wrapper.py +++ b/src/nixglhost_wrapper.py @@ -14,7 +14,7 @@ from glob import glob from typing import List, Literal, Dict, Tuple, TypedDict, TextIO, Optional IN_NIX_STORE = False -CACHE_VERSION = 2 +CACHE_VERSION = 3 if IN_NIX_STORE: @@ -30,47 +30,55 @@ class ResolvedLib: together with some metadata helping us to uniquely identify it.""" def __init__( - self, name: str, dirpath: str, fullpath: str, sha256: Optional[str] = None + self, + name: str, + dirpath: str, + fullpath: str, + last_modification: Optional[float] = None, + size: Optional[int] = None, ): self.name: str = name self.dirpath: str = dirpath self.fullpath: str = fullpath - if sha256 is None: - h = hashlib.sha256() - with open(fullpath, "rb") as f: - h.update(f.read()) - sha: str = h.hexdigest() + if size is None or last_modification is None: + stat = os.stat(fullpath) + self.last_modification: float = stat.st_atime + self.size: int = stat.st_size else: - sha = sha256 - self.sha256: str = sha + self.last_modification = last_modification + self.size = size def __repr__(self): - return ( - f"ResolvedLib<{self.name}, {self.dirpath}, {self.fullpath}, {self.sha256}>" - ) + return f"ResolvedLib<{self.name}, {self.dirpath}, {self.fullpath}, {self.last_modification}, {self.size}>" def to_dict(self) -> Dict: return { "name": self.name, "dirpath": self.dirpath, "fullpath": self.fullpath, - "sha256": self.sha256, + "last_modification": self.last_modification, + "size": self.size, } def __hash__(self): - return hash((self.name, self.dirpath, self.fullpath, self.sha256)) + return hash( + (self.name, self.dirpath, self.fullpath, self.last_modification, self.size) + ) def __eq__(self, o): return ( self.name == o.name and self.fullpath == o.fullpath - and self.sha256 == o.sha256 and self.dirpath == o.dirpath + and self.last_modification == o.last_modification + and self.size == o.size ) @classmethod def from_dict(cls, d: Dict): - return ResolvedLib(d["name"], d["dirpath"], d["fullpath"], d["sha256"]) + return ResolvedLib( + d["name"], d["dirpath"], d["fullpath"], d["last_modification"], d["size"] + ) class LibraryPath: @@ -374,8 +382,8 @@ def is_dso_cache_up_to_date(dsos: CacheDirContent, cache_file_path: str) -> bool We keep what's in the cache through a JSON file stored at the root of the cache_dir. We consider a dynamically shared object to be up - to date if its name, its full path and its content sha256 are - equivalent.""" + to date if its name, its full path, its size and last modification + timestamp are equivalent.""" log_info("Checking if the cache is up to date") if os.path.isfile(cache_file_path): with open(cache_file_path, "r", encoding="utf8") as f: diff --git a/src/nixglhost_wrapper_test.py b/src/nixglhost_wrapper_test.py index 59a2f72..09a8305 100644 --- a/src/nixglhost_wrapper_test.py +++ b/src/nixglhost_wrapper_test.py @@ -9,18 +9,12 @@ class TestCacheSerializer(unittest.TestCase): lp = LibraryPath( glx=[ ResolvedLib( - "dummyglx.so", - "/lib", - "/lib/dummyglx.so", - "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406", + "dummyglx.so", "/lib", "/lib/dummyglx.so", 1670260550.481498, 1612 ) ], cuda=[ ResolvedLib( - "dummycuda.so", - "/lib", - "/lib/dummycuda.so", - "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9407", + "dummycuda.so", "/lib", "/lib/dummycuda.so", 2670260550.481498, 2612 ) ], generic=[ @@ -28,15 +22,13 @@ class TestCacheSerializer(unittest.TestCase): "dummygeneric.so", "/lib", "/lib/dummygeneric.so", - "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9408", + 3670260550.481498, + 3612, ) ], egl=[ ResolvedLib( - "dummyegl.so", - "/lib", - "/lib/dummyegl.so", - "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9409", + "dummyegl.so", "/lib", "/lib/dummyegl.so", 4670260550.481498, 4612 ) ], path="/path/to/lib/dir", diff --git a/tests/fixtures/json_permut/1.json b/tests/fixtures/json_permut/1.json index d32f132..993888f 100644 --- a/tests/fixtures/json_permut/1.json +++ b/tests/fixtures/json_permut/1.json @@ -6,7 +6,8 @@ "name": "dummyglx.so", "dirpath": "/lib", "fullpath": "/lib/dummyglx.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406" + "last_modification": 1670260550.481498, + "size": 1612 } ], "cuda": [ @@ -14,7 +15,8 @@ "name": "dummycuda.so", "dirpath": "/lib", "fullpath": "/lib/dummycuda.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9407" + "last_modification": 2670260550.481498, + "size": 2612 } ], "generic": [ @@ -22,7 +24,8 @@ "name": "dummygeneric.so", "dirpath": "/lib", "fullpath": "/lib/dummygeneric.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9408" + "last_modification": 3670260550.481498, + "size": 3612 } ], "egl": [ @@ -30,7 +33,8 @@ "name": "dummyegl.so", "dirpath": "/lib", "fullpath": "/lib/dummyegl.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9409" + "last_modification": 4670260550.481498, + "size": 4612 } ], "path": "/path/to/lib/dir" @@ -41,7 +45,8 @@ "name": "dummyglx.so", "dirpath": "/lib", "fullpath": "/lib/dummyglx.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406" + "last_modification": 5670260550.481498, + "size": 5612 } ], "cuda": [ @@ -49,7 +54,8 @@ "name": "dummycuda.so", "dirpath": "/lib", "fullpath": "/lib/dummycuda.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9407" + "last_modification": 6670260550.481498, + "size": 6612 } ], "generic": [ @@ -57,7 +63,8 @@ "name": "dummygeneric.so", "dirpath": "/lib", "fullpath": "/lib/dummygeneric.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9408" + "last_modification": 7670260550.481498, + "size": 7612 } ], "egl": [ @@ -65,11 +72,12 @@ "name": "dummyegl.so", "dirpath": "/lib", "fullpath": "/lib/dummyegl.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9409" + "last_modification": 8670260550.481498, + "size": 8612 } ], "path": "/path/to/lib/dir2" } ], - "version": 2 + "version": 3 } diff --git a/tests/fixtures/json_permut/2.json b/tests/fixtures/json_permut/2.json index 00a48c1..358cc8e 100644 --- a/tests/fixtures/json_permut/2.json +++ b/tests/fixtures/json_permut/2.json @@ -6,7 +6,8 @@ "name": "dummyglx.so", "dirpath": "/lib", "fullpath": "/lib/dummyglx.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406" + "last_modification": 5670260550.481498, + "size": 5612 } ], "cuda": [ @@ -14,7 +15,8 @@ "name": "dummycuda.so", "dirpath": "/lib", "fullpath": "/lib/dummycuda.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9407" + "last_modification": 6670260550.481498, + "size": 6612 } ], "generic": [ @@ -22,7 +24,8 @@ "name": "dummygeneric.so", "dirpath": "/lib", "fullpath": "/lib/dummygeneric.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9408" + "last_modification": 7670260550.481498, + "size": 7612 } ], "egl": [ @@ -30,7 +33,8 @@ "name": "dummyegl.so", "dirpath": "/lib", "fullpath": "/lib/dummyegl.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9409" + "last_modification": 8670260550.481498, + "size": 8612 } ], "path": "/path/to/lib/dir2" @@ -41,7 +45,8 @@ "name": "dummyglx.so", "dirpath": "/lib", "fullpath": "/lib/dummyglx.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406" + "last_modification": 1670260550.481498, + "size": 1612 } ], "cuda": [ @@ -49,7 +54,8 @@ "name": "dummycuda.so", "dirpath": "/lib", "fullpath": "/lib/dummycuda.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9407" + "last_modification": 2670260550.481498, + "size": 2612 } ], "generic": [ @@ -57,7 +63,8 @@ "name": "dummygeneric.so", "dirpath": "/lib", "fullpath": "/lib/dummygeneric.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9408" + "last_modification": 3670260550.481498, + "size": 3612 } ], "egl": [ @@ -65,11 +72,12 @@ "name": "dummyegl.so", "dirpath": "/lib", "fullpath": "/lib/dummyegl.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9409" + "last_modification": 4670260550.481498, + "size": 4612 } ], "path": "/path/to/lib/dir" } ], - "version": 2 + "version": 3 } diff --git a/tests/fixtures/json_permut/not-equal.json b/tests/fixtures/json_permut/not-equal.json index ee7ec3c..cc041e1 100644 --- a/tests/fixtures/json_permut/not-equal.json +++ b/tests/fixtures/json_permut/not-equal.json @@ -6,7 +6,8 @@ "name": "dummyglx.so", "dirpath": "/lib", "fullpath": "/lib/dummyglx.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406" + "last_modification": 2670260550.481498, + "size": 2612 } ], "cuda": [ @@ -14,7 +15,8 @@ "name": "dummycuda.so", "dirpath": "/lib", "fullpath": "/lib/dummycuda.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9407" + "last_modification": 2670260550.481498, + "size": 2612 } ], "generic": [ @@ -22,7 +24,8 @@ "name": "dummygeneric.so", "dirpath": "/lib", "fullpath": "/lib/dummygeneric.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9408" + "last_modification": 3670260550.481498, + "size": 3612 } ], "egl": [ @@ -30,7 +33,8 @@ "name": "dummyegl.so", "dirpath": "/lib", "fullpath": "/lib/dummyegl.so", - "sha256": "031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9409" + "last_modification": 4670260550.481498, + "size": 4612 } ], "path": "/path/to/lib/dir" @@ -41,7 +45,8 @@ "name": "dummyglx.so", "dirpath": "/lib", "fullpath": "/lib/dummyglx.so", - "sha256": "4444444444444444444444444444444444444444444444444444444444444444" + "last_modification": 5670260550.481498, + "size": 5612 } ], "cuda": [ @@ -49,7 +54,8 @@ "name": "dummycuda.so", "dirpath": "/lib", "fullpath": "/lib/dummycuda.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9407" + "last_modification": 6670260550.481498, + "size": 6612 } ], "generic": [ @@ -57,7 +63,8 @@ "name": "dummygeneric.so", "dirpath": "/lib", "fullpath": "/lib/dummygeneric.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9408" + "last_modification": 7670260550.481498, + "size": 7612 } ], "egl": [ @@ -65,11 +72,12 @@ "name": "dummyegl.so", "dirpath": "/lib", "fullpath": "/lib/dummyegl.so", - "sha256": "131edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9409" + "last_modification": 8670260550.481498, + "size": 8612 } ], "path": "/path/to/lib/dir2" } ], - "version": 2 + "version": 3 }