Skip to content

Commit 1e714a8

Browse files
authored
fix: close default BulkWriter upon terminate. (#2276)
* fix: close default BulkWriter upon terminate. * fix test * fix test
1 parent 7056ba7 commit 1e714a8

File tree

4 files changed

+24
-13
lines changed

4 files changed

+24
-13
lines changed

dev/src/bulk-writer.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -399,13 +399,13 @@ export class BulkWriter {
399399
private _lastOp: Promise<void> = Promise.resolve();
400400

401401
/**
402-
* Whether this BulkWriter instance has started to close. Afterwards, no
403-
* new operations can be enqueued, except for retry operations scheduled by
404-
* the error handler.
402+
* When this BulkWriter instance has started to close, a flush promise is
403+
* saved. Afterwards, no new operations can be enqueued, except for retry
404+
* operations scheduled by the error handler.
405405
* @private
406406
* @internal
407407
*/
408-
private _closing = false;
408+
private _closePromise: Promise<void> | undefined;
409409

410410
/**
411411
* Rate limiter used to throttle requests as per the 500/50/5 rule.
@@ -921,11 +921,11 @@ export class BulkWriter {
921921
* ```
922922
*/
923923
close(): Promise<void> {
924-
this._verifyNotClosed();
925-
this.firestore._decrementBulkWritersCount();
926-
const flushPromise = this.flush();
927-
this._closing = true;
928-
return flushPromise;
924+
if (!this._closePromise) {
925+
this._closePromise = this.flush();
926+
this.firestore._decrementBulkWritersCount();
927+
}
928+
return this._closePromise;
929929
}
930930

931931
/**
@@ -934,7 +934,7 @@ export class BulkWriter {
934934
* @internal
935935
*/
936936
_verifyNotClosed(): void {
937-
if (this._closing) {
937+
if (this._closePromise) {
938938
throw new Error('BulkWriter has already been closed.');
939939
}
940940
}

dev/src/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1487,7 +1487,11 @@ export class Firestore implements firestore.Firestore {
14871487
*
14881488
* @return A Promise that resolves when the client is terminated.
14891489
*/
1490-
terminate(): Promise<void> {
1490+
async terminate(): Promise<void> {
1491+
if (this._bulkWriter) {
1492+
await this._bulkWriter.close();
1493+
this._bulkWriter = undefined;
1494+
}
14911495
if (this.registeredListenersCount > 0 || this.bulkWritersCount > 0) {
14921496
return Promise.reject(
14931497
'All onSnapshot() listeners must be unsubscribed, and all BulkWriter ' +

dev/system-test/firestore.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6967,7 +6967,11 @@ describe('BulkWriter class', () => {
69676967
writer = firestore.bulkWriter();
69686968
});
69696969

6970-
afterEach(() => verifyInstance(firestore));
6970+
afterEach(async () => {
6971+
await writer.close();
6972+
await verifyInstance(firestore);
6973+
await firestore.terminate();
6974+
});
69716975

69726976
it('has create() method', async () => {
69736977
const ref = randomCol.doc('doc1');
@@ -7131,6 +7135,7 @@ describe('BulkWriter class', () => {
71317135
});
71327136
await firestore.recursiveDelete(randomCol, bulkWriter);
71337137
expect(callbackCount).to.equal(6);
7138+
await bulkWriter.close();
71347139
});
71357140
});
71367141

dev/test/bulk-writer.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,9 @@ describe('BulkWriter', () => {
488488
expect(() => bulkWriter.create(doc, {})).to.throw(expected);
489489
expect(() => bulkWriter.update(doc, {})).to.throw(expected);
490490
expect(() => bulkWriter.flush()).to.throw(expected);
491-
expect(() => bulkWriter.close()).to.throw(expected);
491+
492+
// Calling close() multiple times is allowed.
493+
await bulkWriter.close();
492494
});
493495

494496
it('send writes to the same documents in the different batches', async () => {

0 commit comments

Comments
 (0)