From bc8b6284a64037b36ce0210c187191780f549b9f Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 15 Nov 2021 21:23:19 +0100 Subject: [PATCH 1/4] fix exporting root note, closes #2346 (cherry picked from commit 20a187fab976d47c4447b8ec3ee952dc3155e441) --- src/becca/entities/branch.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/becca/entities/branch.js b/src/becca/entities/branch.js index 6b2031ddb..6ac065c47 100644 --- a/src/becca/entities/branch.js +++ b/src/becca/entities/branch.js @@ -58,6 +58,9 @@ class Branch extends AbstractEntity { } init() { + this.becca.branches[this.branchId] = this; + this.becca.childParentToBranch[`${this.noteId}-${this.parentNoteId}`] = this; + if (this.branchId === 'root') { return; } @@ -76,9 +79,6 @@ class Branch extends AbstractEntity { if (!parentNote.children.includes(childNote)) { parentNote.children.push(childNote); } - - this.becca.branches[this.branchId] = this; - this.becca.childParentToBranch[`${this.noteId}-${this.parentNoteId}`] = this; } /** @returns {Note} */ From 7d64f6a7ddf77804dd1b9ed0ef73a849e220aed3 Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 16 Nov 2021 22:12:53 +0100 Subject: [PATCH 2/4] increment lastProcessedEntityChangeId correctly --- src/public/app/services/ws.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/public/app/services/ws.js b/src/public/app/services/ws.js index 9db9cfdf2..512096a02 100644 --- a/src/public/app/services/ws.js +++ b/src/public/app/services/ws.js @@ -181,9 +181,9 @@ async function consumeFrontendUpdateData() { for (const entityChange of nonProcessedEntityChanges) { processedEntityChangeIds.add(entityChange.id); - } - lastProcessedEntityChangeId = Math.max(lastProcessedEntityChangeId, allEntityChanges[allEntityChanges.length - 1].id); + lastProcessedEntityChangeId = Math.max(lastProcessedEntityChangeId, entityChange.id); + } } checkEntityChangeIdListeners(); From 298af217e91585026ab8b4d789fddaef18b73460 Mon Sep 17 00:00:00 2001 From: zadam Date: Wed, 17 Nov 2021 21:47:41 +0100 Subject: [PATCH 3/4] fix bug overwriting entity changes --- package.json | 2 +- src/services/entity_changes.js | 6 ++---- src/services/sync_update.js | 6 +++--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index b8ebf0c3a..1df452ebd 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ }, "devDependencies": { "cross-env": "7.0.3", - "electron": "13.6.1", + "electron": "13.6.2", "electron-builder": "22.13.1", "electron-packager": "15.4.0", "electron-rebuild": "3.2.3", diff --git a/src/services/entity_changes.js b/src/services/entity_changes.js index 4daefbe92..38fc34499 100644 --- a/src/services/entity_changes.js +++ b/src/services/entity_changes.js @@ -7,12 +7,10 @@ const becca = require("../becca/becca"); let maxEntityChangeId = 0; -function addEntityChange(origEntityChange, keepOriginalId = false) { +function addEntityChange(origEntityChange) { const ec = {...origEntityChange}; - if (!keepOriginalId) { - delete ec.id; - } + delete ec.id; ec.sourceId = ec.sourceId || cls.getSourceId() || sourceIdService.getCurrentSourceId(); ec.isSynced = ec.isSynced ? 1 : 0; diff --git a/src/services/sync_update.js b/src/services/sync_update.js index 7abc737b9..934517202 100644 --- a/src/services/sync_update.js +++ b/src/services/sync_update.js @@ -54,7 +54,7 @@ function updateNormalEntity(remoteEntityChange, entity) { sql.execute(`DELETE FROM ${remoteEntityChange.entityName} WHERE ${primaryKey} = ?`, remoteEntityChange.entityId); - entityChangesService.addEntityChange(remoteEntityChange, true); + entityChangesService.addEntityChange(remoteEntityChange); }); return true; @@ -71,7 +71,7 @@ function updateNormalEntity(remoteEntityChange, entity) { sql.transactional(() => { sql.replace(remoteEntityChange.entityName, entity); - entityChangesService.addEntityChange(remoteEntityChange, true); + entityChangesService.addEntityChange(remoteEntityChange); }); return true; @@ -86,7 +86,7 @@ function updateNoteReordering(entityChange, entity) { sql.execute("UPDATE branches SET notePosition = ? WHERE branchId = ?", [entity[key], key]); } - entityChangesService.addEntityChange(entityChange, true); + entityChangesService.addEntityChange(entityChange); }); return true; From d345b7ed5668015ee9581e65d6e535fac0ce7afb Mon Sep 17 00:00:00 2001 From: zadam Date: Wed, 17 Nov 2021 22:57:09 +0100 Subject: [PATCH 4/4] added entity changes check after sync check failure, fixed sync --- package-lock.json | 14 +++++++------- src/routes/api/sync.js | 8 +++++++- src/routes/routes.js | 1 + src/services/consistency_checks.js | 8 +++++++- src/services/sync.js | 13 ++++++++++++- 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3e737316c..72c9ddf43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "trilium", - "version": "0.48.4", + "version": "0.48.6", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2850,9 +2850,9 @@ } }, "electron": { - "version": "13.6.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.1.tgz", - "integrity": "sha512-rZ6Y7RberigruefQpWOiI4bA9ppyT88GQF8htY6N1MrAgal5RrBc+Mh92CcGU7zT9QO+XO3DarSgZafNTepffQ==", + "version": "13.6.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.2.tgz", + "integrity": "sha512-ZXx9t68yXftvNZVnQ7v2XHcnH+MPUF6LNStoz4MMXuWpkF9gq3qwjcYSqnbM4wiVkvWVHIyYvt1yemmStza9dQ==", "dev": true, "requires": { "@electron/get": "^1.0.1", @@ -2861,9 +2861,9 @@ }, "dependencies": { "@types/node": { - "version": "14.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.32.tgz", - "integrity": "sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==", + "version": "14.17.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz", + "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==", "dev": true } } diff --git a/src/routes/api/sync.js b/src/routes/api/sync.js index c927103e3..a928540d2 100644 --- a/src/routes/api/sync.js +++ b/src/routes/api/sync.js @@ -204,6 +204,11 @@ function queueSector(req) { entityChangesService.addEntityChangesForSector(entityName, sector); } +function checkEntityChanges() { + const consistencyChecks = require("../../services/consistency_checks"); + consistencyChecks.runEntityChangesChecks(); +} + module.exports = { testSync, checkSync, @@ -215,5 +220,6 @@ module.exports = { update, getStats, syncFinished, - queueSector + queueSector, + checkEntityChanges }; diff --git a/src/routes/routes.js b/src/routes/routes.js index 5785e0c60..bacc34601 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -294,6 +294,7 @@ function register(app) { route(GET, '/api/sync/changed', [auth.checkApiAuth], syncApiRoute.getChanged, apiResultHandler); route(PUT, '/api/sync/update', [auth.checkApiAuth], syncApiRoute.update, apiResultHandler); route(POST, '/api/sync/finished', [auth.checkApiAuth], syncApiRoute.syncFinished, apiResultHandler); + route(POST, '/api/sync/check-entity-changes', [auth.checkApiAuth], syncApiRoute.checkEntityChanges, apiResultHandler); route(POST, '/api/sync/queue-sector/:entityName/:sector', [auth.checkApiAuth], syncApiRoute.queueSector, apiResultHandler); route(GET, '/api/sync/stats', [], syncApiRoute.getStats, apiResultHandler); diff --git a/src/services/consistency_checks.js b/src/services/consistency_checks.js index 8f15f8188..f12f930e3 100644 --- a/src/services/consistency_checks.js +++ b/src/services/consistency_checks.js @@ -701,6 +701,11 @@ function runOnDemandChecks(autoFix) { consistencyChecks.runChecks(); } +function runEntityChangesChecks() { + const consistencyChecks = new ConsistencyChecks(true); + consistencyChecks.findEntityChangeIssues(); +} + sqlInit.dbReady.then(() => { setInterval(cls.wrap(runPeriodicChecks), 60 * 60 * 1000); @@ -709,5 +714,6 @@ sqlInit.dbReady.then(() => { }); module.exports = { - runOnDemandChecks + runOnDemandChecks, + runEntityChangesChecks }; diff --git a/src/services/sync.js b/src/services/sync.js index cd14cc2c0..1dd2b6937 100644 --- a/src/services/sync.js +++ b/src/services/sync.js @@ -149,7 +149,10 @@ async function pullChanges(syncContext) { sql.transactional(() => { for (const {entityChange, entity} of entityChanges) { - if (!sourceIdService.isLocalSourceId(entityChange.sourceId)) { + // FIXME: temporary fix + const existsAlready = !!sql.getValue("SELECT id FROM entity_changes WHERE entityName = ? AND entityId = ? AND utcDateChanged = ? AND hash = ?", [entityChange.entityName, entityChange.entityId, entityChange.utcDateChanged, entityChange.hash]); + + if (!existsAlready && !sourceIdService.isLocalSourceId(entityChange.sourceId)) { if (!atLeastOnePullApplied) { // send only for first ws.syncPullInProgress(); @@ -249,6 +252,14 @@ async function checkContentHash(syncContext) { const failedChecks = contentHashService.checkContentHashes(resp.entityHashes); + if (failedChecks.length > 0) { + // before requeuing sectors make sure the entity changes are correct + const consistencyChecks = require("./consistency_checks"); + consistencyChecks.runEntityChangesChecks(); + + await syncRequest(syncContext, 'POST', `/api/sync/check-entity-changes`); + } + for (const {entityName, sector} of failedChecks) { entityChangesService.addEntityChangesForSector(entityName, sector);