From 734d8fd7c96b083d5a020c58fe83e8acbc63adba Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 7 Nov 2023 15:20:58 +0100 Subject: [PATCH 1/3] fix: last changes have correct sequence id --- .../replication/changes/changes.controller.spec.ts | 14 ++++++++++++++ .../replication/changes/changes.controller.ts | 6 +++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/restricted-endpoints/replication/changes/changes.controller.spec.ts b/src/restricted-endpoints/replication/changes/changes.controller.spec.ts index f5fade7..9f154a6 100644 --- a/src/restricted-endpoints/replication/changes/changes.controller.spec.ts +++ b/src/restricted-endpoints/replication/changes/changes.controller.spec.ts @@ -171,6 +171,20 @@ describe('ChangesController', () => { ]); }); + it('should return last sequence number if no more matching changes were found', async () => { + // Not allowed to read anything + getRulesSpy.mockReturnValue([]); + getSpy.mockReturnValueOnce(createChanges([schoolDoc, childDoc], 0)); + + const lastSeq = docToChange(childDoc).seq; + + const res = await controller.changes('some-db', user, { limit: 3 }); + + expect(res.pending).toBe(0); + expect(res.last_seq).toBe(lastSeq); + expect(res.results).toEqual([]); + }); + it('should not return docs of deleted documents that still have other properties', async () => { const deletedWithoutProps: DatabaseDocument = { _id: 'School:deletedWithout', diff --git a/src/restricted-endpoints/replication/changes/changes.controller.ts b/src/restricted-endpoints/replication/changes/changes.controller.ts index 60d88ef..65060f1 100644 --- a/src/restricted-endpoints/replication/changes/changes.controller.ts +++ b/src/restricted-endpoints/replication/changes/changes.controller.ts @@ -52,8 +52,12 @@ export class ChangesController { // overflow changes of this request const discarded = Math.max(res.results.length - missing, 0); change.results.push(...res.results.slice(0, missing)); - if (change.results.length > 0) { + if (discarded > 0) { + // not all requested changes are used change.last_seq = change.results[change.results.length - 1].seq; + } else { + // all changes were used + change.last_seq = res.last_seq; } change.pending = res.pending + discarded; if ( From ab76c3d22fa2b838392afa23bfe64f5dbdf78460 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 7 Nov 2023 16:27:43 +0100 Subject: [PATCH 2/3] fix: reduce couchdb longpoll timeout to prevent errors --- src/permissions/rules/rules.service.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/permissions/rules/rules.service.ts b/src/permissions/rules/rules.service.ts index ef87bc6..f441c0c 100644 --- a/src/permissions/rules/rules.service.ts +++ b/src/permissions/rules/rules.service.ts @@ -41,14 +41,24 @@ export class RulesService { since: this.lastSeq, include_docs: true, doc_ids: JSON.stringify([Permission.DOC_ID]), + // requests somehow time out after 1 minute + timeout: 50000, }), ); + const before = new Date().getTime(); return getParams .pipe( - concatMap((params) => - this.couchdbService.get(db, '_changes', params), - ), + concatMap((params) => { + const date = new Date().getTime(); + const diff = (date - before) / 1000; + console.log(diff.toFixed(2), 'restarting'); + return this.couchdbService.get( + db, + '_changes', + params, + ); + }), catchError((err) => { console.error('LOAD RULES ERROR:', err); throw err; From 2f44f20688d170e419aba51ac42ce663933034c2 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 7 Nov 2023 22:04:16 +0100 Subject: [PATCH 3/3] removed logs --- src/permissions/rules/rules.service.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/permissions/rules/rules.service.ts b/src/permissions/rules/rules.service.ts index f441c0c..bf201ee 100644 --- a/src/permissions/rules/rules.service.ts +++ b/src/permissions/rules/rules.service.ts @@ -45,20 +45,12 @@ export class RulesService { timeout: 50000, }), ); - const before = new Date().getTime(); return getParams .pipe( - concatMap((params) => { - const date = new Date().getTime(); - const diff = (date - before) / 1000; - console.log(diff.toFixed(2), 'restarting'); - return this.couchdbService.get( - db, - '_changes', - params, - ); - }), + concatMap((params) => + this.couchdbService.get(db, '_changes', params), + ), catchError((err) => { console.error('LOAD RULES ERROR:', err); throw err;