From f3dc28cb3fb36ccd0e52325660940a31e639b88a Mon Sep 17 00:00:00 2001 From: Daniel Riggins Date: Mon, 23 Jan 2023 09:38:02 -0600 Subject: [PATCH] bg rendering patch --- server/models/pages.js | 49 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/server/models/pages.js b/server/models/pages.js index dc54af9a..50ea2bcd 100644 --- a/server/models/pages.js +++ b/server/models/pages.js @@ -28,6 +28,9 @@ const punctuationRegex = /[!,:;/\\_+\-=()&#@<>$~%^*[\]{}"'|]+|(\.\s)|(\s\.)/ig * Pages model */ module.exports = class Page extends Model { + static rebuildIsRunning = false + static rebuildIsQueued = false + static get tableName() { return 'pages' } static get jsonSchema () { @@ -333,7 +336,8 @@ module.exports = class Page extends Model { await WIKI.models.pages.renderPage(page) // -> Rebuild page tree - await WIKI.models.pages.rebuildTree() + // await WIKI.models.pages.rebuildTree() + WIKI.models.pages.rebuildTreeBG() // -> Add to Search Index const pageContents = await WIKI.models.pages.query().findById(page.id).select('render') @@ -736,7 +740,8 @@ module.exports = class Page extends Model { WIKI.events.outbound.emit('deletePageFromCache', page.hash) // -> Rebuild page tree - await WIKI.models.pages.rebuildTree() + // await WIKI.models.pages.rebuildTree() + WIKI.models.pages.rebuildTreeBG() // -> Rename in Search Index const pageContents = await WIKI.models.pages.query().findById(page.id).select('render') @@ -814,7 +819,8 @@ module.exports = class Page extends Model { WIKI.events.outbound.emit('deletePageFromCache', page.hash) // -> Rebuild page tree - await WIKI.models.pages.rebuildTree() + // await WIKI.models.pages.rebuildTree() + WIKI.models.pages.rebuildTreeBG() // -> Delete from Search Index await WIKI.data.searchEngine.deleted(page) @@ -927,6 +933,43 @@ module.exports = class Page extends Model { return rebuildJob.finished } + /** + * Rebuild page tree for new/updated/deleted page in the + * background. Multiple calls to this function will + * queue up a single pending job if a rebuild is already + * in progress, and that queued up job will start when + * the current rebuild ends. In other words, calling this + * function will ensure at least one rebuild will start + * in the near future as soon as no rebuilds are running, + * but 50 quick calls to this routine will only cause + * one rebuild to kick off when possible. + * + * @returns {Promise} Promise with no value + */ + static async rebuildTreeBG() { + if (this.rebuildIsRunning) { + this.rebuildIsQueued = true + return + } + this.rebuildIsRunning = true + const rebuildJob = await WIKI.scheduler.registerJob({ + name: 'rebuild-tree', + immediate: true, + worker: true + }) + await rebuildJob.finished + while (this.rebuildIsQueued) { + this.rebuildIsQueued = false + const rebuildJob = await WIKI.scheduler.registerJob({ + name: 'rebuild-tree', + immediate: true, + worker: true + }) + await rebuildJob.finished + } + this.rebuildIsRunning = false + } + /** * Trigger the rendering of a page *