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:
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;