mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Merge pull request #243 from overleaf/jpa-extend-disk-full-check
[ProjectPersistenceManager] check all user content dirs for full disk
This commit is contained in:
commit
be3797dc26
3 changed files with 39 additions and 25 deletions
|
@ -412,8 +412,9 @@ if (!module.parent) {
|
|||
module.exports = app
|
||||
|
||||
setInterval(() => {
|
||||
ProjectPersistenceManager.refreshExpiryTimeout()
|
||||
ProjectPersistenceManager.clearExpiredProjects()
|
||||
ProjectPersistenceManager.refreshExpiryTimeout(() => {
|
||||
ProjectPersistenceManager.clearExpiredProjects()
|
||||
})
|
||||
}, tenMinutes)
|
||||
|
||||
function __guard__(value, transform) {
|
||||
|
|
|
@ -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) {}
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in a new issue