Skip to content

Commit 466880b

Browse files
author
Greg Soltis
authored
Continue work on ReferenceSet (#2213)
* Migrate FSTDocumentReference to C++ * Change SortedSet template parameter ordering Makes it easier to specify a comparator without specifying what the empty member of the underlying map is. * Migrate MemoryMutationQueue to C++ references by key * migrate.py * CMake * Finish porting ReferenceSet * Swap reference set implementation * Port MemoryQueryCache to use ported ReferenceSet * Port FSTReferenceSetTest * Port usage for limbo document refs * Port LRU and LocalStore usages * Remove FSTReferenceSet and FSTDocumentReference * Style * Add newline
1 parent 05f43db commit 466880b

28 files changed

+566
-570
lines changed

Firestore/Example/Firestore.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
/* Begin PBXBuildFile section */
2626
020AFD89BB40E5175838BB76 /* local_serializer_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F8043813A5D16963EC02B182 /* local_serializer_test.cc */; };
2727
0535C1B65DADAE1CE47FA3CA /* string_format_apple_test.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9CFD366B783AE27B9E79EE7A /* string_format_apple_test.mm */; };
28+
132E3483789344640A52F223 /* reference_set_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 132E32997D781B896672D30A /* reference_set_test.cc */; };
2829
132E3E53179DE287D875F3F2 /* FSTLevelDBTransactionTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 132E36BB104830BD806351AC /* FSTLevelDBTransactionTests.mm */; };
2930
132E3EE56C143B2C9ACB6187 /* FSTLevelDBBenchmarkTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 132E3BB3D5C42282B4ACFB20 /* FSTLevelDBBenchmarkTests.mm */; };
3031
1CAA9012B25F975D445D5978 /* strerror_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 358C3B5FE573B1D60A4F7592 /* strerror_test.cc */; };
@@ -102,7 +103,6 @@
102103
5492E0AC2021552D00B64F25 /* FSTMutationQueueTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0962021552C00B64F25 /* FSTMutationQueueTests.mm */; };
103104
5492E0AD2021552D00B64F25 /* FSTMemoryMutationQueueTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0972021552C00B64F25 /* FSTMemoryMutationQueueTests.mm */; };
104105
5492E0AE2021552D00B64F25 /* FSTLevelDBQueryCacheTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0982021552C00B64F25 /* FSTLevelDBQueryCacheTests.mm */; };
105-
5492E0AF2021552D00B64F25 /* FSTReferenceSetTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E09A2021552C00B64F25 /* FSTReferenceSetTests.mm */; };
106106
5492E0B12021552D00B64F25 /* FSTRemoteDocumentCacheTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E09C2021552D00B64F25 /* FSTRemoteDocumentCacheTests.mm */; };
107107
5492E0B92021555100B64F25 /* FSTDocumentKeyTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B22021555000B64F25 /* FSTDocumentKeyTests.mm */; };
108108
5492E0BA2021555100B64F25 /* FSTDocumentSetTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5492E0B32021555100B64F25 /* FSTDocumentSetTests.mm */; };
@@ -300,6 +300,7 @@
300300
11984BA0A99D7A7ABA5B0D90 /* Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS/Pods-Firestore_Example_iOS-Firestore_SwiftTests_iOS.release.xcconfig"; sourceTree = "<group>"; };
301301
1277F98C20D2DF0867496976 /* Pods-Firestore_IntegrationTests_iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Firestore_IntegrationTests_iOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Firestore_IntegrationTests_iOS/Pods-Firestore_IntegrationTests_iOS.debug.xcconfig"; sourceTree = "<group>"; };
302302
12F4357299652983A615F886 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
303+
132E32997D781B896672D30A /* reference_set_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reference_set_test.cc; sourceTree = "<group>"; };
303304
132E36BB104830BD806351AC /* FSTLevelDBTransactionTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTLevelDBTransactionTests.mm; sourceTree = "<group>"; };
304305
132E3BB3D5C42282B4ACFB20 /* FSTLevelDBBenchmarkTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTLevelDBBenchmarkTests.mm; sourceTree = "<group>"; };
305306
2A0CF41BA5AED6049B0BEB2C /* type_traits_apple_test.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; path = type_traits_apple_test.mm; sourceTree = "<group>"; };
@@ -389,7 +390,6 @@
389390
5492E0972021552C00B64F25 /* FSTMemoryMutationQueueTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTMemoryMutationQueueTests.mm; sourceTree = "<group>"; };
390391
5492E0982021552C00B64F25 /* FSTLevelDBQueryCacheTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTLevelDBQueryCacheTests.mm; sourceTree = "<group>"; };
391392
5492E0992021552C00B64F25 /* FSTPersistenceTestHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSTPersistenceTestHelpers.h; sourceTree = "<group>"; };
392-
5492E09A2021552C00B64F25 /* FSTReferenceSetTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTReferenceSetTests.mm; sourceTree = "<group>"; };
393393
5492E09C2021552D00B64F25 /* FSTRemoteDocumentCacheTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTRemoteDocumentCacheTests.mm; sourceTree = "<group>"; };
394394
5492E0B22021555000B64F25 /* FSTDocumentKeyTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDocumentKeyTests.mm; sourceTree = "<group>"; };
395395
5492E0B32021555100B64F25 /* FSTDocumentSetTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FSTDocumentSetTests.mm; sourceTree = "<group>"; };
@@ -768,6 +768,7 @@
768768
54995F6E205B6E12004EFFA0 /* leveldb_key_test.cc */,
769769
332485C4DCC6BA0DBB5E31B7 /* leveldb_util_test.cc */,
770770
F8043813A5D16963EC02B182 /* local_serializer_test.cc */,
771+
132E32997D781B896672D30A /* reference_set_test.cc */,
771772
);
772773
path = local;
773774
sourceTree = "<group>";
@@ -1112,7 +1113,6 @@
11121113
5492E08D2021552B00B64F25 /* FSTPersistenceTestHelpers.mm */,
11131114
5492E0952021552C00B64F25 /* FSTQueryCacheTests.h */,
11141115
5492E0892021552A00B64F25 /* FSTQueryCacheTests.mm */,
1115-
5492E09A2021552C00B64F25 /* FSTReferenceSetTests.mm */,
11161116
5492E0852021552A00B64F25 /* FSTRemoteDocumentCacheTests.h */,
11171117
5492E09C2021552D00B64F25 /* FSTRemoteDocumentCacheTests.mm */,
11181118
);
@@ -1907,7 +1907,6 @@
19071907
5492E0A22021552D00B64F25 /* FSTQueryCacheTests.mm in Sources */,
19081908
5492E064202154B900B64F25 /* FSTQueryListenerTests.mm in Sources */,
19091909
5492E068202154B900B64F25 /* FSTQueryTests.mm in Sources */,
1910-
5492E0AF2021552D00B64F25 /* FSTReferenceSetTests.mm in Sources */,
19111910
5492E0B12021552D00B64F25 /* FSTRemoteDocumentCacheTests.mm in Sources */,
19121911
5492E0C92021557E00B64F25 /* FSTRemoteEventTests.mm in Sources */,
19131912
5492E0C72021557E00B64F25 /* FSTSerializerBetaTests.mm in Sources */,
@@ -2001,6 +2000,7 @@
20012000
C80B10E79CDD7EF7843C321E /* type_traits_apple_test.mm in Sources */,
20022001
ABC1D7DE2023A05300BA84F0 /* user_test.cc in Sources */,
20032002
544129DE21C2DDC800EFB9CC /* write.pb.cc in Sources */,
2003+
132E3483789344640A52F223 /* reference_set_test.cc in Sources */,
20042004
);
20052005
runOnlyForDeploymentPostprocessing = 0;
20062006
};

