Просмотр исходного кода

[clsi] make last access tracking more robust (#32192)

* [clsi] do not overwrite last access during initial scan

* [clsi] cleanup submission cache 5-10min after startup

* [clsi] address review comments

GitOrigin-RevId: e03beec1b3deaee50629ada72b0242a8a2b2ae66
Jakob Ackermann 4 месяцев назад
Родитель
Сommit
d5b55b831d
1 измененных файлов с 16 добавлено и 2 удалено
  1. 16 2
      services/clsi/app/js/ProjectPersistenceManager.js

+ 16 - 2
services/clsi/app/js/ProjectPersistenceManager.js

@@ -22,6 +22,11 @@ import { LAST_ACCESS } from './LastProjectAccess.js'
 let ProjectPersistenceManager
 const oneDay = 24 * 60 * 60 * 1000
 
+function setLastAccessIfNewer(id, ts) {
+  const prev = LAST_ACCESS.get(id) ?? 0
+  LAST_ACCESS.set(id, Math.max(ts, prev))
+}
+
 let ANY_DISK_LOW = false
 let ANY_DISK_CRITICAL_LOW = false
 
@@ -118,14 +123,23 @@ export default ProjectPersistenceManager = {
             Settings.path.compilesDir,
             projectAndUserId
           )
+          if (!/^[a-f0-9]{24}(-[a-f0-9]{24})?$/.test(projectAndUserId)) {
+            // Submissions etc. Schedule for cleanup in 5-10min with jitter.
+            const delay = (5 + 5 * Math.random()) * 60_000
+            setLastAccessIfNewer(
+              projectAndUserId,
+              Date.now() - ProjectPersistenceManager.EXPIRY_TIMEOUT + delay
+            )
+            return cb()
+          }
           const projectId = projectAndUserId.slice(0, 24)
           fs.stat(compileDir, (err, stats) => {
             if (err) {
               // Schedule for immediate cleanup
-              LAST_ACCESS.set(projectId, 0)
+              setLastAccessIfNewer(projectId, 0)
             } else {
               // Cleanup eventually.
-              LAST_ACCESS.set(projectId, stats.mtime.getTime())
+              setLastAccessIfNewer(projectId, stats.mtime.getTime())
             }
             cb()
           })