From 352b790b6e292c0d921ad0231352d767fde53758 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Thu, 22 Mar 2018 17:31:16 -0700 Subject: Switch FSTLevelDBQueryCache to use transactions (#942) * Start work on leveldb transactions * Style * Working API. Not plumbed in yet * Move files into correct place * Wrangling file locations and associations * Tests pass * Add some comments * style * Fix copyright * Rewrite iterator internals to handle deletion-while-iterating. Also add tests for same * Switch to strings instead of slices * Style * More style fixes * Start switching writegroup over * Swap out write group tracking for transaction usage * Style * Response to feedback before updating docs * Style * Add comment * Initialize version_ * Satisfy the linter * Start switching writegroup over * Swap out write group tracking for transaction usage * Style * Checkpoint before implementing BatchDescription * Style * Initial plumbing for leveldb local parts * Add model::BatchId * Port leveldb_key.{h,cc} * Add string StartsWith * Add leveldb_key_test.cc to the project * Revert back to using leveldb::Slice for read/describe These operations universally operate on keys obtained from leveldb so it's actually unhelpful to force all the callers to make absl::string_views from them. * Everything passing * Drop unused function * Style * STart work on reads * Swap reads in queryCache to use transactions * Fix up tests of querycache * Drop commented out code * Cleanup * Style * Fix up for passing tests * style * Renaming * Style * Start work on ToString for transactions * Add ToString() method to LevelDbTransaction * Style * lint * Fix includes, drop runTransaction * current_transaction -> currentTransaction * LevelDbTransaction::NewIterator now returns a unique_ptr * Style * Revert addition of util::StartsWith * Add log line * Style * Add log line * Style * Add debug log line for commits, drop unused BatchDescription * Fix an include, but mostly try to trigger a travis build --- Firestore/Source/Local/FSTLocalStore.mm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'Firestore/Source/Local/FSTLocalStore.mm') diff --git a/Firestore/Source/Local/FSTLocalStore.mm b/Firestore/Source/Local/FSTLocalStore.mm index a5b85cd..f61a20f 100644 --- a/Firestore/Source/Local/FSTLocalStore.mm +++ b/Firestore/Source/Local/FSTLocalStore.mm @@ -31,6 +31,7 @@ #import "Firestore/Source/Local/FSTReferenceSet.h" #import "Firestore/Source/Local/FSTRemoteDocumentCache.h" #import "Firestore/Source/Local/FSTRemoteDocumentChangeBuffer.h" +#import "Firestore/Source/Local/FSTWriteGroup.h" #import "Firestore/Source/Model/FSTDocument.h" #import "Firestore/Source/Model/FSTDocumentDictionary.h" #import "Firestore/Source/Model/FSTDocumentKey.h" @@ -371,6 +372,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)notifyLocalViewChanges:(NSArray *)viewChanges { FSTReferenceSet *localViewReferences = self.localViewReferences; + FSTWriteGroup *group = [self.persistence startGroupWithAction:@"NotifyLocalViewChanges"]; for (FSTLocalViewChanges *view in viewChanges) { FSTQueryData *queryData = [self.queryCache queryDataForQuery:view.query]; FSTAssert(queryData, @"Local view changes contain unallocated query."); @@ -378,6 +380,7 @@ NS_ASSUME_NONNULL_BEGIN [localViewReferences addReferencesToKeys:view.addedKeys forID:targetID]; [localViewReferences removeReferencesToKeys:view.removedKeys forID:targetID]; } + [self.persistence commitGroup:group]; } - (nullable FSTMutationBatch *)nextMutationBatchAfterBatchID:(FSTBatchID)batchID { @@ -389,6 +392,7 @@ NS_ASSUME_NONNULL_BEGIN } - (FSTQueryData *)allocateQuery:(FSTQuery *)query { + FSTWriteGroup *group = [self.persistence startGroupWithAction:@"Allocate query"]; FSTQueryData *cached = [self.queryCache queryDataForQuery:query]; FSTTargetID targetID; FSTListenSequenceNumber sequenceNumber = [self.listenSequence next]; @@ -397,18 +401,14 @@ NS_ASSUME_NONNULL_BEGIN // TODO(mcg): freshen last accessed date? targetID = cached.targetID; } else { - FSTWriteGroup *group = [self.persistence startGroupWithAction:@"Allocate query"]; - targetID = _targetIDGenerator.NextId(); cached = [[FSTQueryData alloc] initWithQuery:query targetID:targetID listenSequenceNumber:sequenceNumber purpose:FSTQueryPurposeListen]; [self.queryCache addQueryData:cached group:group]; - - [self.persistence commitGroup:group]; } - + [self.persistence commitGroup:group]; // Sanity check to ensure that even when resuming a query it's not currently active. FSTBoxedTargetID *boxedTargetID = @(targetID); FSTAssert(!self.targetIDs[boxedTargetID], @"Tried to allocate an already allocated query: %@", @@ -448,20 +448,23 @@ NS_ASSUME_NONNULL_BEGIN } - (FSTDocumentKeySet *)remoteDocumentKeysForTarget:(FSTTargetID)targetID { - return [self.queryCache matchingKeysForTargetID:targetID]; + FSTWriteGroup *group = [self.persistence startGroupWithAction:@"RemoteDocumentKeysForTarget"]; + FSTDocumentKeySet *keySet = [self.queryCache matchingKeysForTargetID:targetID]; + [self.persistence commitGroup:group]; + return keySet; } - (void)collectGarbage { + FSTWriteGroup *group = [self.persistence startGroupWithAction:@"Garbage Collection"]; // Call collectGarbage regardless of whether isGCEnabled so the referenceSet doesn't continue to // accumulate the garbage keys. NSSet *garbage = [self.garbageCollector collectGarbage]; if (garbage.count > 0) { - FSTWriteGroup *group = [self.persistence startGroupWithAction:@"Garbage Collection"]; for (FSTDocumentKey *key in garbage) { [self.remoteDocumentCache removeEntryForKey:key group:group]; } - [self.persistence commitGroup:group]; } + [self.persistence commitGroup:group]; } /** -- cgit v1.2.3