aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firestore/Source/Local/FSTLocalStore.mm
diff options
context:
space:
mode:
authorGravatar Greg Soltis <gsoltis@google.com>2018-03-22 17:31:16 -0700
committerGravatar GitHub <noreply@github.com>2018-03-22 17:31:16 -0700
commit352b790b6e292c0d921ad0231352d767fde53758 (patch)
tree75a8c78fc35f846eb1f763ea3b664d6800850e2b /Firestore/Source/Local/FSTLocalStore.mm
parentc1c9fecb6f7e057817afca9f1e32d2abba3ecfe8 (diff)
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
Diffstat (limited to 'Firestore/Source/Local/FSTLocalStore.mm')
-rw-r--r--Firestore/Source/Local/FSTLocalStore.mm19
1 files changed, 11 insertions, 8 deletions
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<FSTLocalViewChanges *> *)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<FSTDocumentKey *> *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];
}
/**