Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions firebase-database/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Unreleased

- [fixed] Fixed a crash when calling `keepSynced(true)` and `get()` on the same query.

# 22.0.1

- [changed] Bumped internal dependencies.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5048,6 +5048,32 @@ public void testGetSendsServerGetForNodeWithNoListenerWhenOnline()
assertEquals(42L, await(node.get()).getValue());
}

@Test
public void testGetPreservesKeepSyncedState()
throws DatabaseException, InterruptedException, ExecutionException {
FirebaseDatabase writerDb = getNewDatabase();
FirebaseDatabase readerDb = getNewDatabase();
readerDb.setPersistenceEnabled(false);
DatabaseReference writer = writerDb.getReference().push();
DatabaseReference reader = translateReference(writer, readerDb);

await(writer.setValue(42L));

try {
reader.keepSynced(true);
assertEquals(42L, await(reader.get()).getValue());

reader.keepSynced(true);
assertEquals(42L, await(reader.get()).getValue());

DatabaseReference equivalentReader = translateReference(writer, readerDb);
equivalentReader.keepSynced(true);
assertEquals(42L, await(equivalentReader.get()).getValue());
} finally {
reader.keepSynced(false);
}
}

@Test
public void testGetProbesInMemoryCacheForActiveListenerWhenOffline()
throws DatabaseException,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -558,7 +558,8 @@ public void run() {
QuerySpec spec = query.getSpec();
// EventRegistrations require a listener to be attached, so a dummy
// ValueEventListener was created.
keepSynced(spec, /* keep= */ true, /* skipDedup= */ true);
boolean addedKeepSyncedRegistration =
keepSynced(spec, /* keep= */ true, /* skipDedup= */ true);
List<? extends Event> events;
if (spec.loadsAllData()) {
events = serverSyncTree.applyServerOverwrite(spec.getPath(), serverNode);
Expand All @@ -576,7 +577,9 @@ public void run() {
InternalHelpers.createDataSnapshot(
query.getRef(),
IndexedNode.from(serverNode, query.getSpec().getIndex())));
keepSynced(spec, /* keep= */ false, /* skipDedup= */ true);
if (addedKeepSyncedRegistration) {
keepSynced(spec, /* keep= */ false, /* skipDedup= */ true);
}
}
});
}
Expand Down Expand Up @@ -767,9 +770,9 @@ public void keepSynced(QuerySpec query, boolean keep) {
keepSynced(query, keep, /* skipDedup= */ false);
}

public void keepSynced(QuerySpec query, boolean keep, final boolean skipDedup) {
public boolean keepSynced(QuerySpec query, boolean keep, final boolean skipDedup) {
hardAssert(query.getPath().isEmpty() || !query.getPath().getFront().equals(Constants.DOT_INFO));
serverSyncTree.keepSynced(query, keep, skipDedup);
return serverSyncTree.keepSynced(query, keep, skipDedup);
}

PersistentConnection getConnection() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -851,16 +851,18 @@ public void keepSynced(final QuerySpec query, final boolean keep) {
keepSynced(query, keep, false);
}

public void keepSynced(final QuerySpec query, final boolean keep, final boolean skipDedup) {
public boolean keepSynced(final QuerySpec query, final boolean keep, final boolean skipDedup) {
if (keep && !keepSyncedQueries.contains(query)) {
// TODO[persistence]: Find better / more efficient way to do keep-synced listeners.
addEventRegistration(
new KeepSyncedEventRegistration(query), /* skipListenerSetup= */ skipDedup);
keepSyncedQueries.add(query);
return true;
} else if (!keep && keepSyncedQueries.contains(query)) {
removeEventRegistration(new KeepSyncedEventRegistration(query), skipDedup);
keepSyncedQueries.remove(query);
}
return false;
}

/**
Expand Down