diff --git a/packages/firestore/src/local/indexeddb_persistence.ts b/packages/firestore/src/local/indexeddb_persistence.ts index 0fc3923f791..7a89c97d265 100644 --- a/packages/firestore/src/local/indexeddb_persistence.ts +++ b/packages/firestore/src/local/indexeddb_persistence.ts @@ -1075,8 +1075,23 @@ export class IndexedDbLruDelegate implements ReferenceDelegate, LruDelegate { this.garbageCollector = new LruGarbageCollector(this); } - getTargetCount(txn: PersistenceTransaction): PersistencePromise { - return this.db.getQueryCache().getQueryCount(txn); + getSequenceNumberCount( + txn: PersistenceTransaction + ): PersistencePromise { + const docCountPromise = this.orphanedDocmentCount(txn); + const targetCountPromise = this.db.getQueryCache().getQueryCount(txn); + return targetCountPromise.next(targetCount => + docCountPromise.next(docCount => targetCount + docCount) + ); + } + + private orphanedDocmentCount( + txn: PersistenceTransaction + ): PersistencePromise { + let orphanedCount = 0; + return this.forEachOrphanedDocumentSequenceNumber(txn, _ => { + orphanedCount++; + }).next(() => orphanedCount); } forEachTarget( diff --git a/packages/firestore/src/local/lru_garbage_collector.ts b/packages/firestore/src/local/lru_garbage_collector.ts index fb654e367ec..5797bc3b1ce 100644 --- a/packages/firestore/src/local/lru_garbage_collector.ts +++ b/packages/firestore/src/local/lru_garbage_collector.ts @@ -36,7 +36,9 @@ export interface LruDelegate { f: (target: QueryData) => void ): PersistencePromise; - getTargetCount(txn: PersistenceTransaction): PersistencePromise; + getSequenceNumberCount( + txn: PersistenceTransaction + ): PersistencePromise; /** * Enumerates sequence numbers for documents not associated with a target. @@ -146,7 +148,7 @@ export class LruGarbageCollector { txn: PersistenceTransaction, percentile: number ): PersistencePromise { - return this.delegate.getTargetCount(txn).next(targetCount => { + return this.delegate.getSequenceNumberCount(txn).next(targetCount => { return Math.floor(percentile / 100.0 * targetCount); }); } diff --git a/packages/firestore/src/local/memory_persistence.ts b/packages/firestore/src/local/memory_persistence.ts index 8db50889248..5efa0725674 100644 --- a/packages/firestore/src/local/memory_persistence.ts +++ b/packages/firestore/src/local/memory_persistence.ts @@ -317,8 +317,25 @@ export class MemoryLruDelegate implements ReferenceDelegate, LruDelegate { return this.persistence.getQueryCache().forEachTarget(txn, f); } - getTargetCount(txn: PersistenceTransaction): PersistencePromise { - return this.persistence.getQueryCache().getTargetCount(txn); + getSequenceNumberCount( + txn: PersistenceTransaction + ): PersistencePromise { + const docCountPromise = this.orphanedDocumentCount(txn); + const targetCountPromise = this.persistence + .getQueryCache() + .getTargetCount(txn); + return targetCountPromise.next(targetCount => + docCountPromise.next(docCount => targetCount + docCount) + ); + } + + private orphanedDocumentCount( + txn: PersistenceTransaction + ): PersistencePromise { + let orphanedCount = 0; + return this.forEachOrphanedDocumentSequenceNumber(txn, _ => { + orphanedCount++; + }).next(() => orphanedCount); } forEachOrphanedDocumentSequenceNumber(