diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LruDelegate.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LruDelegate.java index 62db1e6fc69..2dd128c285e 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LruDelegate.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LruDelegate.java @@ -26,7 +26,7 @@ public interface LruDelegate { /** Enumerates all the targets in the QueryCache. */ void forEachTarget(Consumer consumer); - long getTargetCount(); + long getSequenceNumberCount(); /** Enumerates sequence numbers for documents not associated with a target. */ void forEachOrphanedDocumentSequenceNumber(Consumer consumer); diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LruGarbageCollector.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LruGarbageCollector.java index 722fc3df75a..b327bce0f11 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LruGarbageCollector.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/LruGarbageCollector.java @@ -109,7 +109,7 @@ public int getDocumentsRemoved() { /** Given a percentile of target to collect, returns the number of targets to collect. */ int calculateQueryCount(int percentile) { - long targetCount = delegate.getTargetCount(); + long targetCount = delegate.getSequenceNumberCount(); return (int) ((percentile / 100.0f) * targetCount); } @@ -216,15 +216,13 @@ private Results runGarbageCollection(SparseArray liveTargetIds) { int numDocumentsRemoved = removeOrphanedDocuments(upperBound); long removedDocumentsTs = System.currentTimeMillis(); - // TODO(gsoltis): post-compaction? - if (Logger.isDebugEnabled()) { String desc = "LRU Garbage Collection:\n"; desc += "\tCounted targets in " + (countedTargetsTs - startTs) + "ms\n"; desc += String.format( Locale.ROOT, - "\tDetermined least recently used %d sequence numbers in %dms", + "\tDetermined least recently used %d sequence numbers in %dms\n", sequenceNumbers, (foundUpperBoundTs - countedTargetsTs)); desc += diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/MemoryLruReferenceDelegate.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/MemoryLruReferenceDelegate.java index 56fc1df0d9d..6ff4cb74dcc 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/MemoryLruReferenceDelegate.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/MemoryLruReferenceDelegate.java @@ -82,8 +82,14 @@ public void forEachTarget(Consumer consumer) { } @Override - public long getTargetCount() { - return persistence.getQueryCache().getTargetCount(); + public long getSequenceNumberCount() { + long targetCount = persistence.getQueryCache().getTargetCount(); + long orphanedCount[] = new long[1]; + forEachOrphanedDocumentSequenceNumber( + sequenceNumber -> { + orphanedCount[0]++; + }); + return targetCount + orphanedCount[0]; } @Override diff --git a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/SQLiteLruReferenceDelegate.java b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/SQLiteLruReferenceDelegate.java index d846c08636a..d2823ac3990 100644 --- a/firebase-firestore/src/main/java/com/google/firebase/firestore/local/SQLiteLruReferenceDelegate.java +++ b/firebase-firestore/src/main/java/com/google/firebase/firestore/local/SQLiteLruReferenceDelegate.java @@ -70,8 +70,14 @@ public LruGarbageCollector getGarbageCollector() { } @Override - public long getTargetCount() { - return persistence.getQueryCache().getTargetCount(); + public long getSequenceNumberCount() { + long targetCount = persistence.getQueryCache().getTargetCount(); + long orphanedDocumentCount = + persistence + .query( + "SELECT COUNT(*) FROM (SELECT sequence_number FROM target_documents GROUP BY path HAVING COUNT(*) = 1 AND target_id = 0)") + .firstValue(row -> row.getLong(0)); + return targetCount + orphanedDocumentCount; } @Override