Skip to content

Commit

Permalink
feat: expose initial config load future for sub-classes of the `BaseE…
Browse files Browse the repository at this point in the history
…ppoClient` (#48)
  • Loading branch information
typotter authored Oct 7, 2024
1 parent dfca826 commit bab72bc
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 11 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ or [JVM](https://github.com/Eppo-exp/java-server-sdk) SDKs.

```groovy
dependencies {
implementation 'cloud.eppo:sdk-common-jvm:3.3.1'
implementation 'cloud.eppo:sdk-common-jvm:3.3.2'
}
```

Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
}

group = 'cloud.eppo'
version = '3.3.2-SNAPSHOT'
version = '3.3.2'
ext.isReleaseVersion = !version.endsWith("SNAPSHOT")

java {
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/cloud/eppo/BaseEppoClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ public class BaseEppoClient {
private final String sdkVersion;
private boolean isGracefulMode;

@Nullable protected CompletableFuture<Boolean> getInitialConfigFuture() {
return initialConfigFuture;
}

private final CompletableFuture<Boolean> initialConfigFuture;

// Fields useful for testing in situations where we want to mock the http client or configuration
// store (accessed via reflection)
/** @noinspection FieldMayBeFinal */
Expand Down Expand Up @@ -73,9 +79,10 @@ protected BaseEppoClient(
requestor =
new ConfigurationRequestor(
this.configurationStore, httpClient, expectObfuscatedConfig, supportBandits);
if (initialConfiguration != null) {
requestor.setInitialConfiguration(initialConfiguration);
}
initialConfigFuture =
initialConfiguration != null
? requestor.setInitialConfiguration(initialConfiguration)
: null;

this.assignmentLogger = assignmentLogger;
this.banditLogger = banditLogger;
Expand Down
17 changes: 11 additions & 6 deletions src/main/java/cloud/eppo/ConfigurationRequestor.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class ConfigurationRequestor {
private final boolean supportBandits;

private CompletableFuture<Void> remoteFetchFuture = null;
private CompletableFuture<Void> configurationFuture = null;
private CompletableFuture<Boolean> configurationFuture = null;
private boolean initialConfigSet = false;

public ConfigurationRequestor(
Expand All @@ -42,38 +42,43 @@ public void setInitialConfiguration(@NotNull Configuration configuration) {
configurationStore.saveConfiguration(configuration).thenApply(v -> true).join();
}

// Asynchronously sets the initial configuration.
public CompletableFuture<Void> setInitialConfiguration(
/**
* Asynchronously sets the initial configuration. Resolves to `true` if the initial configuration
* was used, false if not (due to being empty, a fetched config taking precedence, etc.)
*/
public CompletableFuture<Boolean> setInitialConfiguration(
@NotNull CompletableFuture<Configuration> configurationFuture) {
if (initialConfigSet || this.configurationFuture != null) {
throw new IllegalStateException("Configuration future has already been set");
}
this.configurationFuture =
configurationFuture
.thenAccept(
.thenApply(
(config) -> {
synchronized (configurationStore) {
if (config == null || config.isEmpty()) {
log.debug("Initial configuration future returned empty/null");
return false;
} else if (remoteFetchFuture != null
&& remoteFetchFuture.isDone()
&& !remoteFetchFuture.isCompletedExceptionally()) {
// Don't clobber a successful fetch.
log.debug("Fetch has completed; ignoring initial config load.");
return false;
} else {
log.debug("saving initial configuration");
initialConfigSet =
configurationStore
.saveConfiguration(config)
.thenApply((s) -> true)
.join();
return true;
}
}
})
.exceptionally(
(e) -> {
log.error("Error setting initial config", e);
return null;
return false;
});
return this.configurationFuture;
}
Expand Down

0 comments on commit bab72bc

Please sign in to comment.