Firestore/Example/Tests/Local/FSTLRUGarbageCollectorTests.mm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#import "Firestore/Source/Model/FSTMutation.h"
3232
#import "Firestore/Source/Util/FSTClasses.h"
3333
#include "Firestore/core/src/firebase/firestore/auth/user.h"
34+
#include "Firestore/core/src/firebase/firestore/local/reference_set.h"
3435
#include "Firestore/core/src/firebase/firestore/local/remote_document_cache.h"
3536
#include "Firestore/core/src/firebase/firestore/model/document_key_set.h"
3637
#include "Firestore/core/src/firebase/firestore/model/precondition.h"
@@ -42,6 +43,7 @@
4243
using firebase::firestore::auth::User;
4344
using firebase::firestore::local::LruParams;
4445
using firebase::firestore::local::LruResults;
46+
using firebase::firestore::local::ReferenceSet;
4547
using firebase::firestore::local::RemoteDocumentCache;
4648
using firebase::firestore::model::DocumentKey;
4749
using firebase::firestore::model::DocumentKeyHash;
@@ -65,6 +67,7 @@ @implementation FSTLRUGarbageCollectorTests {
6567
FSTLRUGarbageCollector *_gc;
6668
ListenSequenceNumber _initialSequenceNumber;
6769
User _user;
70+
ReferenceSet _additionalReferences;
6871
}
6972

