From 281dcc754560cc3ffb699bfab83b4299e685c41c Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Sun, 19 Nov 2023 02:03:05 +0300 Subject: [PATCH] [bug] Add 'updatePresence' to fix closed and restored connection 'addPresence' conflict in the cluster (with delaying disconnect event) --- Common/config/default.json | 2 +- DocService/sources/DocsCoServer.js | 13 +++++++++++-- DocService/sources/baseConnector.js | 2 +- DocService/sources/editorDataMemory.js | 3 +++ DocService/sources/server.js | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Common/config/default.json b/Common/config/default.json index d9687c43..87c58102 100644 --- a/Common/config/default.json +++ b/Common/config/default.json @@ -212,7 +212,7 @@ "forcesave": 604800, "forcesaveLock": 5000, "saved": 3600, - "documentsCron": "0 */2 * * * *", + "documentsCron": "*/20 * * * * *", "files": 86400, "filesCron": "00 00 */1 * * *", "filesremovedatonce": 100, diff --git a/DocService/sources/DocsCoServer.js b/DocService/sources/DocsCoServer.js index b1add8fd..b6050950 100644 --- a/DocService/sources/DocsCoServer.js +++ b/DocService/sources/DocsCoServer.js @@ -472,6 +472,14 @@ function addPresence(ctx, conn, updateCunters) { } }); } +async function updatePresence(ctx, conn) { + if (editorData.updatePresence) { + return await editorData.updatePresence(ctx, conn.docId, conn.user.id); + } else { + //todo remove if after 7.6. code for backward compatibility, because redis in separate repo + return await editorData.addPresence(ctx, conn.docId, conn.user.id, utils.getConnectionInfoStr(conn)); + } +} function removePresence(ctx, conn) { return co(function* () { yield editorData.removePresence(ctx, conn.docId, conn.user.id); @@ -1732,6 +1740,7 @@ exports.install = function(server, callbackFunction) { const tenTokenEnableBrowser = ctx.getCfg('services.CoAuthoring.token.enable.browser', cfgTokenEnableBrowser); const tenForgottenFiles = ctx.getCfg('services.CoAuthoring.server.forgottenfiles', cfgForgottenFiles); + ctx.logger.info("Connection closed or timed out: reason = %s", reason); var userLocks, reconnected = false, bHasEditors, bHasChanges; var docId = conn.docId; if (null == docId) { @@ -1741,7 +1750,7 @@ exports.install = function(server, callbackFunction) { let participantsTimestamp; var tmpUser = conn.user; var isView = tmpUser.view; - ctx.logger.info("Connection closed or timed out: reason = %s", reason); + var isCloseCoAuthoringTmp = conn.isCloseCoAuthoring; if (reason) { //Notify that participant has gone @@ -3808,7 +3817,7 @@ exports.install = function(server, callbackFunction) { if (constants.CONN_CLOSED === conn.conn.readyState) { ctx.logger.error('expireDoc connection closed'); } - yield addPresence(ctx, conn, false); + yield updatePresence(ctx, conn); if (utils.isLiveViewer(conn)) { countLiveViewByShard++; tenant.countLiveViewByShard++; diff --git a/DocService/sources/baseConnector.js b/DocService/sources/baseConnector.js index 562bf994..92e17bd5 100644 --- a/DocService/sources/baseConnector.js +++ b/DocService/sources/baseConnector.js @@ -277,7 +277,7 @@ exports.getExpired = baseConnector.getExpired ?? function(ctx, maxCount, expireS utils.addSeconds(expireDate, -expireSeconds); const date = addSqlParam(expireDate, values); const count = addSqlParam(maxCount, values); - const sqlCommand = `SELECT * FROM ${cfgTableResult} WHERE last_open_date <= ${date}` + + const sqlCommand = `SELECT tenant, id FROM ${cfgTableResult} WHERE last_open_date <= ${date}` + ` AND NOT EXISTS(SELECT tenant, id FROM ${cfgTableChanges} WHERE ${cfgTableChanges}.tenant = ${cfgTableResult}.tenant AND ${cfgTableChanges}.id = ${cfgTableResult}.id LIMIT 1) LIMIT ${count};`; baseConnector.sqlQuery(ctx, sqlCommand, function(error, result) { if (error) { diff --git a/DocService/sources/editorDataMemory.js b/DocService/sources/editorDataMemory.js index bbcd0477..0951c40b 100644 --- a/DocService/sources/editorDataMemory.js +++ b/DocService/sources/editorDataMemory.js @@ -96,6 +96,9 @@ EditorData.prototype._checkAndUnlock = function(ctx, name, docId, fencingToken) EditorData.prototype.addPresence = function(ctx, docId, userId, userInfo) { return Promise.resolve(); }; +EditorData.prototype.updatePresence = function(ctx, docId, userId) { + return Promise.resolve(); +}; EditorData.prototype.removePresence = function(ctx, docId, userId) { return Promise.resolve(); }; diff --git a/DocService/sources/server.js b/DocService/sources/server.js index 6744a689..925f2085 100644 --- a/DocService/sources/server.js +++ b/DocService/sources/server.js @@ -67,7 +67,7 @@ const cfgTokenEnableRequestOutbox = config.get('services.CoAuthoring.token.enabl const cfgLicenseFile = config.get('license.license_file'); const cfgDownloadMaxBytes = config.get('FileConverter.converter.maxDownloadBytes'); -if (false) { +if (true) { var cluster = require('cluster'); cluster.schedulingPolicy = cluster.SCHED_RR if (cluster.isMaster) {