From 5d38a3512d4a68f912f68e91093b39efc97f55f1 Mon Sep 17 00:00:00 2001 From: Greg Soltis Date: Mon, 26 Mar 2018 14:29:51 -0700 Subject: Running a transaction (#969) * 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 * STart work on reads * Swap reads in queryCache to use transactions * Start on remote documents * Transition mutation queue and remote documents to use transactions * Style * Make everything pass * Make everything pass * Make it compile * Style * Style * Revert name change, use DefaultReadOptions() * Style * Example of running a transaction with a lambda * Drop errant typo * Drop duplicate method declarations * replace usage of auto w/ decltype * Drop an unnecessary _Nullable. Add some nullability warning suppression * use absl::make_unique, handle void return type * Style * Wrap backing persistence and expectation of backing persistence for transaction runner into a method * More comments, trigger CI --- Firestore/Source/Local/FSTLevelDB.mm | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'Firestore/Source/Local/FSTLevelDB.mm') diff --git a/Firestore/Source/Local/FSTLevelDB.mm b/Firestore/Source/Local/FSTLevelDB.mm index 2edccb4..922c5b4 100644 --- a/Firestore/Source/Local/FSTLevelDB.mm +++ b/Firestore/Source/Local/FSTLevelDB.mm @@ -28,6 +28,7 @@ #import "Firestore/Source/Remote/FSTSerializerBeta.h" #import "Firestore/Source/Util/FSTAssert.h" #import "Firestore/Source/Util/FSTLogger.h" +#include "absl/memory/memory.h" #include "Firestore/core/src/firebase/firestore/auth/user.h" #include "Firestore/core/src/firebase/firestore/core/database_info.h" @@ -62,6 +63,7 @@ using leveldb::WriteOptions; @implementation FSTLevelDB { std::unique_ptr _transaction; + FSTTransactionRunner _transactionRunner; } /** @@ -79,10 +81,15 @@ using leveldb::WriteOptions; _directory = [directory copy]; _writeGroupTracker = [FSTWriteGroupTracker tracker]; _serializer = serializer; + _transactionRunner.SetBackingPersistence(self); } return self; } +- (const FSTTransactionRunner &)run { + return _transactionRunner; +} + + (NSString *)documentsDirectory { #if TARGET_OS_IPHONE NSArray *directories = @@ -222,9 +229,20 @@ using leveldb::WriteOptions; return [[FSTLevelDBRemoteDocumentCache alloc] initWithDB:self serializer:self.serializer]; } +- (void)startTransaction { + FSTAssert(_transaction == nullptr, @"Starting a transaction while one is already outstanding"); + _transaction = absl::make_unique(_ptr.get()); +} + +- (void)commitTransaction { + FSTAssert(_transaction != nullptr, @"Committing a transaction before one is started"); + _transaction->Commit(); + _transaction.reset(); +} + - (FSTWriteGroup *)startGroupWithAction:(NSString *)action { FSTAssert(_transaction == nullptr, @"Starting a transaction while one is already outstanding"); - _transaction = std::make_unique(_ptr.get()); + _transaction = absl::make_unique(_ptr.get()); return [self.writeGroupTracker startGroupWithAction:action transaction:_transaction.get()]; } -- cgit v1.2.3