Files
firebase-ios-sdk/Firestore/Source/Local/FSTMutationQueue.h
T
Greg Soltis 16a5210b3c Merging the LRU branch (#1600)
* Switch to reference delegates for garbage collection (#1410)

* Bump sequence number on resume token refresh

* Style

* Fix comment formatting

* Add FSTReferenceDelegate definition and documentation

* Add methods to return nil for delegates, wire up inMemoryPins

* Add hook for removing a reference

* Start work on reference delegates

* Fix up tests to support adding documents at a sequence number

* Implement removing references

* Remove from target when dropped from local view

* Fix warning

* Add hooks for removal from mutation queue

* Add hooks for limbo document updates

* Style

* Drop commented-out code

* Fixup after merging master

* Start importing delegate implementations

* Memory LRU tests pass

* Make memory lru work, start fixing up lru tests. All with hidden sequence numbers

* Most LRU tests passing w/ memory

* Big LRU test passes w/ memory

* Leveldb LRU tests pass

* All passing except local store tests

* All tests pass

* Fix localstore tests

* Revert removeQueryData change

* Remove collectGarbage calls

* Remove NoOp GC

* More cleanup

* Refactor FSTHelpers

* Cleanup and commenting

* Comments and cleanup

* Comments

* Drop nullable for reference delegates, and old persistence method on spec tests

* Fix missing sequence bump, remove unneeded targetID

* Style

* Drop commented-out code

* Satisfy the linters and copyrighters, etc.

* Drop more commented-out code

* Fix import -> include, NSUInteger -> int

* Start work on test comments

* FSTDocumentKey -> DocumentKey

* Sample of LRU test refactor (#1424)

* Sample of test refactor

* Drop errant 'struct' keyword

* More test refactoring

* Make gc a member variable too

* Tests refactored to use member variables

* Assign delegates procedurally, rather than passing in a block

* Fix up FSTLevelDB a little

* listens -> listenTargets

* Rename GCEnabled

* remove isSentinel

* reword comment

* Add case for non-eager GC to test

* Style

* Cleaning the lint trap

* Clean up LRU tests (#1433)

* Add copious helpers and some docs to lru tests

* Style

* Method name refactor, add comment

* Drop FSTGarbageCollector and FSTEagerGarbageCollector (#1440)

* Drop FSTGarbageCollector and FSTEagerGarbageCollector

* Drop unused containsKey from FSTLevelDBMutationQueue

* Style

* Include sequence number in FSTQueryData hash and isEqual (#1568)

* Include sequence number in FSTQueryData hash and isEqual methods

* Style

* Switch to util::Hash

* Fix preserving query cache metadata (#1569)

* Add failing test

* Move the restart tests to the leveldb test suite

* Style

* Add new persistence test helper

* Fix test failure

* Review feedback

* Style
2018-07-27 13:58:11 -07:00

165 lines
6.5 KiB
Objective-C

/*
* Copyright 2017 Google
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#import <Foundation/Foundation.h>
#import "Firestore/Source/Core/FSTTypes.h"
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
#include "Firestore/core/src/firebase/firestore/model/document_key_set.h"
@class FSTMutation;
@class FSTMutationBatch;
@class FSTQuery;
@class FIRTimestamp;
NS_ASSUME_NONNULL_BEGIN
#pragma mark - FSTMutationQueue
/** A queue of mutations to apply to the remote store. */
@protocol FSTMutationQueue <NSObject>
/**
* Starts the mutation queue, performing any initial reads that might be required to establish
* invariants, etc.
*
* After starting, the mutation queue must guarantee that the highestAcknowledgedBatchID is less
* than nextBatchID. This prevents the local store from creating new batches that the mutation
* queue would consider erroneously acknowledged.
*/
- (void)start;
/** Returns YES if this queue contains no mutation batches. */
- (BOOL)isEmpty;
/**
* Returns the next FSTBatchID that will be assigned to a new mutation batch.
*
* Callers generally don't care about this value except to test that the mutation queue is
* properly maintaining the invariant that highestAcknowledgedBatchID is less than nextBatchID.
*/
- (FSTBatchID)nextBatchID;
/**
* Returns the highest batchID that has been acknowledged. If no batches have been acknowledged
* or if there are no batches in the queue this can return kFSTBatchIDUnknown.
*/
- (FSTBatchID)highestAcknowledgedBatchID;
/** Acknowledges the given batch. */
- (void)acknowledgeBatch:(FSTMutationBatch *)batch streamToken:(nullable NSData *)streamToken;
/** Returns the current stream token for this mutation queue. */
- (nullable NSData *)lastStreamToken;
/** Sets the stream token for this mutation queue. */
- (void)setLastStreamToken:(nullable NSData *)streamToken;
/** Creates a new mutation batch and adds it to this mutation queue. */
- (FSTMutationBatch *)addMutationBatchWithWriteTime:(FIRTimestamp *)localWriteTime
mutations:(NSArray<FSTMutation *> *)mutations;
/** Loads the mutation batch with the given batchID. */
- (nullable FSTMutationBatch *)lookupMutationBatch:(FSTBatchID)batchID;
/**
* Gets the first unacknowledged mutation batch after the passed in batchId in the mutation queue
* or nil if empty.
*
* @param batchID The batch to search after, or kFSTBatchIDUnknown for the first mutation in the
* queue.
*
* @return the next mutation or nil if there wasn't one.
*/
- (nullable FSTMutationBatch *)nextMutationBatchAfterBatchID:(FSTBatchID)batchID;
/** Gets all mutation batches in the mutation queue. */
// TODO(mikelehen): PERF: Current consumer only needs mutated keys; if we can provide that
// cheaply, we should replace this.
- (NSArray<FSTMutationBatch *> *)allMutationBatches;
/**
* Finds all mutations with a batchID less than or equal to the given batchID.
*
* Generally the caller should be asking for the next unacknowledged batchID and the number of
* acknowledged batches should be very small when things are functioning well.
*
* @param batchID The batch to search through.
*
* @return an NSArray containing all batches with matching batchIDs.
*/
// TODO(mcg): This should really return NSEnumerator and the caller should be adjusted to only
// loop through these once.
- (NSArray<FSTMutationBatch *> *)allMutationBatchesThroughBatchID:(FSTBatchID)batchID;
/**
* Finds all mutation batches that could @em possibly affect the given document key. Not all
* mutations in a batch will necessarily affect the document key, so when looping through the
* batch you'll need to check that the mutation itself matches the key.
*
* Note that because of this requirement implementations are free to return mutation batches that
* don't contain the document key at all if it's convenient.
*/
// TODO(mcg): This should really return an NSEnumerator
- (NSArray<FSTMutationBatch *> *)allMutationBatchesAffectingDocumentKey:
(const firebase::firestore::model::DocumentKey &)documentKey;
/**
* Finds all mutation batches that could @em possibly affect the given document keys. Not all
* mutations in a batch will necessarily affect each key, so when looping through the batches you'll
* need to check that the mutation itself matches the key.
*
* Note that because of this requirement implementations are free to return mutation batches that
* don't contain any of the given document keys at all if it's convenient.
*/
// TODO(mcg): This should really return an NSEnumerator
- (NSArray<FSTMutationBatch *> *)allMutationBatchesAffectingDocumentKeys:
(const firebase::firestore::model::DocumentKeySet &)documentKeys;
/**
* Finds all mutation batches that could affect the results for the given query. Not all
* mutations in a batch will necessarily affect the query, so when looping through the batch
* you'll need to check that the mutation itself matches the query.
*
* Note that because of this requirement implementations are free to return mutation batches that
* don't match the query at all if it's convenient.
*
* NOTE: A FSTPatchMutation does not need to include all fields in the query filter criteria in
* order to be a match (but any fields it does contain do need to match).
*/
// TODO(mikelehen): This should perhaps return an NSEnumerator, though I'm not sure we can avoid
// loading them all in memory.
- (NSArray<FSTMutationBatch *> *)allMutationBatchesAffectingQuery:(FSTQuery *)query;
/**
* Removes the given mutation batches from the queue. This is useful in two circumstances:
*
* + Removing applied mutations from the head of the queue
* + Removing rejected mutations from anywhere in the queue
*
* In both cases, the array of mutations to remove must be a contiguous range of batchIds. This is
* most easily accomplished by loading mutations with @a -allMutationBatchesThroughBatchID:.
*/
- (void)removeMutationBatches:(NSArray<FSTMutationBatch *> *)batches;
/** Performs a consistency check, examining the mutation queue for any leaks, if possible. */
- (void)performConsistencyCheck;
@end
NS_ASSUME_NONNULL_END