Skip to content

Commit fa0584b

Browse files
authored
poc of using filesystem folders mtime for LRU (#19582)
1 parent 7119cf6 commit fa0584b

File tree

5 files changed

+8
-47
lines changed

5 files changed

+8
-47
lines changed

conan/internal/cache/cache.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,16 +301,17 @@ def assign_rrev(self, layout: RecipeLayout):
301301
self._db.update_recipe_timestamp(ref)
302302

303303
def get_recipe_lru(self, ref):
304-
return self._db.get_recipe_lru(ref)
304+
path = self._full_path(self._get_path(ref))
305+
return os.path.getmtime(path) # seconds since EPOCH
305306

306307
def update_recipes_lru(self, refs):
307-
self._db.update_recipes_lru(refs)
308+
for r in refs:
309+
path = self._full_path(self._get_path(r))
310+
os.utime(path, None)
308311

309312
def get_package_lru(self, pref):
310-
return self._db.get_package_lru(pref)
311-
312-
def update_packages_lru(self, prefs):
313-
self._db.update_packages_lru(prefs)
313+
layout = self.pkg_layout(pref) # It can be a build folder too
314+
return os.path.getmtime(layout.base_folder) # seconds since EPOCH
314315

315316
def path_to_ref(self, path):
316317
try:

conan/internal/cache/db/cache_database.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,6 @@ def update_recipe_timestamp(self, ref):
4040
def update_package_timestamp(self, pref: PkgReference, path: str, build_id: str):
4141
self._packages.update_timestamp(pref, path=path, build_id=build_id)
4242

43-
def get_recipe_lru(self, ref):
44-
return self._recipes.get_recipe(ref)["lru"]
45-
46-
def get_package_lru(self, pref: PkgReference):
47-
return self._packages.get(pref)["lru"]
48-
49-
def update_recipes_lru(self, refs):
50-
self._recipes.update_lru(refs)
51-
52-
def update_packages_lru(self, prefs):
53-
self._packages.update_lru(prefs)
54-
5543
def remove_recipe(self, ref: RecipeReference):
5644
# Removing the recipe must remove all the package binaries too from DB
5745
self._recipes.remove(ref)

conan/internal/cache/db/packages_table.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -100,20 +100,6 @@ def update_timestamp(self, pref: PkgReference, path: str, build_id: str):
100100
except sqlite3.IntegrityError:
101101
raise ConanReferenceAlreadyExistsInDB(f"Reference '{repr(pref)}' already exists")
102102

103-
def update_lru(self, prefs):
104-
# TODO: InstallGraph is dropping the pref.timestamp, cannot be checked here yet
105-
# assert pref.timestamp is not None, f"PREF _TIMESSTAMP IS NONE {repr(pref)}"
106-
params = [(str(pref.ref), pref.ref.revision, pref.package_id, pref.revision)
107-
for pref in prefs]
108-
where_clause = (f"{self.columns.reference} = ? AND {self.columns.rrev} = ? "
109-
f"AND {self.columns.pkgid} = ? AND {self.columns.prev} = ?")
110-
lru = timestamp_now()
111-
query = f"UPDATE {self.table_name} " \
112-
f"SET {self.columns.lru} = '{lru}' " \
113-
f"WHERE {where_clause};"
114-
with self.db_connection() as conn:
115-
conn.executemany(query, params)
116-
117103
def remove_build_id(self, pref):
118104
where_clause = self._where_clause(pref)
119105
query = f"UPDATE {self.table_name} " \

conan/internal/cache/db/recipes_table.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,6 @@ def update_timestamp(self, ref: RecipeReference):
6060
with self.db_connection() as conn:
6161
conn.execute(query)
6262

63-
def update_lru(self, refs):
64-
params = [(str(ref), ref.revision) for ref in refs]
65-
where_clause = f"{self.columns.reference} = ? AND {self.columns.rrev} = ?"
66-
lru = timestamp_now()
67-
query = f"UPDATE {self.table_name} " \
68-
f"SET {self.columns.lru} = '{lru}' " \
69-
f"WHERE {where_clause};"
70-
with self.db_connection() as conn:
71-
conn.executemany(query, params)
72-
7363
def remove(self, ref: RecipeReference):
7464
where_clause = self._where_clause(ref)
7565
query = f"DELETE FROM {self.table_name} " \

conan/internal/graph/installer.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -251,18 +251,13 @@ def install(self, deps_graph, remotes, install_order=None):
251251
handled_count = 1
252252

253253
self._download_bulk(install_order)
254-
prefs_lru = []
255254
for level in install_order:
256255
for install_reference in level:
257256
for package in install_reference.packages.values():
258257
recipe_layout = self._install_source(package.nodes[0], remotes)
259258
self._handle_package(recipe_layout, package, install_reference, handled_count,
260259
package_count)
261260
handled_count += 1
262-
if package.binary == BINARY_CACHE:
263-
prefs_lru.append(package.nodes[0].pref)
264-
265-
self._cache.update_packages_lru(prefs_lru)
266261

267262
MockInfoProperty.message()
268263

@@ -336,6 +331,7 @@ def _handle_package(self, recipe_layout, package, install_reference, handled_cou
336331
assert node.prev, "PREV for %s is None" % str(pref)
337332
msg = f'Already installed! ({handled_count} of {total_count})'
338333
node.conanfile.output.success(msg)
334+
os.utime(package_layout.base_folder, None)
339335

340336
# Make sure that all nodes with same pref compute package_info()
341337
pkg_folder = package_layout.package()

0 commit comments

Comments
 (0)