[ProjectPersistenceManager] check all user content dirs for full disk

This commit is contained in:
Jakob Ackermann 2021-06-01 15:52:41 +01:00
parent 1127bf640e
commit 7380b54900
2 changed files with 36 additions and 23 deletions

View file

@ -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) {}

View file

@ -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()