mirror of
https://github.com/overleaf/overleaf.git
synced 2025-03-06 06:52:11 +00:00
Merge pull request #168 from overleaf/ho-dynamic-disk-size-checker-2
add refreshExpiryTimeout function
This commit is contained in:
commit
44b36c2806
5 changed files with 102 additions and 5 deletions
|
@ -359,10 +359,10 @@ if (!module.parent) {
|
||||||
|
|
||||||
module.exports = app
|
module.exports = app
|
||||||
|
|
||||||
setInterval(
|
setInterval(() => {
|
||||||
() => ProjectPersistenceManager.clearExpiredProjects(),
|
ProjectPersistenceManager.refreshExpiryTimeout()
|
||||||
(tenMinutes = 10 * 60 * 1000)
|
ProjectPersistenceManager.clearExpiredProjects()
|
||||||
)
|
}, (tenMinutes = 10 * 60 * 1000))
|
||||||
|
|
||||||
function __guard__(value, transform) {
|
function __guard__(value, transform) {
|
||||||
return typeof value !== 'undefined' && value !== null
|
return typeof value !== 'undefined' && value !== null
|
||||||
|
|
|
@ -20,10 +20,32 @@ const async = require('async')
|
||||||
const logger = require('logger-sharelatex')
|
const logger = require('logger-sharelatex')
|
||||||
const oneDay = 24 * 60 * 60 * 1000
|
const oneDay = 24 * 60 * 60 * 1000
|
||||||
const Settings = require('settings-sharelatex')
|
const Settings = require('settings-sharelatex')
|
||||||
|
const diskusage = require('diskusage')
|
||||||
|
|
||||||
module.exports = ProjectPersistenceManager = {
|
module.exports = ProjectPersistenceManager = {
|
||||||
EXPIRY_TIMEOUT: Settings.project_cache_length_ms || oneDay * 2.5,
|
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)
|
||||||
|
}
|
||||||
|
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 },
|
||||||
|
'disk running low on space, modifying EXPIRY_TIMEOUT'
|
||||||
|
)
|
||||||
|
ProjectPersistenceManager.EXPIRY_TIMEOUT = lowerExpiry
|
||||||
|
}
|
||||||
|
callback()
|
||||||
|
})
|
||||||
|
},
|
||||||
markProjectAsJustAccessed(project_id, callback) {
|
markProjectAsJustAccessed(project_id, callback) {
|
||||||
if (callback == null) {
|
if (callback == null) {
|
||||||
callback = function(error) {}
|
callback = function(error) {}
|
||||||
|
|
14
services/clsi/package-lock.json
generated
14
services/clsi/package-lock.json
generated
|
@ -1883,6 +1883,15 @@
|
||||||
"resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz",
|
"resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz",
|
||||||
"integrity": "sha1-JLuwAcSn1VIhaefKvbLCgU7ZHPQ="
|
"integrity": "sha1-JLuwAcSn1VIhaefKvbLCgU7ZHPQ="
|
||||||
},
|
},
|
||||||
|
"diskusage": {
|
||||||
|
"version": "1.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/diskusage/-/diskusage-1.1.3.tgz",
|
||||||
|
"integrity": "sha512-EAyaxl8hy4Ph07kzlzGTfpbZMNAAAHXSZtNEMwdlnSd1noHzvA6HsgKt4fEMSvaEXQYLSphe5rPMxN4WOj0hcQ==",
|
||||||
|
"requires": {
|
||||||
|
"es6-promise": "^4.2.5",
|
||||||
|
"nan": "^2.14.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"dlv": {
|
"dlv": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
|
||||||
|
@ -6925,6 +6934,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
|
||||||
"integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ=="
|
"integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ=="
|
||||||
},
|
},
|
||||||
|
"when": {
|
||||||
|
"version": "3.7.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz",
|
||||||
|
"integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I="
|
||||||
|
},
|
||||||
"which": {
|
"which": {
|
||||||
"version": "1.3.1",
|
"version": "1.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "3.2.0",
|
"async": "3.2.0",
|
||||||
"body-parser": "^1.19.0",
|
"body-parser": "^1.19.0",
|
||||||
|
"diskusage": "^1.1.3",
|
||||||
"dockerode": "^3.1.0",
|
"dockerode": "^3.1.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"fs-extra": "^8.1.0",
|
"fs-extra": "^8.1.0",
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
const SandboxedModule = require('sandboxed-module')
|
const SandboxedModule = require('sandboxed-module')
|
||||||
const sinon = require('sinon')
|
const sinon = require('sinon')
|
||||||
require('chai').should()
|
require('chai').should()
|
||||||
|
const assert = require('chai').assert
|
||||||
const modulePath = require('path').join(
|
const modulePath = require('path').join(
|
||||||
__dirname,
|
__dirname,
|
||||||
'../../../app/js/ProjectPersistenceManager'
|
'../../../app/js/ProjectPersistenceManager'
|
||||||
|
@ -26,7 +27,15 @@ describe('ProjectPersistenceManager', function() {
|
||||||
requires: {
|
requires: {
|
||||||
'./UrlCache': (this.UrlCache = {}),
|
'./UrlCache': (this.UrlCache = {}),
|
||||||
'./CompileManager': (this.CompileManager = {}),
|
'./CompileManager': (this.CompileManager = {}),
|
||||||
'logger-sharelatex': (this.logger = { log: sinon.stub() }),
|
diskusage: (this.diskusage = { check: sinon.stub() }),
|
||||||
|
'logger-sharelatex': (this.logger = {
|
||||||
|
log: sinon.stub(),
|
||||||
|
warn: sinon.stub(),
|
||||||
|
err: sinon.stub()
|
||||||
|
}),
|
||||||
|
'settings-sharelatex': (this.settings = {
|
||||||
|
project_cache_length_ms: 1000
|
||||||
|
}),
|
||||||
'./db': (this.db = {})
|
'./db': (this.db = {})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -35,6 +44,57 @@ describe('ProjectPersistenceManager', function() {
|
||||||
return (this.user_id = '1234')
|
return (this.user_id = '1234')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('refreshExpiryTimeout', function() {
|
||||||
|
it('should leave expiry alone if plenty of disk', function(done) {
|
||||||
|
this.diskusage.check.callsArgWith(1, null, {
|
||||||
|
available: 40,
|
||||||
|
total: 100
|
||||||
|
})
|
||||||
|
|
||||||
|
this.ProjectPersistenceManager.refreshExpiryTimeout(() => {
|
||||||
|
this.ProjectPersistenceManager.EXPIRY_TIMEOUT.should.equal(
|
||||||
|
this.settings.project_cache_length_ms
|
||||||
|
)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should drop EXPIRY_TIMEOUT 10% if low disk usage', function(done) {
|
||||||
|
this.diskusage.check.callsArgWith(1, null, {
|
||||||
|
available: 5,
|
||||||
|
total: 100
|
||||||
|
})
|
||||||
|
|
||||||
|
this.ProjectPersistenceManager.refreshExpiryTimeout(() => {
|
||||||
|
this.ProjectPersistenceManager.EXPIRY_TIMEOUT.should.equal(900)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should not drop EXPIRY_TIMEOUT to below 50% of project_cache_length_ms', function(done) {
|
||||||
|
this.diskusage.check.callsArgWith(1, null, {
|
||||||
|
available: 5,
|
||||||
|
total: 100
|
||||||
|
})
|
||||||
|
this.ProjectPersistenceManager.EXPIRY_TIMEOUT = 500
|
||||||
|
this.ProjectPersistenceManager.refreshExpiryTimeout(() => {
|
||||||
|
this.ProjectPersistenceManager.EXPIRY_TIMEOUT.should.equal(500)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
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.ProjectPersistenceManager.refreshExpiryTimeout(() => {
|
||||||
|
this.ProjectPersistenceManager.EXPIRY_TIMEOUT.should.equal(1000)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe('clearExpiredProjects', function() {
|
describe('clearExpiredProjects', function() {
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
this.project_ids = ['project-id-1', 'project-id-2']
|
this.project_ids = ['project-id-1', 'project-id-2']
|
||||||
|
|
Loading…
Reference in a new issue