mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-05-23 17:19:37 +02:00
Merge pull request #5917 from overleaf/bg-clean-up-pathname-script
[document-updater] clean up empty pathname script GitOrigin-RevId: 6d7e47081de892e96ba93ca273662ec4397df796
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
const Settings = require('@overleaf/settings')
|
||||
const logger = require('@overleaf/logger')
|
||||
const rclient = require('@overleaf/redis-wrapper').createClient(
|
||||
Settings.redis.documentupdater
|
||||
)
|
||||
const keys = Settings.redis.documentupdater.key_schema
|
||||
const ProjectFlusher = require('app/js/ProjectFlusher')
|
||||
const DocumentManager = require('app/js/DocumentManager')
|
||||
const util = require('util')
|
||||
const flushAndDeleteDocWithLock = util.promisify(
|
||||
DocumentManager.flushAndDeleteDocWithLock
|
||||
)
|
||||
|
||||
async function flushAndDeleteDocs(dockeys, options) {
|
||||
const docIds = ProjectFlusher._extractIds(dockeys)
|
||||
for (const docId of docIds) {
|
||||
const pathname = await rclient.get(keys.pathname({ doc_id: docId }))
|
||||
if (!pathname) {
|
||||
const projectId = await rclient.get(keys.projectKey({ doc_id: docId }))
|
||||
if (!projectId) {
|
||||
// await deleteDanglingDoc(projectId, docId, pathname, options)
|
||||
logger.info(
|
||||
{ projectId, docId, pathname },
|
||||
'skipping doc with empty pathname and project id'
|
||||
)
|
||||
} else {
|
||||
await flushAndDeleteDoc(projectId, docId, pathname, options)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function flushAndDeleteDoc(projectId, docId, pathname, options) {
|
||||
if (options.dryRun) {
|
||||
logger.info(
|
||||
{ projectId, docId, pathname },
|
||||
'dry run mode - would flush doc with empty pathname'
|
||||
)
|
||||
return
|
||||
}
|
||||
logger.info(
|
||||
{ projectId, docId, pathname },
|
||||
'flushing doc with empty pathname'
|
||||
)
|
||||
try {
|
||||
await flushAndDeleteDocWithLock(projectId, docId, {})
|
||||
} catch (err) {
|
||||
logger.error(
|
||||
{ projectId, docId, pathname, err },
|
||||
'error flushing and deleting doc without pathname'
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
async function cleanUpDocs(options) {
|
||||
logger.info({ options }, 'cleaning up docs without pathnames')
|
||||
let cursor = 0
|
||||
do {
|
||||
const [newCursor, doclinesKeys] = await rclient.scan(
|
||||
cursor,
|
||||
'MATCH',
|
||||
keys.docLines({ doc_id: '*' }),
|
||||
'COUNT',
|
||||
options.limit
|
||||
)
|
||||
await flushAndDeleteDocs(doclinesKeys, options)
|
||||
cursor = newCursor
|
||||
} while (cursor !== '0')
|
||||
}
|
||||
|
||||
cleanUpDocs({ limit: 1000, dryRun: process.env.DRY_RUN !== 'false' })
|
||||
.then(result => {
|
||||
rclient.quit()
|
||||
console.log('DONE')
|
||||
})
|
||||
.catch(function (error) {
|
||||
if (error) {
|
||||
throw error
|
||||
}
|
||||
return process.exit()
|
||||
})
|
||||
Reference in New Issue
Block a user