Skip to content

Commit 23a4106

Browse files
committed
fix: Log the isFlagKnown cached-data warning only once per client
1 parent c348d3f commit 23a4106

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

‎lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/LDClient.java‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import java.util.concurrent.ThreadFactory;
4141
import java.util.concurrent.TimeUnit;
4242
import java.util.concurrent.TimeoutException;
43+
import java.util.concurrent.atomic.AtomicBoolean;
4344

4445
import static com.google.common.base.Preconditions.checkNotNull;
4546
import static com.launchdarkly.sdk.server.DataModel.FEATURES;
@@ -66,6 +67,8 @@ public final class LDClient implements LDClientInterface {
6667
private final ScheduledExecutorService sharedExecutor;
6768
private final LDLogger baseLogger;
6869
private final LDLogger evaluationLogger;
70+
// isFlagKnown logs its cached-data warning once per client. This flag records that log.
71+
private final AtomicBoolean isFlagKnownCachedDataWarned = new AtomicBoolean(false);
6972

7073
private static final int EXCESSIVE_INIT_WAIT_MILLIS = 60000;
7174

@@ -429,7 +432,10 @@ public boolean isFlagKnown(String featureKey) {
429432

430433
if (!isInitialized()) {
431434
if (store.isInitialized()) {
432-
baseLogger.warn("isFlagKnown called before client initialized for feature flag \"{}\"; using last known values from data store", featureKey);
435+
if (isFlagKnownCachedDataWarned.compareAndSet(false, true)) {
436+
baseLogger.warn("isFlagKnown called before client initialized for feature flag \"{}\"; "
437+
+ "using last known values from data store. This message is logged once.", featureKey);
438+
}
433439
} else {
434440
baseLogger.warn("isFlagKnown called before client initialized for feature flag \"{}\"; data store unavailable, returning false", featureKey);
435441
return false;

‎lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/LDClientTest.java‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.launchdarkly.sdk.server;
22

3+
import com.launchdarkly.logging.LDLogLevel;
34
import com.launchdarkly.sdk.LDContext;
45
import com.launchdarkly.sdk.LDValue;
56
import com.launchdarkly.sdk.server.integrations.MockPersistentDataStore;
@@ -427,6 +428,30 @@ public void isFlagKnownReturnsFalseIfStoreAndClientAreNotInitialized() throws Ex
427428
mocks.verifyAll();
428429
}
429430

431+
@Test
432+
public void isFlagKnownLogsCachedDataWarningOnlyOnce() throws Exception {
433+
DataStore testDataStore = initedDataStore();
434+
LDConfig.Builder config = new LDConfig.Builder()
435+
.startWait(Duration.ZERO)
436+
.dataStore(specificComponent(testDataStore));
437+
expect(dataSource.start()).andReturn(initFuture);
438+
expect(dataSource.isInitialized()).andReturn(false).times(2);
439+
mocks.replayAll();
440+
441+
client = createMockClient(config);
442+
443+
upsertFlag(testDataStore, flagWithValue("key", LDValue.of(1)));
444+
assertTrue(client.isFlagKnown("key"));
445+
assertTrue(client.isFlagKnown("key"));
446+
447+
long warningCount = logCapture.getMessages().stream()
448+
.filter(m -> m.getLevel() == LDLogLevel.WARN
449+
&& m.getText().contains("using last known values from data store"))
450+
.count();
451+
assertEquals(1, warningCount);
452+
mocks.verifyAll();
453+
}
454+
430455
@Test
431456
public void isFlagKnownUsesStoreIfStoreIsInitializedButClientIsNot() throws Exception {
432457
DataStore testDataStore = initedDataStore();

0 commit comments

Comments
 (0)