7073
- (void)setUp {
@@ -85,6 +88,7 @@ - (BOOL)isTestBaseClass {
8588
- (void)newTestResourcesWithLruParams:(LruParams)lruParams {
8689
HARD_ASSERT(_persistence == nil, "Persistence already created");
8790
_persistence = [self newPersistenceWithLruParams:lruParams];
91+
[_persistence.referenceDelegate addInMemoryPins:&_additionalReferences];
8892
_queryCache = [_persistence queryCache];
8993
_documentCache = [_persistence remoteDocumentCache];
9094
_mutationQueue = [_persistence mutationQueueForUser:_user];

Firestore/Example/Tests/Local/FSTLevelDBMutationQueueTests.mm

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
#include "Firestore/core/src/firebase/firestore/auth/user.h"
3030
#include "Firestore/core/src/firebase/firestore/local/leveldb_key.h"
31+
#include "Firestore/core/src/firebase/firestore/local/reference_set.h"
3132
#include "Firestore/core/src/firebase/firestore/util/ordered_code.h"
3233
#include "absl/strings/string_view.h"
3334
#include "leveldb/db.h"
@@ -36,6 +37,7 @@
3637

3738
using firebase::firestore::auth::User;
3839
using firebase::firestore::local::LevelDbMutationKey;
40+
using firebase::firestore::local::ReferenceSet;
3941
using firebase::firestore::model::BatchId;
4042
using firebase::firestore::util::OrderedCode;
4143
using leveldb::DB;
@@ -68,11 +70,13 @@ @interface FSTLevelDBMutationQueueTests : FSTMutationQueueTests
6870

6971
@implementation FSTLevelDBMutationQueueTests {
7072
FSTLevelDB *_db;
73+
ReferenceSet _additionalReferences;
7174
}
7275

7376
- (void)setUp {
7477
[super setUp];
7578
_db = [FSTPersistenceTestHelpers levelDBPersistence];
79+
[_db.referenceDelegate addInMemoryPins:&_additionalReferences];
7680
self.mutationQueue = [_db mutationQueueForUser:User("user")];
7781
self.persistence = _db;
7882

Firestore/Example/Tests/Local/FSTLevelDBQueryCacheTests.mm

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@
2626
#import "Firestore/Example/Tests/Local/FSTQueryCacheTests.h"
2727

2828
#include "Firestore/core/include/firebase/firestore/timestamp.h"
29+
#include "Firestore/core/src/firebase/firestore/local/reference_set.h"
2930
#include "Firestore/core/src/firebase/firestore/model/database_id.h"
3031
#include "Firestore/core/src/firebase/firestore/model/resource_path.h"
3132
#include "Firestore/core/src/firebase/firestore/model/snapshot_version.h"
3233

3334
using firebase::Timestamp;
35+
using firebase::firestore::local::ReferenceSet;
3436
using firebase::firestore::model::DatabaseId;
3537
using firebase::firestore::model::ListenSequenceNumber;
3638
using firebase::firestore::model::ResourcePath;
@@ -48,13 +50,16 @@ @interface FSTLevelDBQueryCacheTests : FSTQueryCacheTests
4850
* FSTQueryCacheTests. This class is merely responsible for setting up and tearing down the
4951
* @a queryCache.
5052
*/
51-
@implementation FSTLevelDBQueryCacheTests
53+
@implementation FSTLevelDBQueryCacheTests {
54+
ReferenceSet _additionalReferences;
55+
}
5256

5357
- (void)setUp {
5458
[super setUp];
5559

5660
self.persistence = [FSTPersistenceTestHelpers levelDBPersistence];
5761
self.queryCache = [self.persistence queryCache];
62+
[self.persistence.referenceDelegate addInMemoryPins:&_additionalReferences];
5863
}
5964

6065
- (void)tearDown {

Firestore/Example/Tests/Local/FSTMemoryMutationQueueTests.mm

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
#import "Firestore/Example/Tests/Local/FSTPersistenceTestHelpers.h"
2323

2424
#include "Firestore/core/src/firebase/firestore/auth/user.h"
25+
#include "Firestore/core/src/firebase/firestore/local/reference_set.h"
2526

2627
using firebase::firestore::auth::User;
28+
using firebase::firestore::local::ReferenceSet;
2729

2830
@interface FSTMemoryMutationQueueTests : FSTMutationQueueTests
2931
@end
@@ -32,12 +34,15 @@ @interface FSTMemoryMutationQueueTests : FSTMutationQueueTests
3234
* The tests for FSTMemoryMutationQueue are performed on the FSTMutationQueue protocol in
3335
* FSTMutationQueueTests. This class is merely responsible for setting up the @a mutationQueue.
3436
*/
35-
@implementation FSTMemoryMutationQueueTests
37+
@implementation FSTMemoryMutationQueueTests {
38+
ReferenceSet _additionalReferences;
39+
}
3640

3741
- (void)setUp {
3842
[super setUp];
3943

4044
self.persistence = [FSTPersistenceTestHelpers eagerGCMemoryPersistence];
45+
[self.persistence.referenceDelegate addInMemoryPins:&_additionalReferences];
4146
self.mutationQueue = [self.persistence mutationQueueForUser:User("user")];
4247
}
4348

Firestore/Example/Tests/Local/FSTMemoryQueryCacheTests.mm

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
#import "Firestore/Example/Tests/Local/FSTPersistenceTestHelpers.h"
2222
#import "Firestore/Example/Tests/Local/FSTQueryCacheTests.h"
2323

24+
#include "Firestore/core/src/firebase/firestore/local/reference_set.h"
25+
26+
using firebase::firestore::local::ReferenceSet;
27+
2428
NS_ASSUME_NONNULL_BEGIN
2529

2630
@interface FSTMemoryQueryCacheTests : FSTQueryCacheTests
@@ -31,13 +35,16 @@ @interface FSTMemoryQueryCacheTests : FSTQueryCacheTests
3135
* FSTQueryCacheTests. This class is merely responsible for setting up and tearing down the
3236
* @a queryCache.
3337
*/
34-
@implementation FSTMemoryQueryCacheTests
38+
@implementation FSTMemoryQueryCacheTests {
39+
ReferenceSet _additionalReferences;
40+
}
3541

3642
- (void)setUp {
3743
[super setUp];
3844

3945
self.persistence = [FSTPersistenceTestHelpers eagerGCMemoryPersistence];
4046
self.queryCache = [self.persistence queryCache];
47+
[self.persistence.referenceDelegate addInMemoryPins:&_additionalReferences];
4148
}
4249

4350
- (void)tearDown {

Firestore/Example/Tests/Local/FSTQueryCacheTests.mm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#import "Firestore/Example/Tests/Util/FSTHelpers.h"
2727
#import "Firestore/third_party/Immutable/Tests/FSTImmutableSortedSet+Testing.h"
2828

29+
#include "Firestore/core/src/firebase/firestore/local/reference_set.h"
2930
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
3031
#include "Firestore/core/test/firebase/firestore/testutil/testutil.h"
3132

Firestore/Example/Tests/Local/FSTReferenceSetTests.mm

Lines changed: 0 additions & 88 deletions
This file was deleted.

Firestore/Source/Core/FSTSyncEngine.mm

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@
3030
#import "Firestore/Source/Local/FSTLocalViewChanges.h"
3131
#import "Firestore/Source/Local/FSTLocalWriteResult.h"
3232
#import "Firestore/Source/Local/FSTQueryData.h"
33-
#import "Firestore/Source/Local/FSTReferenceSet.h"
3433
#import "Firestore/Source/Model/FSTDocument.h"
3534
#import "Firestore/Source/Model/FSTDocumentSet.h"
3635
#import "Firestore/Source/Model/FSTMutationBatch.h"
3736
#import "Firestore/Source/Remote/FSTRemoteEvent.h"
3837

3938
#include "Firestore/core/src/firebase/firestore/auth/user.h"
4039
#include "Firestore/core/src/firebase/firestore/core/target_id_generator.h"
40+
#include "Firestore/core/src/firebase/firestore/local/reference_set.h"
4141
#include "Firestore/core/src/firebase/firestore/model/document_key.h"
4242
#include "Firestore/core/src/firebase/firestore/model/document_map.h"
4343
#include "Firestore/core/src/firebase/firestore/model/snapshot_version.h"
@@ -47,6 +47,7 @@
4747
using firebase::firestore::auth::HashUser;
4848
using firebase::firestore::auth::User;
4949
using firebase::firestore::core::TargetIdGenerator;
50+
using firebase::firestore::local::ReferenceSet;
5051
using firebase::firestore::model::BatchId;
5152
using firebase::firestore::model::DocumentKey;
5253
using firebase::firestore::model::DocumentKeySet;
@@ -157,9 +158,6 @@ @interface FSTSyncEngine ()
157158
@property(nonatomic, strong, readonly)
158159
NSMutableDictionary<NSNumber *, FSTQueryView *> *queryViewsByTarget;
159160

160-
/** Used to track any documents that are currently in limbo. */
161-
@property(nonatomic, strong, readonly) FSTReferenceSet *limboDocumentRefs;
162-
163161
@end
164162

165163
@implementation FSTSyncEngine {
@@ -183,6 +181,9 @@ @implementation FSTSyncEngine {
183181
std::map<TargetId, LimboResolution> _limboResolutionsByTarget;
184182

185183
User _currentUser;
184+
185+
/** Used to track any documents that are currently in limbo. */
186+
ReferenceSet _limboDocumentRefs;
186187
}
187188

188189
- (instancetype)initWithLocalStore:(FSTLocalStore *)localStore
@@ -195,7 +196,6 @@ - (instancetype)initWithLocalStore:(FSTLocalStore *)localStore
195196
_queryViewsByQuery = [NSMutableDictionary dictionary];
196197
_queryViewsByTarget = [NSMutableDictionary dictionary];
197198

198-
_limboDocumentRefs = [[FSTReferenceSet alloc] init];
199199
_targetIdGenerator = TargetIdGenerator::SyncEngineTargetIdGenerator();
200200
_currentUser = initialUser;
201201
}
@@ -468,10 +468,10 @@ - (void)removeAndCleanupQuery:(FSTQueryView *)queryView {
468468
[self.queryViewsByQuery removeObjectForKey:queryView.query];
469469
[self.queryViewsByTarget removeObjectForKey:@(queryView.targetID)];
470470

471-
DocumentKeySet limboKeys = [self.limboDocumentRefs referencedKeysForID:queryView.targetID];
472-
[self.limboDocumentRefs removeReferencesForID:queryView.targetID];
471+
DocumentKeySet limboKeys = _limboDocumentRefs.ReferencedKeys(queryView.targetID);
472+
_limboDocumentRefs.RemoveReferences(queryView.targetID);
473473
for (const DocumentKey &key : limboKeys) {
474-
if (![self.limboDocumentRefs containsKey:key]) {
474+
if (!_limboDocumentRefs.ContainsKey(key)) {
475475
// We removed the last reference for this key.
476476
[self removeLimboTargetForKey:key];
477477
}
@@ -531,14 +531,14 @@ - (void)updateTrackedLimboDocumentsWithChanges:(NSArray<FSTLimboDocumentChange *
531531
for (FSTLimboDocumentChange *limboChange in limboChanges) {
532532
switch (limboChange.type) {
533533
case FSTLimboDocumentChangeTypeAdded:
534-
[self.limboDocumentRefs addReferenceToKey:limboChange.key forID:targetID];
534+
_limboDocumentRefs.AddReference(limboChange.key, targetID);
535535
[self trackLimboChange:limboChange];
536536
break;
537537

538538
case FSTLimboDocumentChangeTypeRemoved:
539539
LOG_DEBUG("Document no longer in limbo: %s", limboChange.key.ToString());
540-
[self.limboDocumentRefs removeReferenceToKey:limboChange.key forID:targetID];
541-
if (![self.limboDocumentRefs containsKey:limboChange.key]) {
540+
_limboDocumentRefs.RemoveReference(limboChange.key, targetID);
541+
if (!_limboDocumentRefs.ContainsKey(limboChange.key)) {
542542
// We removed the last reference for this key
543543
[self removeLimboTargetForKey:limboChange.key];
544544
}

0 commit comments

Comments
 (0)