diff --git a/services/clsi/app.js b/services/clsi/app.js index 77ab922987..8dd8a8cbf3 100644 --- a/services/clsi/app.js +++ b/services/clsi/app.js @@ -412,8 +412,9 @@ if (!module.parent) { module.exports = app setInterval(() => { - ProjectPersistenceManager.refreshExpiryTimeout() - ProjectPersistenceManager.clearExpiredProjects() + ProjectPersistenceManager.refreshExpiryTimeout(() => { + ProjectPersistenceManager.clearExpiredProjects() + }) }, tenMinutes) function __guard__(value, transform) { diff --git a/services/clsi/app/js/ProjectPersistenceManager.js b/services/clsi/app/js/ProjectPersistenceManager.js index d0fd4c2439..ca903f4410 100644 --- a/services/clsi/app/js/ProjectPersistenceManager.js +++ b/services/clsi/app/js/ProjectPersistenceManager.js @@ -21,34 +21,45 @@ const logger = require('logger-sharelatex') const oneDay = 24 * 60 * 60 * 1000 const Settings = require('settings-sharelatex') const diskusage = require('diskusage') +const { callbackify } = require('util') -module.exports = ProjectPersistenceManager = { - EXPIRY_TIMEOUT: Settings.project_cache_length_ms || oneDay * 2.5, - - refreshExpiryTimeout(callback) { - if (callback == null) { - callback = function (error) {} - } - diskusage.check('/', function (err, stats) { - if (err) { - logger.err({ err: err }, 'error getting disk usage') - return callback(err) - } +async function refreshExpiryTimeout() { + const paths = [ + Settings.path.compilesDir, + Settings.path.outputDir, + Settings.path.clsiCacheDir + ] + for (const path of paths) { + try { + const stats = await diskusage.check(path) const lowDisk = stats.available / stats.total < 0.1 + const lowerExpiry = ProjectPersistenceManager.EXPIRY_TIMEOUT * 0.9 if (lowDisk && Settings.project_cache_length_ms / 2 < lowerExpiry) { logger.warn( { - stats: stats, + stats, newExpiryTimeoutInDays: (lowerExpiry / oneDay).toFixed(2) }, 'disk running low on space, modifying EXPIRY_TIMEOUT' ) ProjectPersistenceManager.EXPIRY_TIMEOUT = lowerExpiry + break } - callback() - }) + } catch (err) { + logger.err({ err, path }, 'error getting disk usage') + } + } +} + +module.exports = ProjectPersistenceManager = { + EXPIRY_TIMEOUT: Settings.project_cache_length_ms || oneDay * 2.5, + + promises: { + refreshExpiryTimeout }, + + refreshExpiryTimeout: callbackify(refreshExpiryTimeout), markProjectAsJustAccessed(project_id, callback) { if (callback == null) { callback = function (error) {} diff --git a/services/clsi/test/unit/js/ProjectPersistenceManagerTests.js b/services/clsi/test/unit/js/ProjectPersistenceManagerTests.js index 5fb1827206..e60de54ff3 100644 --- a/services/clsi/test/unit/js/ProjectPersistenceManagerTests.js +++ b/services/clsi/test/unit/js/ProjectPersistenceManagerTests.js @@ -28,7 +28,12 @@ describe('ProjectPersistenceManager', function () { './CompileManager': (this.CompileManager = {}), diskusage: (this.diskusage = { check: sinon.stub() }), 'settings-sharelatex': (this.settings = { - project_cache_length_ms: 1000 + project_cache_length_ms: 1000, + path: { + compilesDir: '/compiles', + outputDir: '/output', + clsiCacheDir: '/cache' + } }), './db': (this.db = {}) } @@ -40,7 +45,7 @@ describe('ProjectPersistenceManager', function () { describe('refreshExpiryTimeout', function () { it('should leave expiry alone if plenty of disk', function (done) { - this.diskusage.check.callsArgWith(1, null, { + this.diskusage.check.resolves({ available: 40, total: 100 }) @@ -54,7 +59,7 @@ describe('ProjectPersistenceManager', function () { }) it('should drop EXPIRY_TIMEOUT 10% if low disk usage', function (done) { - this.diskusage.check.callsArgWith(1, null, { + this.diskusage.check.resolves({ available: 5, total: 100 }) @@ -66,7 +71,7 @@ describe('ProjectPersistenceManager', function () { }) it('should not drop EXPIRY_TIMEOUT to below 50% of project_cache_length_ms', function (done) { - this.diskusage.check.callsArgWith(1, null, { + this.diskusage.check.resolves({ available: 5, total: 100 }) @@ -78,10 +83,7 @@ describe('ProjectPersistenceManager', function () { }) it('should not modify EXPIRY_TIMEOUT if there is an error getting disk values', function (done) { - this.diskusage.check.callsArgWith(1, 'Error', { - available: 5, - total: 100 - }) + this.diskusage.check.throws(new Error()) this.ProjectPersistenceManager.refreshExpiryTimeout(() => { this.ProjectPersistenceManager.EXPIRY_TIMEOUT.should.equal(1000) done()