From 27102fe35017c6b4cd77a8e1aef965c44180fb61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carla=20K=C3=B6berl?= Date: Wed, 12 Nov 2025 11:28:08 +0100 Subject: [PATCH 1/6] fix in-process provider to use FLAGD_SYNC_PORT for port configuration #1619 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carla Köberl --- .../contrib/providers/flagd/Config.java | 1 + .../contrib/providers/flagd/FlagdOptions.java | 10 ++++++++- .../providers/flagd/FlagdOptionsTest.java | 21 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java index e41121e5c..417826437 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/Config.java @@ -24,6 +24,7 @@ public final class Config { static final String RESOLVER_ENV_VAR = "FLAGD_RESOLVER"; static final String HOST_ENV_VAR_NAME = "FLAGD_HOST"; static final String PORT_ENV_VAR_NAME = "FLAGD_PORT"; + static final String SYNC_PORT_ENV_VAR_NAME = "FLAGD_SYNC_PORT"; static final String TLS_ENV_VAR_NAME = "FLAGD_TLS"; static final String DEFAULT_AUTHORITY_ENV_VAR_NAME = "FLAGD_DEFAULT_AUTHORITY"; static final String SOCKET_PATH_ENV_VAR_NAME = "FLAGD_SOCKET_PATH"; diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java index a2463a946..3207339ac 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java @@ -255,7 +255,15 @@ void prebuild() { if (port == 0 && resolverType != Config.Resolver.FILE) { port = Integer.parseInt( - fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver())); + fallBackToEnvOrDefault( + Config.SYNC_PORT_ENV_VAR_NAME, + fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver()) + ) + ); + } else { + port = Integer.parseInt( + fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver()) + ); } } diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java index 75fd3581f..b0552326e 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java @@ -201,6 +201,27 @@ void testInProcessProviderFromEnv_portConfigured_usesConfiguredPort() { assertThat(flagdOptions.getPort()).isEqualTo(1000); } + @Test + @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) + @SetEnvironmentVariable(key = "FLAGD_SYNC_PORT", value = "1005") + void testInProcessProvider_usesSyncPortEnvVarWhenSet() { + FlagdOptions flagdOptions = FlagdOptions.builder().build(); + + assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); + assertThat(flagdOptions.getPort()).isEqualTo(1005); + } + + @Test + @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) + @SetEnvironmentVariable(key = "FLAGD_PORT", value = "5000") + void testInProcessProvider_fallsBackToFlagdPortWhenSyncPortNotSet(){ + FlagdOptions flagdOptions = FlagdOptions.builder().build(); + + assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); + assertThat(flagdOptions.getPort()).isEqualTo(5000); + } + + @Test @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_RPC) void testRpcProviderFromEnv_noPortConfigured_defaultsToCorrectPort() { From e0e2113c4a31694db5f78e7e267058c392ae88a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carla=20K=C3=B6berl?= Date: Thu, 20 Nov 2025 09:30:01 +0100 Subject: [PATCH 2/6] fixup: fixed logic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carla Köberl --- .../contrib/providers/flagd/FlagdOptions.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java index 3207339ac..291eeb017 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java @@ -254,16 +254,18 @@ void prebuild() { } if (port == 0 && resolverType != Config.Resolver.FILE) { - port = Integer.parseInt( - fallBackToEnvOrDefault( - Config.SYNC_PORT_ENV_VAR_NAME, - fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver()) - ) - ); - } else { - port = Integer.parseInt( - fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver()) - ); + if (resolverType == Config.Resolver.IN_PROCESS) { + port = Integer.parseInt( + fallBackToEnvOrDefault( + Config.SYNC_PORT_ENV_VAR_NAME, + fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver()) + ) + ); + } else { + port = Integer.parseInt( + fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver()) + ); + } } } From 065ed7b401d4f7a20feb5a8eb56d7d20ec66f4c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carla=20K=C3=B6berl?= Date: Thu, 20 Nov 2025 10:13:05 +0100 Subject: [PATCH 3/6] refactor port resolution logic and implement review suggestions #1651 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carla Köberl --- .../contrib/providers/flagd/FlagdOptions.java | 20 ++++++++----------- .../providers/flagd/FlagdOptionsTest.java | 20 +++++++++++++++---- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java index 291eeb017..17e86e6d1 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdOptions.java @@ -254,18 +254,14 @@ void prebuild() { } if (port == 0 && resolverType != Config.Resolver.FILE) { - if (resolverType == Config.Resolver.IN_PROCESS) { - port = Integer.parseInt( - fallBackToEnvOrDefault( - Config.SYNC_PORT_ENV_VAR_NAME, - fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver()) - ) - ); - } else { - port = Integer.parseInt( - fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, determineDefaultPortForResolver()) - ); - } + String defaultPort = determineDefaultPortForResolver(); + String fromPortEnv = fallBackToEnvOrDefault(Config.PORT_ENV_VAR_NAME, defaultPort); + + String portValue = resolverType == Config.Resolver.IN_PROCESS + ? fallBackToEnvOrDefault(Config.SYNC_PORT_ENV_VAR_NAME, fromPortEnv) + : fromPortEnv; + + port = Integer.parseInt(portValue); } } diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java index b0552326e..585fb583e 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java @@ -7,9 +7,11 @@ import static dev.openfeature.contrib.providers.flagd.Config.DEFAULT_RPC_PORT; import static dev.openfeature.contrib.providers.flagd.Config.KEEP_ALIVE_MS_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.KEEP_ALIVE_MS_ENV_VAR_NAME_OLD; +import static dev.openfeature.contrib.providers.flagd.Config.PORT_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_ENV_VAR; import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_IN_PROCESS; import static dev.openfeature.contrib.providers.flagd.Config.RESOLVER_RPC; +import static dev.openfeature.contrib.providers.flagd.Config.SYNC_PORT_ENV_VAR_NAME; import static dev.openfeature.contrib.providers.flagd.Config.TARGET_URI_ENV_VAR_NAME; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -203,24 +205,34 @@ void testInProcessProviderFromEnv_portConfigured_usesConfiguredPort() { @Test @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) - @SetEnvironmentVariable(key = "FLAGD_SYNC_PORT", value = "1005") + @SetEnvironmentVariable(key = SYNC_PORT_ENV_VAR_NAME, value = "9999") void testInProcessProvider_usesSyncPortEnvVarWhenSet() { FlagdOptions flagdOptions = FlagdOptions.builder().build(); assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); - assertThat(flagdOptions.getPort()).isEqualTo(1005); + assertThat(flagdOptions.getPort()).isEqualTo(9999); } @Test @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) - @SetEnvironmentVariable(key = "FLAGD_PORT", value = "5000") + @SetEnvironmentVariable(key = PORT_ENV_VAR_NAME, value = "8888") void testInProcessProvider_fallsBackToFlagdPortWhenSyncPortNotSet(){ FlagdOptions flagdOptions = FlagdOptions.builder().build(); assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); - assertThat(flagdOptions.getPort()).isEqualTo(5000); + assertThat(flagdOptions.getPort()).isEqualTo(8888); } + @Test + @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) + @SetEnvironmentVariable(key = PORT_ENV_VAR_NAME, value = "8888") + @SetEnvironmentVariable(key = SYNC_PORT_ENV_VAR_NAME, value = "9999") + void testInProcessProvider_syncPortTakesPrecedenceOverFlagdPort(){ + FlagdOptions flagdOptions = FlagdOptions.builder().build(); + + assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); + assertThat(flagdOptions.getPort()).isEqualTo(9999); + } @Test @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_RPC) From a846c7419ea6c0fac9839a5ba4ba3330a5e087c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carla=20K=C3=B6berl?= Date: Thu, 20 Nov 2025 12:04:08 +0100 Subject: [PATCH 4/6] apply spotless to fix verification failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carla Köberl --- .../openfeature/contrib/providers/flagd/FlagdProvider.java | 2 +- .../openfeature/contrib/providers/flagd/FlagdOptionsTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java index 4ce6e06ee..355e92c1e 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java @@ -210,7 +210,7 @@ private void onProviderEvent(FlagdProviderEvent flagdProviderEvent) { onConfigurationChanged(flagdProviderEvent); break; } - // intentional fall through + // intentional fall through case PROVIDER_READY: /* * Sync metadata is used to enrich the context, and is immutable in flagd, diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java index 585fb583e..552ae4afc 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdOptionsTest.java @@ -216,7 +216,7 @@ void testInProcessProvider_usesSyncPortEnvVarWhenSet() { @Test @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) @SetEnvironmentVariable(key = PORT_ENV_VAR_NAME, value = "8888") - void testInProcessProvider_fallsBackToFlagdPortWhenSyncPortNotSet(){ + void testInProcessProvider_fallsBackToFlagdPortWhenSyncPortNotSet() { FlagdOptions flagdOptions = FlagdOptions.builder().build(); assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); @@ -227,7 +227,7 @@ void testInProcessProvider_fallsBackToFlagdPortWhenSyncPortNotSet(){ @SetEnvironmentVariable(key = RESOLVER_ENV_VAR, value = RESOLVER_IN_PROCESS) @SetEnvironmentVariable(key = PORT_ENV_VAR_NAME, value = "8888") @SetEnvironmentVariable(key = SYNC_PORT_ENV_VAR_NAME, value = "9999") - void testInProcessProvider_syncPortTakesPrecedenceOverFlagdPort(){ + void testInProcessProvider_syncPortTakesPrecedenceOverFlagdPort() { FlagdOptions flagdOptions = FlagdOptions.builder().build(); assertThat(flagdOptions.getResolverType()).isEqualTo(Resolver.IN_PROCESS); From 89f7a3a94a047139938cc7e8cc32ce7876ceac4a Mon Sep 17 00:00:00 2001 From: Simon Schrottner Date: Fri, 21 Nov 2025 13:48:28 +0100 Subject: [PATCH 5/6] fixup: formatting Signed-off-by: Simon Schrottner --- .../dev/openfeature/contrib/providers/flagd/FlagdProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java index 355e92c1e..4ce6e06ee 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java @@ -210,7 +210,7 @@ private void onProviderEvent(FlagdProviderEvent flagdProviderEvent) { onConfigurationChanged(flagdProviderEvent); break; } - // intentional fall through + // intentional fall through case PROVIDER_READY: /* * Sync metadata is used to enrich the context, and is immutable in flagd, From f49293ed1cda6232b49d1d19d4d3cac3fd492a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carla=20K=C3=B6berl?= Date: Sun, 23 Nov 2025 08:17:37 +0100 Subject: [PATCH 6/6] update README config options table MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carla Köberl --- providers/flagd/README.md | 42 +++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/providers/flagd/README.md b/providers/flagd/README.md index d8fbaca01..f2d680c2c 100644 --- a/providers/flagd/README.md +++ b/providers/flagd/README.md @@ -106,27 +106,27 @@ variables. Given below are the supported configurations: -| Option name | Environment variable name | Type & Values | Default | Compatible resolver | -|-----------------------|--------------------------------|--------------------------|-----------|-------------------------| -| resolver | FLAGD_RESOLVER | String - rpc, in-process | rpc | | -| host | FLAGD_HOST | String | localhost | rpc & in-process | -| port | FLAGD_PORT | int | 8013 | rpc & in-process | -| targetUri | FLAGD_TARGET_URI | string | null | rpc & in-process | -| tls | FLAGD_TLS | boolean | false | rpc & in-process | -| defaultAuthority | FLAGD_DEFAULT_AUTHORITY | String | null | rpc & in-process | -| socketPath | FLAGD_SOCKET_PATH | String | null | rpc & in-process | -| certPath | FLAGD_SERVER_CERT_PATH | String | null | rpc & in-process | -| deadline | FLAGD_DEADLINE_MS | int | 500 | rpc & in-process & file | -| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | int | 600000 | rpc & in-process | -| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | long | 0 | rpc & in-process | -| selector | FLAGD_SOURCE_SELECTOR | String | null | in-process | -| providerId | FLAGD_SOURCE_PROVIDER_ID | String | null | in-process | -| cache | FLAGD_CACHE | String - lru, disabled | lru | rpc | -| maxCacheSize | FLAGD_MAX_CACHE_SIZE | int | 1000 | rpc | -| maxEventStreamRetries | FLAGD_MAX_EVENT_STREAM_RETRIES | int | 5 | rpc | -| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | int | 1000 | rpc | -| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | String | null | file | -| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | int | 5000 | file | +| Option name | Environment variable name | Type & Values | Default | Compatible resolver | +|-----------------------|------------------------------------------------------------------------|--------------------------|-------------------------------|-------------------------| +| resolver | FLAGD_RESOLVER | String - rpc, in-process | rpc | | +| host | FLAGD_HOST | String | localhost | rpc & in-process | +| port | FLAGD_PORT (rpc), FLAGD_SYNC_PORT (in-process, FLAGD_PORT as fallback) | int | 8013 (rpc), 8015 (in-process) | rpc & in-process | +| targetUri | FLAGD_TARGET_URI | string | null | rpc & in-process | +| tls | FLAGD_TLS | boolean | false | rpc & in-process | +| defaultAuthority | FLAGD_DEFAULT_AUTHORITY | String | null | rpc & in-process | +| socketPath | FLAGD_SOCKET_PATH | String | null | rpc & in-process | +| certPath | FLAGD_SERVER_CERT_PATH | String | null | rpc & in-process | +| deadline | FLAGD_DEADLINE_MS | int | 500 | rpc & in-process & file | +| streamDeadlineMs | FLAGD_STREAM_DEADLINE_MS | int | 600000 | rpc & in-process | +| keepAliveTime | FLAGD_KEEP_ALIVE_TIME_MS | long | 0 | rpc & in-process | +| selector | FLAGD_SOURCE_SELECTOR | String | null | in-process | +| providerId | FLAGD_SOURCE_PROVIDER_ID | String | null | in-process | +| cache | FLAGD_CACHE | String - lru, disabled | lru | rpc | +| maxCacheSize | FLAGD_MAX_CACHE_SIZE | int | 1000 | rpc | +| maxEventStreamRetries | FLAGD_MAX_EVENT_STREAM_RETRIES | int | 5 | rpc | +| retryBackoffMs | FLAGD_RETRY_BACKOFF_MS | int | 1000 | rpc | +| offlineFlagSourcePath | FLAGD_OFFLINE_FLAG_SOURCE_PATH | String | null | file | +| offlinePollIntervalMs | FLAGD_OFFLINE_POLL_MS | int | 5000 | file | > [!NOTE] > Some configurations are only applicable for RPC resolver.