Skip to content

Commit e05386e

Browse files
Fail enablePersistence() if getHighestListenSequenceNumber fails
1 parent 3de5763 commit e05386e

File tree

5 files changed

+35
-18
lines changed

5 files changed

+35
-18
lines changed

packages/firestore/src/local/indexeddb_persistence.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,9 +306,9 @@ export class IndexedDbPersistence implements Persistence {
306306

307307
this.scheduleClientMetadataAndPrimaryLeaseRefreshes();
308308

309-
return this.simpleDb.runTransaction(
309+
return this.runTransaction(
310+
'getHighestListenSequenceNumber',
310311
'readonly',
311-
[DbTargetGlobal.store],
312312
txn => getHighestListenSequenceNumber(txn)
313313
);
314314
})

packages/firestore/src/local/indexeddb_schema.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,16 +231,19 @@ export class SchemaConverter implements SimpleDbSchemaConverter {
231231
const documentsStore = txn.store<DbRemoteDocumentKey, DbRemoteDocument>(
232232
DbRemoteDocument.store
233233
);
234+
const globalTargetStore = txn.store<DbTargetGlobalKey, DbTargetGlobal>(
235+
DbTargetGlobal.store
236+
);
234237

235-
return getHighestListenSequenceNumber(txn).next(currentSequenceNumber => {
238+
return globalTargetStore.get(DbTargetGlobal.key).next(metadata => {
236239
const writeSentinelKey = (
237240
path: ResourcePath
238241
): PersistencePromise<void> => {
239242
return documentTargetStore.put(
240243
new DbTargetDocument(
241244
0,
242245
encodeResourcePath(path),
243-
currentSequenceNumber
246+
metadata!.highestListenSequenceNumber!
244247
)
245248
);
246249
};

packages/firestore/src/local/indexeddb_target_cache.ts

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,7 @@ export class IndexedDbTargetCache implements TargetCache {
9090
getHighestSequenceNumber(
9191
transaction: PersistenceTransaction
9292
): PersistencePromise<ListenSequenceNumber> {
93-
return getHighestListenSequenceNumber(
94-
(transaction as IndexedDbTransaction).simpleDbTransaction
95-
);
93+
return getHighestListenSequenceNumber(transaction);
9694
}
9795

9896
setTargetsMetadata(
@@ -192,9 +190,7 @@ export class IndexedDbTargetCache implements TargetCache {
192190
private retrieveMetadata(
193191
transaction: PersistenceTransaction
194192
): PersistencePromise<DbTargetGlobal> {
195-
return retrieveMetadata(
196-
(transaction as IndexedDbTransaction).simpleDbTransaction
197-
);
193+
return retrieveMetadata(transaction);
198194
}
199195

200196
private saveMetadata(
@@ -423,20 +419,17 @@ function globalTargetStore(
423419
}
424420

425421
function retrieveMetadata(
426-
txn: SimpleDbTransaction
422+
txn: PersistenceTransaction
427423
): PersistencePromise<DbTargetGlobal> {
428-
const globalStore = SimpleDb.getStore<DbTargetGlobalKey, DbTargetGlobal>(
429-
txn,
430-
DbTargetGlobal.store
431-
);
424+
const globalStore = globalTargetStore(txn);
432425
return globalStore.get(DbTargetGlobal.key).next(metadata => {
433426
hardAssert(metadata !== null, 'Missing metadata row.');
434427
return metadata;
435428
});
436429
}
437430

438431
export function getHighestListenSequenceNumber(
439-
txn: SimpleDbTransaction
432+
txn: PersistenceTransaction
440433
): PersistencePromise<ListenSequenceNumber> {
441434
return retrieveMetadata(txn).next(
442435
targetGlobal => targetGlobal.highestListenSequenceNumber

packages/firestore/test/unit/local/indexeddb_persistence.test.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
* limitations under the License.
1616
*/
1717

18-
import { expect } from 'chai';
18+
import * as chaiAsPromised from 'chai-as-promised';
19+
20+
import { expect, use } from 'chai';
1921
import { Query } from '../../../src/core/query';
2022
import { SnapshotVersion } from '../../../src/core/snapshot_version';
2123
import {
@@ -74,6 +76,8 @@ import {
7476
TEST_SERIALIZER
7577
} from './persistence_test_helpers';
7678

79+
use(chaiAsPromised);
80+
7781
/* eslint-disable no-restricted-globals */
7882

7983
function withDb(
@@ -1165,6 +1169,22 @@ describe('IndexedDb: allowTabSynchronization', () => {
11651169
);
11661170
});
11671171

1172+
it('blocks start() when getHighestListenSequenceNumber() fails', async () => {
1173+
await withUnstartedCustomPersistence(
1174+
'clientA',
1175+
/* multiClient= */ false,
1176+
async db1 => {
1177+
db1.injectFailures = {
1178+
updateClientMetadataAndTryBecomePrimary: false,
1179+
getHighestListenSequenceNumber: true
1180+
};
1181+
await expect(db1.start()).to.eventually.be.rejected(
1182+
'IndexedDB transaction failed'
1183+
);
1184+
}
1185+
);
1186+
});
1187+
11681188
it('ignores intermittent IndexedDbTransactionError during lease refresh', async () => {
11691189
await withPersistence('clientA', async (db, _, queue) => {
11701190
db.injectFailures = { updateClientMetadataAndTryBecomePrimary: true };

packages/firestore/test/unit/specs/spec_test_runner.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1215,7 +1215,8 @@ export type PersistenceAction =
12151215
| 'Get target data'
12161216
| 'Get new document changes'
12171217
| 'Synchronize last document change read time'
1218-
| 'updateClientMetadataAndTryBecomePrimary';
1218+
| 'updateClientMetadataAndTryBecomePrimary'
1219+
| 'getHighestListenSequenceNumber';
12191220

12201221
/** Specifies failure or success for a list of database actions. */
12211222
export type SpecDatabaseFailures = Partial<

0 commit comments

Comments
 (0)