From 30ecee483db90bdecb326b1365049a6996562d60 Mon Sep 17 00:00:00 2001 From: liuyi Date: Mon, 11 Dec 2023 09:17:49 +0000 Subject: [PATCH] fix(server): avoid updates persist forever (#5258) --- .../backend/server/src/modules/doc/manager.ts | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/packages/backend/server/src/modules/doc/manager.ts b/packages/backend/server/src/modules/doc/manager.ts index 57151bb760..aaac29f936 100644 --- a/packages/backend/server/src/modules/doc/manager.ts +++ b/packages/backend/server/src/modules/doc/manager.ts @@ -565,39 +565,40 @@ export class DocManager implements OnModuleInit, OnModuleDestroy { ...updates.map(u => u.blob) ); - await this.upsert(workspaceId, id, doc, last.seq); - if (snapshot) { - this.event.emit('snapshot.updated', { - id, - workspaceId, - previous: { - blob: snapshot.blob, - state: snapshot.state, - updatedAt: snapshot.updatedAt, - }, - }); - } - const done = await this.upsert(workspaceId, id, doc, last.seq); if (done) { + if (snapshot) { + this.event.emit('snapshot.updated', { + id, + workspaceId, + previous: { + blob: snapshot.blob, + state: snapshot.state, + updatedAt: snapshot.updatedAt, + }, + }); + } + this.logger.debug( `Squashed ${updates.length} updates for ${id} in workspace ${workspaceId}` ); - - await this.db.update.deleteMany({ - where: { - id, - workspaceId, - seq: { - in: updates.map(u => u.seq), - }, - }, - }); - - await this.updateCachedUpdatesCount(workspaceId, id, -updates.length); } + // always delete updates + // the upsert will return false if the state is not newer, so we don't need to worry about it + const { count } = await this.db.update.deleteMany({ + where: { + id, + workspaceId, + seq: { + in: updates.map(u => u.seq), + }, + }, + }); + + await this.updateCachedUpdatesCount(workspaceId, id, -count); + return doc; }