Skip to content

Commit 0300101

Browse files
eliranek1Eliran Eretz-Kedosha
andauthored
Expose DB Corrupt Error and Rethrow Errors (#82)
* rethrow errors * fixing uts * fixing pr feedback --------- Co-authored-by: Eliran Eretz-Kedosha <eliraneretz-kedosha@Elirans-Laptop.local>
1 parent d113496 commit 0300101

6 files changed

Lines changed: 1237 additions & 563 deletions

File tree

src/InMemoryProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ class InMemoryIndex extends DbIndexFTSFromRangeQueries {
863863
);
864864
});
865865
if (isError(keys)) {
866-
return Promise.reject(void 0);
866+
return Promise.reject(keys);
867867
}
868868
return Promise.resolve(keys);
869869
}

src/IndexedDbProvider.ts

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export class IndexedDbProvider extends DbProvider {
192192
{ dbName }
193193
);
194194
}
195-
this.logWriter.log(`Wiping db success`, { dbName });
195+
this.logWriter.log(`Wiping db completed`, { dbName });
196196
}
197197

198198
this._lockHelper = new TransactionLockHelper(schema, true);
@@ -208,12 +208,34 @@ export class IndexedDbProvider extends DbProvider {
208208
upgradeScenarioStartTime: 0,
209209
};
210210

211+
dbOpen.onblocked = () => {
212+
this.logWriter.error(
213+
`Database open is blocked by an existing connection that hasn't closed. ` +
214+
`The open request will not proceed until all other connections are closed.`,
215+
{ dbName }
216+
);
217+
};
218+
211219
dbOpen.onupgradeneeded = (event) => {
220+
const dataLoss = event.dataLoss;
221+
const dataLossMessage = event.dataLossMessage;
222+
223+
if (dataLoss === "total") {
224+
this.logWriter.error(
225+
`IndexedDB reported total data loss during upgrade: ${
226+
dataLossMessage || "(no message)"
227+
}`,
228+
{ dbName }
229+
);
230+
}
231+
212232
upgradeMetadata = {
213233
oldVersion: event.oldVersion,
214234
newVersion: schema.version,
215235
upgradeScenarioStartTime: Date.now(),
216236
upgradeStartTimePerformanceMarker: performance.now(),
237+
dataLoss: dataLoss,
238+
dataLossMessage: dataLossMessage,
217239
};
218240

219241
const db: IDBDatabase = dbOpen.result;
@@ -490,6 +512,7 @@ export class IndexedDbProvider extends DbProvider {
490512
`Error when iterating over cursor on idb index, message: ${err?.message}`,
491513
{ storeName: storeSchema.name }
492514
);
515+
throw err;
493516
}
494517
)
495518
);
@@ -528,6 +551,14 @@ export class IndexedDbProvider extends DbProvider {
528551
}
529552

530553
this._db = db;
554+
this._db.onversionchange = (event: IDBVersionChangeEvent) => {
555+
this.logWriter.warn(
556+
`Database version change requested by another connection ` +
557+
`(oldVersion: ${event.oldVersion}, newVersion: ${event.newVersion}). ` +
558+
`Keeping this connection open; the requesting connection will be blocked.`,
559+
{ dbName }
560+
);
561+
};
531562
this._db.onclose = (event: Event) => {
532563
if (this._handleOnClose) {
533564
// instantiate payload
@@ -566,9 +597,12 @@ export class IndexedDbProvider extends DbProvider {
566597
isCopyRequired: false,
567598
upgradeSteps,
568599
...upgradeMetadata,
569-
errorName: err?.name || "Unknown",
570-
errorMessage:
571-
err?.message || "Unknown error occurred during upgrade",
600+
errorName: err?.target?.error?.name || err?.name || "Unknown",
601+
errorMessage: err
602+
? `${
603+
err?.target?.error?.message || err?.message || "Unknown error"
604+
} (name: ${err?.target?.error?.name || err?.name || "Unknown"})`
605+
: "Unknown error occurred during upgrade",
572606
});
573607
}
574608

