taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 04798ec39dde77796294ac6c20aed03cce9e7671
parent ca8f78122273540d133ee8b9612b375f7d7fa742
Author: Florian Dold <florian@dold.me>
Date:   Wed, 17 Jul 2024 01:26:55 +0200

idb: fix race condition in transaction abort

Diffstat:
Mpackages/idb-bridge/src/bridge-idb.ts | 12++++++++++--
Mpackages/taler-wallet-core/src/host-impl.node.ts | 12++++++++++--
Mpackages/taler-wallet-core/src/query.ts | 6+++++-
3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/packages/idb-bridge/src/bridge-idb.ts b/packages/idb-bridge/src/bridge-idb.ts @@ -2730,16 +2730,24 @@ export class BridgeIDBTransaction if (BridgeIDBFactory.enableTracing) { console.log("beginning backend transaction to process operation"); } - this._backendTransaction = await this._backend.beginTransaction( + const newBackendTx = await this._backend.beginTransaction( this._db._backendConnection, Array.from(this._scope), this.mode, ); if (BridgeIDBFactory.enableTracing) { console.log( - `started backend transaction (${this._backendTransaction.transactionCookie})`, + `started backend transaction (${newBackendTx.transactionCookie})`, ); } + if (this._aborted) { + // Probably there is a more elegant way to do this by aborting the + // beginTransaction call when the transaction was aborted. + // That would require changing the DB backend API. + this._backend.rollback(newBackendTx); + } else { + this._backendTransaction = newBackendTx; + } } if (!request._source) { diff --git a/packages/taler-wallet-core/src/host-impl.node.ts b/packages/taler-wallet-core/src/host-impl.node.ts @@ -108,14 +108,22 @@ async function makeFileDb( async function makeSqliteDb( args: DefaultNodeWalletArgs, ): Promise<MakeDbResult> { - BridgeIDBFactory.enableTracing = false; + if (process.env.TALER_WALLET_DBTRACING) { + BridgeIDBFactory.enableTracing = true; + } else { + BridgeIDBFactory.enableTracing = false; + } const imp = await createNodeSqlite3Impl(); const dbFilename = args.persistentStoragePath ?? ":memory:"; logger.info(`using database ${dbFilename}`); const myBackend = await createSqliteBackend(imp, { filename: dbFilename, }); - myBackend.enableTracing = false; + if (process.env.TALER_WALLET_DBTRACING) { + myBackend.enableTracing = true; + } else { + myBackend.enableTracing = false; + } if (process.env.TALER_WALLET_DBSTATS) { myBackend.trackStats = true; } diff --git a/packages/taler-wallet-core/src/query.ts b/packages/taler-wallet-core/src/query.ts @@ -77,7 +77,11 @@ export interface IndexOptions { unique?: boolean; } -const logExtra = true; +/** + * Log extra stuff that would be too verbose even + * on loglevel TRACE. + */ +const logExtra = false; let idbRequestPromId = 1;