From 03045afc6fabfa78a655c6f018a13b78919d3ebb Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Mon, 6 May 2024 18:20:52 +0200 Subject: [PATCH 1/7] Exit on disabled database --- packages/sdk-core/src/modules/database/BacktraceDatabase.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index 3709bf9c..0f35ae9e 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -206,6 +206,9 @@ export class BacktraceDatabase implements BacktraceModule { const records = [...this._databaseRecordContext.getBucket(bucketIndex)]; for (const record of records) { + if (!this.enabled) { + return; + } if (record.locked) { continue; } From 389ac5012beda75195194bb4432db3fc8c5a92ef Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Tue, 7 May 2024 12:17:25 +0200 Subject: [PATCH 2/7] Add abortsignlar support to the send method --- .../sdk-core/src/modules/database/BacktraceDatabase.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index 0f35ae9e..fc0890b5 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -18,6 +18,8 @@ export class BacktraceDatabase implements BacktraceModule { return this._enabled; } + private readonly _abortController = new AbortController(); + private readonly _databaseRecordContext: BacktraceDatabaseContext; private readonly _storageProviders: BacktraceDatabaseStorageProvider[] = []; @@ -158,6 +160,7 @@ export class BacktraceDatabase implements BacktraceModule { public dispose() { this._enabled = false; clearInterval(this._intervalId); + this._abortController.abort(); } /** @@ -214,7 +217,11 @@ export class BacktraceDatabase implements BacktraceModule { } try { record.locked = true; - const result = await this._requestHandler.send(record.data, record.attachments); + const result = await this._requestHandler.send( + record.data, + record.attachments, + this._abortController.signal, + ); if (result.status === 'Ok') { this.remove(record); continue; From e06348ea68253818ed3a8a89c44cb23f78dbf965 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Tue, 7 May 2024 12:22:55 +0200 Subject: [PATCH 3/7] Abort controller comment --- packages/sdk-core/src/modules/database/BacktraceDatabase.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index fc0890b5..268ec959 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -18,6 +18,10 @@ export class BacktraceDatabase implements BacktraceModule { return this._enabled; } + /** + * Abort controller to cancel asynchronous database operations when + * the database is being disabled by the user. + */ private readonly _abortController = new AbortController(); private readonly _databaseRecordContext: BacktraceDatabaseContext; From 12913c37c6d490967b6e0c173bf03f2a2d13d57a Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Tue, 7 May 2024 12:57:50 +0200 Subject: [PATCH 4/7] Use abort signal in flush/send method --- .../src/modules/database/BacktraceDatabase.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index 268ec959..2c88fe7c 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -1,3 +1,4 @@ +import { anySignal, AbortController } from '../../common/AbortController'; import { IdGenerator } from '../../common/IdGenerator'; import { TimeHelper } from '../../common/TimeHelper'; import { BacktraceAttachment } from '../../model/attachment'; @@ -196,9 +197,9 @@ export class BacktraceDatabase implements BacktraceModule { * Sends all records available in the database to Backtrace and removes them * no matter if the submission process was successful or not. */ - public async flush() { + public async flush(abortSignal?: AbortSignal) { const start = TimeHelper.now(); - await this.send(); + await this.send(abortSignal); const records = this.get().filter((n) => n.timestamp <= start); for (const record of records) { this.remove(record); @@ -207,13 +208,14 @@ export class BacktraceDatabase implements BacktraceModule { /** * Sends all records available in the database to Backtrace. */ - public async send() { + public async send(abortSignal?: AbortSignal) { for (let bucketIndex = 0; bucketIndex < this._databaseRecordContext.bucketCount; bucketIndex++) { // make a copy of records to not update the array after each remove const records = [...this._databaseRecordContext.getBucket(bucketIndex)]; - + const signal = anySignal(abortSignal, this._abortController.signal); for (const record of records) { if (!this.enabled) { + signal.throwIfAborted(); return; } if (record.locked) { @@ -221,11 +223,7 @@ export class BacktraceDatabase implements BacktraceModule { } try { record.locked = true; - const result = await this._requestHandler.send( - record.data, - record.attachments, - this._abortController.signal, - ); + const result = await this._requestHandler.send(record.data, record.attachments, signal); if (result.status === 'Ok') { this.remove(record); continue; From b8d03955fa6739ea48dc6c302da82e94e4d3e949 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Tue, 7 May 2024 14:11:49 +0200 Subject: [PATCH 5/7] Return instead of throwIfAborted --- packages/sdk-core/src/modules/database/BacktraceDatabase.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index 2c88fe7c..79a13396 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -1,4 +1,4 @@ -import { anySignal, AbortController } from '../../common/AbortController'; +import { AbortController, anySignal } from '../../common/AbortController'; import { IdGenerator } from '../../common/IdGenerator'; import { TimeHelper } from '../../common/TimeHelper'; import { BacktraceAttachment } from '../../model/attachment'; @@ -205,17 +205,19 @@ export class BacktraceDatabase implements BacktraceModule { this.remove(record); } } + /** * Sends all records available in the database to Backtrace. + * @param abortSignal optional abort signal to cancel sending requests */ public async send(abortSignal?: AbortSignal) { for (let bucketIndex = 0; bucketIndex < this._databaseRecordContext.bucketCount; bucketIndex++) { // make a copy of records to not update the array after each remove const records = [...this._databaseRecordContext.getBucket(bucketIndex)]; const signal = anySignal(abortSignal, this._abortController.signal); + for (const record of records) { if (!this.enabled) { - signal.throwIfAborted(); return; } if (record.locked) { From 456e45ef406e839374d2c54547c311e73dad0956 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Tue, 7 May 2024 14:12:44 +0200 Subject: [PATCH 6/7] Abort signal comment in the database definition --- packages/sdk-core/src/modules/database/BacktraceDatabase.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index 79a13396..4b158eaf 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -196,6 +196,7 @@ export class BacktraceDatabase implements BacktraceModule { /** * Sends all records available in the database to Backtrace and removes them * no matter if the submission process was successful or not. + * @param abortSignal optional abort signal to cancel sending requests */ public async flush(abortSignal?: AbortSignal) { const start = TimeHelper.now(); @@ -215,7 +216,7 @@ export class BacktraceDatabase implements BacktraceModule { // make a copy of records to not update the array after each remove const records = [...this._databaseRecordContext.getBucket(bucketIndex)]; const signal = anySignal(abortSignal, this._abortController.signal); - + for (const record of records) { if (!this.enabled) { return; From e546d7e5b92a0bea85d6efd8635768e2b71fd3b0 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Tue, 7 May 2024 14:30:30 +0200 Subject: [PATCH 7/7] Verify abort signal in the loop --- packages/sdk-core/src/modules/database/BacktraceDatabase.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index 4b158eaf..1db75262 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -203,6 +203,9 @@ export class BacktraceDatabase implements BacktraceModule { await this.send(abortSignal); const records = this.get().filter((n) => n.timestamp <= start); for (const record of records) { + if (abortSignal?.aborted) { + return; + } this.remove(record); } }