@@ -582,7 +616,9 @@ export class IndexedDbProvider extends DbProvider {
582616
}
583617
}
584618
this.logWriter.error(
585-
`Error opening db, message: ${err?.message}, name: ${err?.name}`,
619+
`Error opening db, message: ${
620+
err?.target?.error?.message || err?.message || "Unknown error"
621+
}, name: ${err?.target?.error?.name || err?.name || "Unknown"}`,
586622
{
587623
dbName,
588624
}
@@ -623,6 +659,13 @@ export class IndexedDbProvider extends DbProvider {
623659
}
624660

625661
return new Promise((resolve, reject) => {
662+
trans.onblocked = () => {
663+
this.logWriter.error(
664+
`Database deletion is blocked by an existing connection that hasn't closed. ` +
665+
`The delete request will not proceed until all other connections are closed.`,
666+
{ dbName: this._dbName }
667+
);
668+
};
626669
trans.onsuccess = () => {
627670
resolve(void 0);
628671
};
@@ -734,9 +777,10 @@ export class IndexedDbTransaction implements DbTransaction {
734777
};
735778

736779
this._trans.onerror = () => {
737-
history.push(
738-
"error-" + (this._trans.error ? this._trans.error.message : "")
739-
);
780+
const errorDetail = this._trans.error
781+
? `${this._trans.error.name}: ${this._trans.error.message}`
782+
: "Unknown error";
783+
history.push("error-" + errorDetail);
740784

741785
if (history.length > 1) {
742786
this.logWriter.warn(
@@ -754,23 +798,19 @@ export class IndexedDbTransaction implements DbTransaction {
754798
lockHelper.transactionFailed(
755799
this._transToken,
756800
new Error(
757-
"IndexedDbTransaction OnError" +
758-
(this._trans.error?.name !== undefined
759-
? ", ErrorName: " + this._trans.error.name
760-
: "") +
761-
(this._trans.error?.message !== undefined
762-
? ", ErrorMessage: " + this._trans.error.message
763-
: "") +
801+
"IndexedDbTransaction OnError: " +
802+
errorDetail +
764803
", History: " +
765804
history.join(",")
766805
)
767806
);
768807
};
769808

770809
this._trans.onabort = () => {
771-
history.push(
772-
"abort-" + (this._trans.error ? this._trans.error.message : "")
773-
);
810+
const errorDetail = this._trans.error
811+
? `${this._trans.error.name}: ${this._trans.error.message}`
812+
: "Unknown error";
813+
history.push("abort-" + errorDetail);
774814

775815
if (history.length > 1) {
776816
this.logWriter.warn(
@@ -788,13 +828,8 @@ export class IndexedDbTransaction implements DbTransaction {
788828
lockHelper.transactionFailed(
789829
this._transToken,
790830
new Error(
791-
"IndexedDbTransaction Aborted" +
792-
(this._trans.error?.name !== undefined
793-
? ", ErrorName: " + this._trans.error.name
794-
: "") +
795-
(this._trans.error?.message !== undefined
796-
? ", ErrorMessage: " + this._trans.error.message
797-
: "") +
831+
"IndexedDbTransaction Aborted, Error: " +
832+
errorDetail +
798833
", History: " +
799834
history.join(",")
800835
)
@@ -1161,7 +1196,7 @@ class IndexedDbStore implements DbStore {
11611196
highRangeExclusive
11621197
)
11631198
.then((keys) => {
1164-
this.remove(keys);
1199+
return this.remove(keys);
11651200
});
11661201
}
11671202

src/ObjectStoreProvider.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ export type UpgradeMetadata = {
111111
newVersion: number;
112112
upgradeScenarioStartTime: number;
113113
upgradeStartTimePerformanceMarker: number;
114+
/** Non-standard Chromium extension: "none" or "total". Indicates whether data was lost during upgrade. */
115+
dataLoss?: "none" | "total";
116+
/** Non-standard Chromium extension: message describing the data loss, if any. */
117+
dataLossMessage?: string;
114118
};
115119

116120
export type UpgradeDetails = UpgradeMetadata & {

0 commit comments

Comments
 (0)