From 48c135c08b47396676f0294119104446e418d343 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 17 Sep 2025 12:30:21 -0700 Subject: [PATCH 01/11] upgrade apache commons --- client/pom.xml | 6 +++--- okhttp-modules/pom.xml | 6 +++--- pluggable-storage/pom.xml | 2 +- pom.xml | 2 +- redis-wrapper/pom.xml | 2 +- testing/pom.xml | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/pom.xml b/client/pom.xml index 4db1af75..684be4d3 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -5,9 +5,9 @@ io.split.client java-client-parent - 4.18.0 + 4.18.1-rc1 - 4.18.0 + 4.18.1-rc1 java-client jar Java Client @@ -171,7 +171,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.4 + 5.5 com.google.code.gson diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index ec03d10d..ae34daa3 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -5,10 +5,10 @@ java-client-parent io.split.client - 4.18.0 + 4.18.1-rc1 4.0.0 - 4.18.0 + 4.18.1-rc1 okhttp-modules jar http-modules @@ -55,7 +55,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.1 + 5.5 diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml index 94604cfd..8075abb5 100644 --- a/pluggable-storage/pom.xml +++ b/pluggable-storage/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.0 + 4.18.1-rc1 2.1.0 diff --git a/pom.xml b/pom.xml index 90b70d29..96e5811a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.split.client java-client-parent - 4.18.0 + 4.18.1-rc1 diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml index c39bc2cd..4507d4de 100644 --- a/redis-wrapper/pom.xml +++ b/redis-wrapper/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.0 + 4.18.1-rc1 redis-wrapper 3.1.1 diff --git a/testing/pom.xml b/testing/pom.xml index cd4ae550..6450144e 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -5,11 +5,11 @@ io.split.client java-client-parent - 4.18.0 + 4.18.1-rc1 java-client-testing jar - 4.18.0 + 4.18.1-rc1 Java Client For Testing Testing suite for Java SDK for Split From 0b28f41a3b7bfb7031976ccdc8d9ff44fffcd394 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Thu, 18 Sep 2025 11:52:54 -0700 Subject: [PATCH 02/11] added core5 --- client/pom.xml | 9 +++++++-- okhttp-modules/pom.xml | 9 +++++++-- pluggable-storage/pom.xml | 2 +- pom.xml | 2 +- redis-wrapper/pom.xml | 2 +- testing/pom.xml | 4 ++-- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/client/pom.xml b/client/pom.xml index 684be4d3..cae3bedc 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -5,9 +5,9 @@ io.split.client java-client-parent - 4.18.1-rc1 + 4.18.1-rc2 - 4.18.1-rc1 + 4.18.1-rc2 java-client jar Java Client @@ -173,6 +173,11 @@ httpclient5 5.5 + + org.apache.httpcomponents.core5 + httpcore5 + 5.3.5 + com.google.code.gson gson diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index ae34daa3..d0d99e05 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -5,10 +5,10 @@ java-client-parent io.split.client - 4.18.1-rc1 + 4.18.1-rc2 4.0.0 - 4.18.1-rc1 + 4.18.1-rc2 okhttp-modules jar http-modules @@ -57,6 +57,11 @@ httpclient5 5.5 + + org.apache.httpcomponents.core5 + httpcore5 + 5.3.5 + junit diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml index 8075abb5..3975f84c 100644 --- a/pluggable-storage/pom.xml +++ b/pluggable-storage/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.1-rc1 + 4.18.1-rc2 2.1.0 diff --git a/pom.xml b/pom.xml index 96e5811a..d13d7600 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.split.client java-client-parent - 4.18.1-rc1 + 4.18.1-rc2 diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml index 4507d4de..c820725b 100644 --- a/redis-wrapper/pom.xml +++ b/redis-wrapper/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.1-rc1 + 4.18.1-rc2 redis-wrapper 3.1.1 diff --git a/testing/pom.xml b/testing/pom.xml index 6450144e..f9fc2a16 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -5,11 +5,11 @@ io.split.client java-client-parent - 4.18.1-rc1 + 4.18.1-rc2 java-client-testing jar - 4.18.1-rc1 + 4.18.1-rc2 Java Client For Testing Testing suite for Java SDK for Split From 3c7f877cfb7a3fe45e04b596ae8ecceffcd54b4e Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Mon, 22 Sep 2025 15:10:03 -0700 Subject: [PATCH 03/11] added streaming token refresh config --- client/pom.xml | 4 +-- .../io/split/client/SplitClientConfig.java | 22 +++++++++++-- .../split/engine/common/PushManagerImp.java | 33 ++++++++++++++----- .../split/engine/common/SyncManagerImp.java | 3 +- .../io/split/engine/sse/client/SSEClient.java | 6 ++++ .../split/engine/common/PushManagerTest.java | 3 +- okhttp-modules/pom.xml | 4 +-- pluggable-storage/pom.xml | 2 +- pom.xml | 2 +- redis-wrapper/pom.xml | 2 +- testing/pom.xml | 4 +-- 11 files changed, 64 insertions(+), 21 deletions(-) diff --git a/client/pom.xml b/client/pom.xml index cae3bedc..8d018b05 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -5,9 +5,9 @@ io.split.client java-client-parent - 4.18.1-rc2 + 4.18.1-rc3 - 4.18.1-rc2 + 4.18.1-rc3 java-client jar Java Client diff --git a/client/src/main/java/io/split/client/SplitClientConfig.java b/client/src/main/java/io/split/client/SplitClientConfig.java index e6e7a70a..b9668494 100644 --- a/client/src/main/java/io/split/client/SplitClientConfig.java +++ b/client/src/main/java/io/split/client/SplitClientConfig.java @@ -112,6 +112,8 @@ private HttpScheme() { private final CustomHeaderDecorator _customHeaderDecorator; private final CustomHttpModule _alternativeHTTPModule; + private final int _streamingTokenRefreshRate; + public static Builder builder() { return new Builder(); } @@ -170,7 +172,8 @@ private SplitClientConfig(String endpoint, int invalidSets, CustomHeaderDecorator customHeaderDecorator, CustomHttpModule alternativeHTTPModule, - FallbackTreatmentsConfiguration fallbackTreatments) { + FallbackTreatmentsConfiguration fallbackTreatments, + int streamingTokenRefreshRate) { _endpoint = endpoint; _eventsEndpoint = eventsEndpoint; _featuresRefreshRate = pollForFeatureChangesEveryNSeconds; @@ -226,6 +229,7 @@ private SplitClientConfig(String endpoint, _customHeaderDecorator = customHeaderDecorator; _alternativeHTTPModule = alternativeHTTPModule; _fallbackTreatments = fallbackTreatments; + _streamingTokenRefreshRate = streamingTokenRefreshRate; Properties props = new Properties(); try { @@ -446,6 +450,8 @@ public boolean isSdkEndpointOverridden() { public FallbackTreatmentsConfiguration fallbackTreatments() { return _fallbackTreatments; } + public int streamingTokenRefreshRate() { return _streamingTokenRefreshRate; } + public static final class Builder { private String _endpoint = SDK_ENDPOINT; private boolean _endpointSet = false; @@ -505,6 +511,7 @@ public static final class Builder { private CustomHeaderDecorator _customHeaderDecorator = null; private CustomHttpModule _alternativeHTTPModule = null; private FallbackTreatmentsConfiguration _fallbackTreatments; + private int _streamingTokenRefreshRate = 180; public Builder() { } @@ -1055,6 +1062,11 @@ public Builder threadFactory(ThreadFactory threadFactory) { return this; } + public Builder streamingTokenRefreshRate(int streamingTokenRefreshRate) { + _streamingTokenRefreshRate = streamingTokenRefreshRate; + return this; + } + private void verifyRates() { if (_featuresRefreshRate < 5 ) { throw new IllegalArgumentException("featuresRefreshRate must be >= 5: " + _featuresRefreshRate); @@ -1071,9 +1083,14 @@ private void verifyRates() { if (_metricsRefreshRate < 30) { throw new IllegalArgumentException("metricsRefreshRate must be >= 30: " + _metricsRefreshRate); } + if(_telemetryRefreshRate < 60) { throw new IllegalStateException("_telemetryRefreshRate must be >= 60"); } + + if (_streamingTokenRefreshRate < 60) { + throw new IllegalStateException("_streamingTokenRefreshRate must be >= 60"); + } } private void verifyEndPoints() { @@ -1274,7 +1291,8 @@ public SplitClientConfig build() { _invalidSetsCount, _customHeaderDecorator, _alternativeHTTPModule, - _fallbackTreatments); + _fallbackTreatments, + _streamingTokenRefreshRate); } } } \ No newline at end of file diff --git a/client/src/main/java/io/split/engine/common/PushManagerImp.java b/client/src/main/java/io/split/engine/common/PushManagerImp.java index 4862765f..7decbbec 100644 --- a/client/src/main/java/io/split/engine/common/PushManagerImp.java +++ b/client/src/main/java/io/split/engine/common/PushManagerImp.java @@ -52,6 +52,7 @@ public class PushManagerImp implements PushManager { private final ScheduledExecutorService _scheduledExecutorService; private AtomicLong _expirationTime; private final TelemetryRuntimeProducer _telemetryRuntimeProducer; + private final int _streamingTokenRefreshRate; @VisibleForTesting /* package private */ PushManagerImp(AuthApiClient authApiClient, @@ -60,7 +61,8 @@ public class PushManagerImp implements PushManager { Worker segmentWorker, PushStatusTracker pushStatusTracker, TelemetryRuntimeProducer telemetryRuntimeProducer, - ThreadFactory threadFactory) { + ThreadFactory threadFactory, + int streamingTokenRefreshRate) { _authApiClient = checkNotNull(authApiClient); _eventSourceClient = checkNotNull(eventSourceClient); @@ -70,6 +72,7 @@ public class PushManagerImp implements PushManager { _expirationTime = new AtomicLong(); _scheduledExecutorService = buildSingleThreadScheduledExecutor(threadFactory, "Split-SSERefreshToken-%d"); _telemetryRuntimeProducer = checkNotNull(telemetryRuntimeProducer); + _streamingTokenRefreshRate = streamingTokenRefreshRate; } public static PushManagerImp build(Synchronizer synchronizer, @@ -83,7 +86,8 @@ public static PushManagerImp build(Synchronizer synchronizer, SplitCacheProducer splitCacheProducer, FlagSetsFilter flagSetsFilter, RuleBasedSegmentCache ruleBasedSegmentCache, - RuleBasedSegmentParser ruleBasedSegmentParser) { + RuleBasedSegmentParser ruleBasedSegmentParser, + int streamingTokenRefreshRate) { FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, ruleBasedSegmentParser, splitCacheProducer, ruleBasedSegmentCache, telemetryRuntimeProducer, flagSetsFilter); Worker segmentWorker = new SegmentsWorkerImp(synchronizer); @@ -96,7 +100,8 @@ public static PushManagerImp build(Synchronizer synchronizer, segmentWorker, pushStatusTracker, telemetryRuntimeProducer, - threadFactory); + threadFactory, + streamingTokenRefreshRate); } @Override @@ -106,7 +111,7 @@ public void start() { AuthenticationResponse response = _authApiClient.Authenticate(); _log.debug(String.format("Auth service response pushEnabled: %s", response.isPushEnabled())); if (response.isPushEnabled() && startSse(response.getToken(), response.getChannels())) { - _expirationTime.set(response.getExpiration()); + _expirationTime.set(_streamingTokenRefreshRate); _telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.TOKEN_REFRESH.getType(), response.getExpiration(), System.currentTimeMillis())); return; @@ -114,10 +119,14 @@ public void start() { cleanUpResources(); if (response.isRetry()) { + _log.debug(String.format("Handling retry error response")); _pushStatusTracker.handleSseStatus(SSEClient.StatusMessage.RETRYABLE_ERROR); } else { + _log.debug(String.format("Auth service response is disabled: %s", response.getToken())); _pushStatusTracker.forcePushDisable(); } + } catch (Exception e) { + _log.debug("Exception in PushManager start: " + e.getMessage()); } finally { lock.unlock(); } @@ -156,14 +165,22 @@ private boolean startSse(String token, String channels) { @Override public void startWorkers() { - _featureFlagsWorker.start(); - _segmentWorker.start(); + try { + _featureFlagsWorker.start(); + _segmentWorker.start(); + } catch (Exception e) { + _log.debug("Exception in starting workers: " + e.getMessage()); + } } @Override public void stopWorkers() { - _featureFlagsWorker.stop(); - _segmentWorker.stop(); + try { + _featureFlagsWorker.stop(); + _segmentWorker.stop(); + } catch (Exception e) { + _log.debug("Exception in stopping workers: " + e.getMessage()); + } } private void cleanUpResources() { diff --git a/client/src/main/java/io/split/engine/common/SyncManagerImp.java b/client/src/main/java/io/split/engine/common/SyncManagerImp.java index 57faa07b..a5cbc6df 100644 --- a/client/src/main/java/io/split/engine/common/SyncManagerImp.java +++ b/client/src/main/java/io/split/engine/common/SyncManagerImp.java @@ -116,7 +116,8 @@ public static SyncManagerImp build(SplitTasks splitTasks, splitCacheProducer, flagSetsFilter, ruleBasedSegmentCache, - ruleBasedSegmentParser); + ruleBasedSegmentParser, + config.streamingTokenRefreshRate()); return new SyncManagerImp(splitTasks, config.streamingEnabled(), diff --git a/client/src/main/java/io/split/engine/sse/client/SSEClient.java b/client/src/main/java/io/split/engine/sse/client/SSEClient.java index aac6f556..8378bff0 100644 --- a/client/src/main/java/io/split/engine/sse/client/SSEClient.java +++ b/client/src/main/java/io/split/engine/sse/client/SSEClient.java @@ -115,6 +115,7 @@ public boolean isOpen() { } public void close() { + _log.debug("closing SSE client"); try { lock.lock(); _forcedStop.set(true); @@ -128,6 +129,8 @@ public void close() { } } } + } catch (Exception e) { + _log.debug("Exception in closing SSE client: " + e.getMessage()); } finally { lock.unlock(); } @@ -184,6 +187,7 @@ private void connectAndLoop(URI uri, CountDownLatch signal) { } } } catch (Exception e) { // Any other error non related to the connection disables streaming altogether + _log.debug(String.format("SSE connection exception: %s", e.getMessage())); _telemetryRuntimeProducer .recordStreamingEvents(new StreamingEvent(StreamEventsEnum.SSE_CONNECTION_ERROR.getType(), StreamEventsEnum.SseConnectionErrorValues.NON_REQUESTED_CONNECTION_ERROR.getValue(), @@ -191,9 +195,11 @@ private void connectAndLoop(URI uri, CountDownLatch signal) { _log.warn(e.getMessage(), e); _statusCallback.apply(StatusMessage.NONRETRYABLE_ERROR); } finally { + _log.debug(String.format("Attempt to close SSE connection")); try { _ongoingResponse.get().close(); } catch (IOException e) { + _log.debug(String.format("SSE connection closing exception: %s", e.getMessage())); _log.debug(e.getMessage()); } diff --git a/client/src/test/java/io/split/engine/common/PushManagerTest.java b/client/src/test/java/io/split/engine/common/PushManagerTest.java index 33ce1341..5aef23be 100644 --- a/client/src/test/java/io/split/engine/common/PushManagerTest.java +++ b/client/src/test/java/io/split/engine/common/PushManagerTest.java @@ -40,7 +40,8 @@ public void setUp() { _segmentsWorkerImp, _pushStatusTracker, _telemetryStorage, - null); + null, + 180); } @Test diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index d0d99e05..fb46621b 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -5,10 +5,10 @@ java-client-parent io.split.client - 4.18.1-rc2 + 4.18.1-rc3 4.0.0 - 4.18.1-rc2 + 4.18.1-rc3 okhttp-modules jar http-modules diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml index 3975f84c..a1dfab96 100644 --- a/pluggable-storage/pom.xml +++ b/pluggable-storage/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.1-rc2 + 4.18.1-rc3 2.1.0 diff --git a/pom.xml b/pom.xml index d13d7600..a0f53920 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.split.client java-client-parent - 4.18.1-rc2 + 4.18.1-rc3 diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml index c820725b..6037a72c 100644 --- a/redis-wrapper/pom.xml +++ b/redis-wrapper/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.1-rc2 + 4.18.1-rc3 redis-wrapper 3.1.1 diff --git a/testing/pom.xml b/testing/pom.xml index f9fc2a16..9928b02b 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -5,11 +5,11 @@ io.split.client java-client-parent - 4.18.1-rc2 + 4.18.1-rc3 java-client-testing jar - 4.18.1-rc2 + 4.18.1-rc3 Java Client For Testing Testing suite for Java SDK for Split From 0e0e494b3bdc0e6d4301074f577b12744125b8ea Mon Sep 17 00:00:00 2001 From: Mauro Sanz <51236193+sanzmauro@users.noreply.github.com> Date: Mon, 22 Sep 2025 21:09:50 -0300 Subject: [PATCH 04/11] Update PushManagerImp.java --- .../io/split/engine/common/PushManagerImp.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/client/src/main/java/io/split/engine/common/PushManagerImp.java b/client/src/main/java/io/split/engine/common/PushManagerImp.java index 7decbbec..c6183033 100644 --- a/client/src/main/java/io/split/engine/common/PushManagerImp.java +++ b/client/src/main/java/io/split/engine/common/PushManagerImp.java @@ -106,17 +106,20 @@ public static PushManagerImp build(Synchronizer synchronizer, @Override public void start() { + _log.debug("#1 - Start PushManagerImp"); try { lock.lock(); AuthenticationResponse response = _authApiClient.Authenticate(); _log.debug(String.format("Auth service response pushEnabled: %s", response.isPushEnabled())); if (response.isPushEnabled() && startSse(response.getToken(), response.getChannels())) { + _log.debug("#2 - PushManagerImp connected"); _expirationTime.set(_streamingTokenRefreshRate); _telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.TOKEN_REFRESH.getType(), response.getExpiration(), System.currentTimeMillis())); return; } + _log.debug("#3 - PushManagerImp error"); cleanUpResources(); if (response.isRetry()) { _log.debug(String.format("Handling retry error response")); @@ -125,6 +128,7 @@ public void start() { _log.debug(String.format("Auth service response is disabled: %s", response.getToken())); _pushStatusTracker.forcePushDisable(); } + _log.debug("#4 - PushManagerImp error"); } catch (Exception e) { _log.debug("Exception in PushManager start: " + e.getMessage()); } finally { @@ -134,10 +138,11 @@ public void start() { @Override public void stop() { + _log.debug("#1 - Stopping PushManagerImp"); try { lock.lock(); - _log.debug("Stopping PushManagerImp"); cleanUpResources(); + _log.debug("#2 - Stopped PushManagerImp"); } finally { lock.unlock(); } @@ -147,9 +152,11 @@ public void stop() { public void scheduleConnectionReset() { _log.debug(String.format("scheduleNextTokenRefresh in %s SECONDS", _expirationTime)); _nextTokenRefreshTask = _scheduledExecutorService.schedule(() -> { - _log.debug("Starting scheduleNextTokenRefresh ..."); + _log.debug("#1 - Starting scheduleNextTokenRefresh ..."); stop(); + _log.debug("#2 - Finished to stop all streaming engine"); start(); + _log.debug("#3 - Finished to start streaming connection"); }, _expirationTime.get(), TimeUnit.SECONDS); } @@ -184,11 +191,15 @@ public void stopWorkers() { } private void cleanUpResources() { + _log.debug("Starting cleanUpResources - #1") _eventSourceClient.stop(); + _log.debug("cleanUpResources - #2") stopWorkers(); if (_nextTokenRefreshTask != null) { _log.debug("Cancel nextTokenRefreshTask"); _nextTokenRefreshTask.cancel(false); + _log.debug("Finished cleanUpResources - #3 - Finished cancel nextTokenRefreshTask") } + _log.debug("Finished cleanUpResources - #4") } -} \ No newline at end of file +} From f5d0fc29d7e283d7955205838dcb8a5d99f1f3a2 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Mon, 22 Sep 2025 17:37:04 -0700 Subject: [PATCH 05/11] polish --- .../main/java/io/split/engine/common/PushManagerImp.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/main/java/io/split/engine/common/PushManagerImp.java b/client/src/main/java/io/split/engine/common/PushManagerImp.java index c6183033..ade93499 100644 --- a/client/src/main/java/io/split/engine/common/PushManagerImp.java +++ b/client/src/main/java/io/split/engine/common/PushManagerImp.java @@ -191,15 +191,15 @@ public void stopWorkers() { } private void cleanUpResources() { - _log.debug("Starting cleanUpResources - #1") + _log.debug("Starting cleanUpResources - #1"); _eventSourceClient.stop(); - _log.debug("cleanUpResources - #2") + _log.debug("cleanUpResources - #2"); stopWorkers(); if (_nextTokenRefreshTask != null) { _log.debug("Cancel nextTokenRefreshTask"); _nextTokenRefreshTask.cancel(false); - _log.debug("Finished cleanUpResources - #3 - Finished cancel nextTokenRefreshTask") + _log.debug("Finished cleanUpResources - #3 - Finished cancel nextTokenRefreshTask"); } - _log.debug("Finished cleanUpResources - #4") + _log.debug("Finished cleanUpResources - #4"); } } From 34fc67f9490c7c7159183b90e45e6794ab6022b0 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Tue, 23 Sep 2025 08:14:46 -0700 Subject: [PATCH 06/11] add more debug --- .../main/java/io/split/engine/common/PushManagerImp.java | 6 ++++++ .../src/main/java/io/split/engine/sse/workers/Worker.java | 2 ++ 2 files changed, 8 insertions(+) diff --git a/client/src/main/java/io/split/engine/common/PushManagerImp.java b/client/src/main/java/io/split/engine/common/PushManagerImp.java index ade93499..e27a0bc9 100644 --- a/client/src/main/java/io/split/engine/common/PushManagerImp.java +++ b/client/src/main/java/io/split/engine/common/PushManagerImp.java @@ -143,6 +143,8 @@ public void stop() { lock.lock(); cleanUpResources(); _log.debug("#2 - Stopped PushManagerImp"); + } catch (Exception e) { + _log.debug("Exception in stopping push manager: " + e.getMessage()); } finally { lock.unlock(); } @@ -173,7 +175,9 @@ private boolean startSse(String token, String channels) { @Override public void startWorkers() { try { + _log.debug("Starting featureflag worker"); _featureFlagsWorker.start(); + _log.debug("Starting segment worker"); _segmentWorker.start(); } catch (Exception e) { _log.debug("Exception in starting workers: " + e.getMessage()); @@ -183,7 +187,9 @@ public void startWorkers() { @Override public void stopWorkers() { try { + _log.debug("Stopping featureflag worker"); _featureFlagsWorker.stop(); + _log.debug("Stopping segment worker"); _segmentWorker.stop(); } catch (Exception e) { _log.debug("Exception in stopping workers: " + e.getMessage()); diff --git a/client/src/main/java/io/split/engine/sse/workers/Worker.java b/client/src/main/java/io/split/engine/sse/workers/Worker.java index 7d2dd21a..7aa1d553 100644 --- a/client/src/main/java/io/split/engine/sse/workers/Worker.java +++ b/client/src/main/java/io/split/engine/sse/workers/Worker.java @@ -27,6 +27,7 @@ public void start() { _thread = new Thread( this); _thread.setName(String.format("%s-worker", _workerName)); _thread.start(); + _log.debug(String.format("%s Worker started ...", _workerName)); } else { _log.debug(String.format("%s Worker already running.", _workerName)); return; @@ -35,6 +36,7 @@ public void start() { public void stop() { if (_running.compareAndSet(true, false)) { + _log.debug(String.format("%s stopping Worker", _workerName)); _thread.interrupt(); _log.debug(String.format("%s Worked stopped.", _workerName)); } else { From ee81f4432b63eaf2dba3ef7d8c1ed512bdc5e9c8 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 24 Sep 2025 10:01:00 -0700 Subject: [PATCH 07/11] Added immediate socket close option --- client/pom.xml | 4 +-- .../io/split/client/SplitClientConfig.java | 21 ++----------- .../split/engine/common/PushManagerImp.java | 30 +++---------------- .../split/engine/common/SyncManagerImp.java | 3 +- .../io/split/engine/sse/client/SSEClient.java | 18 +++-------- .../io/split/engine/sse/workers/Worker.java | 2 -- .../split/engine/common/PushManagerTest.java | 3 +- okhttp-modules/pom.xml | 4 +-- pluggable-storage/pom.xml | 2 +- pom.xml | 2 +- redis-wrapper/pom.xml | 2 +- testing/pom.xml | 2 +- 12 files changed, 20 insertions(+), 73 deletions(-) diff --git a/client/pom.xml b/client/pom.xml index 8d018b05..d3db7ad9 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -5,9 +5,9 @@ io.split.client java-client-parent - 4.18.1-rc3 + 4.18.1-rc5 - 4.18.1-rc3 + 4.18.1-rc5 java-client jar Java Client diff --git a/client/src/main/java/io/split/client/SplitClientConfig.java b/client/src/main/java/io/split/client/SplitClientConfig.java index b9668494..3a38fccd 100644 --- a/client/src/main/java/io/split/client/SplitClientConfig.java +++ b/client/src/main/java/io/split/client/SplitClientConfig.java @@ -112,8 +112,6 @@ private HttpScheme() { private final CustomHeaderDecorator _customHeaderDecorator; private final CustomHttpModule _alternativeHTTPModule; - private final int _streamingTokenRefreshRate; - public static Builder builder() { return new Builder(); } @@ -172,8 +170,7 @@ private SplitClientConfig(String endpoint, int invalidSets, CustomHeaderDecorator customHeaderDecorator, CustomHttpModule alternativeHTTPModule, - FallbackTreatmentsConfiguration fallbackTreatments, - int streamingTokenRefreshRate) { + FallbackTreatmentsConfiguration fallbackTreatments) { _endpoint = endpoint; _eventsEndpoint = eventsEndpoint; _featuresRefreshRate = pollForFeatureChangesEveryNSeconds; @@ -229,7 +226,6 @@ private SplitClientConfig(String endpoint, _customHeaderDecorator = customHeaderDecorator; _alternativeHTTPModule = alternativeHTTPModule; _fallbackTreatments = fallbackTreatments; - _streamingTokenRefreshRate = streamingTokenRefreshRate; Properties props = new Properties(); try { @@ -450,8 +446,6 @@ public boolean isSdkEndpointOverridden() { public FallbackTreatmentsConfiguration fallbackTreatments() { return _fallbackTreatments; } - public int streamingTokenRefreshRate() { return _streamingTokenRefreshRate; } - public static final class Builder { private String _endpoint = SDK_ENDPOINT; private boolean _endpointSet = false; @@ -511,7 +505,6 @@ public static final class Builder { private CustomHeaderDecorator _customHeaderDecorator = null; private CustomHttpModule _alternativeHTTPModule = null; private FallbackTreatmentsConfiguration _fallbackTreatments; - private int _streamingTokenRefreshRate = 180; public Builder() { } @@ -1062,11 +1055,6 @@ public Builder threadFactory(ThreadFactory threadFactory) { return this; } - public Builder streamingTokenRefreshRate(int streamingTokenRefreshRate) { - _streamingTokenRefreshRate = streamingTokenRefreshRate; - return this; - } - private void verifyRates() { if (_featuresRefreshRate < 5 ) { throw new IllegalArgumentException("featuresRefreshRate must be >= 5: " + _featuresRefreshRate); @@ -1087,10 +1075,6 @@ private void verifyRates() { if(_telemetryRefreshRate < 60) { throw new IllegalStateException("_telemetryRefreshRate must be >= 60"); } - - if (_streamingTokenRefreshRate < 60) { - throw new IllegalStateException("_streamingTokenRefreshRate must be >= 60"); - } } private void verifyEndPoints() { @@ -1291,8 +1275,7 @@ public SplitClientConfig build() { _invalidSetsCount, _customHeaderDecorator, _alternativeHTTPModule, - _fallbackTreatments, - _streamingTokenRefreshRate); + _fallbackTreatments); } } } \ No newline at end of file diff --git a/client/src/main/java/io/split/engine/common/PushManagerImp.java b/client/src/main/java/io/split/engine/common/PushManagerImp.java index e27a0bc9..0bccd036 100644 --- a/client/src/main/java/io/split/engine/common/PushManagerImp.java +++ b/client/src/main/java/io/split/engine/common/PushManagerImp.java @@ -52,7 +52,6 @@ public class PushManagerImp implements PushManager { private final ScheduledExecutorService _scheduledExecutorService; private AtomicLong _expirationTime; private final TelemetryRuntimeProducer _telemetryRuntimeProducer; - private final int _streamingTokenRefreshRate; @VisibleForTesting /* package private */ PushManagerImp(AuthApiClient authApiClient, @@ -61,8 +60,7 @@ public class PushManagerImp implements PushManager { Worker segmentWorker, PushStatusTracker pushStatusTracker, TelemetryRuntimeProducer telemetryRuntimeProducer, - ThreadFactory threadFactory, - int streamingTokenRefreshRate) { + ThreadFactory threadFactory) { _authApiClient = checkNotNull(authApiClient); _eventSourceClient = checkNotNull(eventSourceClient); @@ -72,7 +70,6 @@ public class PushManagerImp implements PushManager { _expirationTime = new AtomicLong(); _scheduledExecutorService = buildSingleThreadScheduledExecutor(threadFactory, "Split-SSERefreshToken-%d"); _telemetryRuntimeProducer = checkNotNull(telemetryRuntimeProducer); - _streamingTokenRefreshRate = streamingTokenRefreshRate; } public static PushManagerImp build(Synchronizer synchronizer, @@ -86,8 +83,7 @@ public static PushManagerImp build(Synchronizer synchronizer, SplitCacheProducer splitCacheProducer, FlagSetsFilter flagSetsFilter, RuleBasedSegmentCache ruleBasedSegmentCache, - RuleBasedSegmentParser ruleBasedSegmentParser, - int streamingTokenRefreshRate) { + RuleBasedSegmentParser ruleBasedSegmentParser) { FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, ruleBasedSegmentParser, splitCacheProducer, ruleBasedSegmentCache, telemetryRuntimeProducer, flagSetsFilter); Worker segmentWorker = new SegmentsWorkerImp(synchronizer); @@ -100,26 +96,23 @@ public static PushManagerImp build(Synchronizer synchronizer, segmentWorker, pushStatusTracker, telemetryRuntimeProducer, - threadFactory, - streamingTokenRefreshRate); + threadFactory); } @Override public void start() { - _log.debug("#1 - Start PushManagerImp"); try { lock.lock(); AuthenticationResponse response = _authApiClient.Authenticate(); _log.debug(String.format("Auth service response pushEnabled: %s", response.isPushEnabled())); if (response.isPushEnabled() && startSse(response.getToken(), response.getChannels())) { _log.debug("#2 - PushManagerImp connected"); - _expirationTime.set(_streamingTokenRefreshRate); + _expirationTime.set(response.getExpiration()); _telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.TOKEN_REFRESH.getType(), response.getExpiration(), System.currentTimeMillis())); return; } - _log.debug("#3 - PushManagerImp error"); cleanUpResources(); if (response.isRetry()) { _log.debug(String.format("Handling retry error response")); @@ -128,7 +121,6 @@ public void start() { _log.debug(String.format("Auth service response is disabled: %s", response.getToken())); _pushStatusTracker.forcePushDisable(); } - _log.debug("#4 - PushManagerImp error"); } catch (Exception e) { _log.debug("Exception in PushManager start: " + e.getMessage()); } finally { @@ -138,11 +130,9 @@ public void start() { @Override public void stop() { - _log.debug("#1 - Stopping PushManagerImp"); try { lock.lock(); cleanUpResources(); - _log.debug("#2 - Stopped PushManagerImp"); } catch (Exception e) { _log.debug("Exception in stopping push manager: " + e.getMessage()); } finally { @@ -154,11 +144,8 @@ public void stop() { public void scheduleConnectionReset() { _log.debug(String.format("scheduleNextTokenRefresh in %s SECONDS", _expirationTime)); _nextTokenRefreshTask = _scheduledExecutorService.schedule(() -> { - _log.debug("#1 - Starting scheduleNextTokenRefresh ..."); stop(); - _log.debug("#2 - Finished to stop all streaming engine"); start(); - _log.debug("#3 - Finished to start streaming connection"); }, _expirationTime.get(), TimeUnit.SECONDS); } @@ -175,9 +162,7 @@ private boolean startSse(String token, String channels) { @Override public void startWorkers() { try { - _log.debug("Starting featureflag worker"); _featureFlagsWorker.start(); - _log.debug("Starting segment worker"); _segmentWorker.start(); } catch (Exception e) { _log.debug("Exception in starting workers: " + e.getMessage()); @@ -187,9 +172,7 @@ public void startWorkers() { @Override public void stopWorkers() { try { - _log.debug("Stopping featureflag worker"); _featureFlagsWorker.stop(); - _log.debug("Stopping segment worker"); _segmentWorker.stop(); } catch (Exception e) { _log.debug("Exception in stopping workers: " + e.getMessage()); @@ -197,15 +180,10 @@ public void stopWorkers() { } private void cleanUpResources() { - _log.debug("Starting cleanUpResources - #1"); _eventSourceClient.stop(); - _log.debug("cleanUpResources - #2"); stopWorkers(); if (_nextTokenRefreshTask != null) { - _log.debug("Cancel nextTokenRefreshTask"); _nextTokenRefreshTask.cancel(false); - _log.debug("Finished cleanUpResources - #3 - Finished cancel nextTokenRefreshTask"); } - _log.debug("Finished cleanUpResources - #4"); } } diff --git a/client/src/main/java/io/split/engine/common/SyncManagerImp.java b/client/src/main/java/io/split/engine/common/SyncManagerImp.java index a5cbc6df..57faa07b 100644 --- a/client/src/main/java/io/split/engine/common/SyncManagerImp.java +++ b/client/src/main/java/io/split/engine/common/SyncManagerImp.java @@ -116,8 +116,7 @@ public static SyncManagerImp build(SplitTasks splitTasks, splitCacheProducer, flagSetsFilter, ruleBasedSegmentCache, - ruleBasedSegmentParser, - config.streamingTokenRefreshRate()); + ruleBasedSegmentParser); return new SyncManagerImp(splitTasks, config.streamingEnabled(), diff --git a/client/src/main/java/io/split/engine/sse/client/SSEClient.java b/client/src/main/java/io/split/engine/sse/client/SSEClient.java index 8378bff0..4b511406 100644 --- a/client/src/main/java/io/split/engine/sse/client/SSEClient.java +++ b/client/src/main/java/io/split/engine/sse/client/SSEClient.java @@ -9,6 +9,7 @@ import org.apache.hc.client5.http.classic.methods.HttpGet; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; +import org.apache.hc.core5.io.CloseMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -121,12 +122,8 @@ public void close() { _forcedStop.set(true); if (_state.compareAndSet(ConnectionState.OPEN, ConnectionState.CLOSED)) { if (_ongoingResponse.get() != null) { - try { - _ongoingRequest.get().abort(); - _ongoingResponse.get().close(); - } catch (IOException e) { - _log.debug(String.format("SSEClient close forced: %s", e.getMessage())); - } + _ongoingRequest.get().abort(); + _ongoingResponse.get().close(CloseMode.IMMEDIATE); } } } catch (Exception e) { @@ -195,14 +192,7 @@ private void connectAndLoop(URI uri, CountDownLatch signal) { _log.warn(e.getMessage(), e); _statusCallback.apply(StatusMessage.NONRETRYABLE_ERROR); } finally { - _log.debug(String.format("Attempt to close SSE connection")); - try { - _ongoingResponse.get().close(); - } catch (IOException e) { - _log.debug(String.format("SSE connection closing exception: %s", e.getMessage())); - _log.debug(e.getMessage()); - } - + _ongoingResponse.get().close(CloseMode.IMMEDIATE); _state.set(ConnectionState.CLOSED); _log.debug("SSEClient finished."); _forcedStop.set(false); diff --git a/client/src/main/java/io/split/engine/sse/workers/Worker.java b/client/src/main/java/io/split/engine/sse/workers/Worker.java index 7aa1d553..b5ba84f2 100644 --- a/client/src/main/java/io/split/engine/sse/workers/Worker.java +++ b/client/src/main/java/io/split/engine/sse/workers/Worker.java @@ -22,7 +22,6 @@ public Worker(String workerName) { public void start() { if (_running.compareAndSet(false, true)) { - _log.debug(String.format("%s Worker starting ...", _workerName)); _queue.clear(); _thread = new Thread( this); _thread.setName(String.format("%s-worker", _workerName)); @@ -36,7 +35,6 @@ public void start() { public void stop() { if (_running.compareAndSet(true, false)) { - _log.debug(String.format("%s stopping Worker", _workerName)); _thread.interrupt(); _log.debug(String.format("%s Worked stopped.", _workerName)); } else { diff --git a/client/src/test/java/io/split/engine/common/PushManagerTest.java b/client/src/test/java/io/split/engine/common/PushManagerTest.java index 5aef23be..33ce1341 100644 --- a/client/src/test/java/io/split/engine/common/PushManagerTest.java +++ b/client/src/test/java/io/split/engine/common/PushManagerTest.java @@ -40,8 +40,7 @@ public void setUp() { _segmentsWorkerImp, _pushStatusTracker, _telemetryStorage, - null, - 180); + null); } @Test diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index fb46621b..ee142580 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -5,10 +5,10 @@ java-client-parent io.split.client - 4.18.1-rc3 + 4.18.1-rc5 4.0.0 - 4.18.1-rc3 + 4.18.1-rc5 okhttp-modules jar http-modules diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml index a1dfab96..ea373868 100644 --- a/pluggable-storage/pom.xml +++ b/pluggable-storage/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.1-rc3 + 4.18.1-rc5 2.1.0 diff --git a/pom.xml b/pom.xml index a0f53920..2c91f89d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.split.client java-client-parent - 4.18.1-rc3 + 4.18.1-rc5 diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml index 6037a72c..915e2161 100644 --- a/redis-wrapper/pom.xml +++ b/redis-wrapper/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.1-rc3 + 4.18.1-rc5 redis-wrapper 3.1.1 diff --git a/testing/pom.xml b/testing/pom.xml index 9928b02b..18126ffe 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -5,7 +5,7 @@ io.split.client java-client-parent - 4.18.1-rc3 + 4.18.1-rc5 java-client-testing jar From 9799b0be4c245b1e5c037a81e600097cd4869b76 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 24 Sep 2025 10:12:13 -0700 Subject: [PATCH 08/11] polish --- .../src/main/java/io/split/engine/common/PushManagerImp.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/src/main/java/io/split/engine/common/PushManagerImp.java b/client/src/main/java/io/split/engine/common/PushManagerImp.java index 0bccd036..9c8f6954 100644 --- a/client/src/main/java/io/split/engine/common/PushManagerImp.java +++ b/client/src/main/java/io/split/engine/common/PushManagerImp.java @@ -106,7 +106,6 @@ public void start() { AuthenticationResponse response = _authApiClient.Authenticate(); _log.debug(String.format("Auth service response pushEnabled: %s", response.isPushEnabled())); if (response.isPushEnabled() && startSse(response.getToken(), response.getChannels())) { - _log.debug("#2 - PushManagerImp connected"); _expirationTime.set(response.getExpiration()); _telemetryRuntimeProducer.recordStreamingEvents(new StreamingEvent(StreamEventsEnum.TOKEN_REFRESH.getType(), response.getExpiration(), System.currentTimeMillis())); @@ -115,10 +114,8 @@ public void start() { cleanUpResources(); if (response.isRetry()) { - _log.debug(String.format("Handling retry error response")); _pushStatusTracker.handleSseStatus(SSEClient.StatusMessage.RETRYABLE_ERROR); } else { - _log.debug(String.format("Auth service response is disabled: %s", response.getToken())); _pushStatusTracker.forcePushDisable(); } } catch (Exception e) { From 0d443eeefee726898eb1370e853e0fdfb772c5ff Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 24 Sep 2025 11:18:29 -0700 Subject: [PATCH 09/11] polish --- client/pom.xml | 7 +------ .../main/java/io/split/engine/common/PushManagerImp.java | 3 +++ okhttp-modules/pom.xml | 7 +------ 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/client/pom.xml b/client/pom.xml index d3db7ad9..68122d06 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -171,12 +171,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.5 - - - org.apache.httpcomponents.core5 - httpcore5 - 5.3.5 + 5.4.1 com.google.code.gson diff --git a/client/src/main/java/io/split/engine/common/PushManagerImp.java b/client/src/main/java/io/split/engine/common/PushManagerImp.java index 9c8f6954..d7b5d8ae 100644 --- a/client/src/main/java/io/split/engine/common/PushManagerImp.java +++ b/client/src/main/java/io/split/engine/common/PushManagerImp.java @@ -129,6 +129,7 @@ public void start() { public void stop() { try { lock.lock(); + _log.debug("Stopping PushManagerImp"); cleanUpResources(); } catch (Exception e) { _log.debug("Exception in stopping push manager: " + e.getMessage()); @@ -141,6 +142,7 @@ public void stop() { public void scheduleConnectionReset() { _log.debug(String.format("scheduleNextTokenRefresh in %s SECONDS", _expirationTime)); _nextTokenRefreshTask = _scheduledExecutorService.schedule(() -> { + _log.debug("Starting scheduleNextTokenRefresh ..."); stop(); start(); }, _expirationTime.get(), TimeUnit.SECONDS); @@ -180,6 +182,7 @@ private void cleanUpResources() { _eventSourceClient.stop(); stopWorkers(); if (_nextTokenRefreshTask != null) { + _log.debug("Cancel nextTokenRefreshTask"); _nextTokenRefreshTask.cancel(false); } } diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index ee142580..5329b83f 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -55,12 +55,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.5 - - - org.apache.httpcomponents.core5 - httpcore5 - 5.3.5 + 5.4.1 From cd45ee18b66a60a4cdbf8a356286e2c839777b0f Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 24 Sep 2025 12:46:56 -0700 Subject: [PATCH 10/11] update httclient5 version --- client/pom.xml | 2 +- okhttp-modules/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/pom.xml b/client/pom.xml index 68122d06..c2a53896 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -171,7 +171,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.1 + 5.5 com.google.code.gson diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index 5329b83f..1c241dbf 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -55,7 +55,7 @@ org.apache.httpcomponents.client5 httpclient5 - 5.4.1 + 5.5 From d69fa80df1e16b002d918ada992b72ee961c5c5b Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Tue, 30 Sep 2025 08:38:37 -0700 Subject: [PATCH 11/11] updated version and changes --- CHANGES.txt | 3 +++ client/pom.xml | 4 ++-- okhttp-modules/pom.xml | 4 ++-- pluggable-storage/pom.xml | 2 +- pom.xml | 2 +- redis-wrapper/pom.xml | 2 +- testing/pom.xml | 4 ++-- 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 1001aa2e..ff03376f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,6 @@ +4.18.1 (Sep 30, 2025) +- Fixed an issue where Streaming client hangs during token renew process. + 4.18.0 (Sep 12, 2025) - Added new configuration for Fallback Treatments, which allows setting a treatment value and optional config to be returned in place of "control", either globally or by flag. Read more in our docs. diff --git a/client/pom.xml b/client/pom.xml index c2a53896..93bb93ee 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -5,9 +5,9 @@ io.split.client java-client-parent - 4.18.1-rc5 + 4.18.1 - 4.18.1-rc5 + 4.18.1 java-client jar Java Client diff --git a/okhttp-modules/pom.xml b/okhttp-modules/pom.xml index 1c241dbf..2971f627 100644 --- a/okhttp-modules/pom.xml +++ b/okhttp-modules/pom.xml @@ -5,10 +5,10 @@ java-client-parent io.split.client - 4.18.1-rc5 + 4.18.1 4.0.0 - 4.18.1-rc5 + 4.18.1 okhttp-modules jar http-modules diff --git a/pluggable-storage/pom.xml b/pluggable-storage/pom.xml index ea373868..0b67454d 100644 --- a/pluggable-storage/pom.xml +++ b/pluggable-storage/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.1-rc5 + 4.18.1 2.1.0 diff --git a/pom.xml b/pom.xml index 2c91f89d..58fa6680 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.split.client java-client-parent - 4.18.1-rc5 + 4.18.1 diff --git a/redis-wrapper/pom.xml b/redis-wrapper/pom.xml index 915e2161..0794a708 100644 --- a/redis-wrapper/pom.xml +++ b/redis-wrapper/pom.xml @@ -6,7 +6,7 @@ java-client-parent io.split.client - 4.18.1-rc5 + 4.18.1 redis-wrapper 3.1.1 diff --git a/testing/pom.xml b/testing/pom.xml index 18126ffe..6439f616 100644 --- a/testing/pom.xml +++ b/testing/pom.xml @@ -5,11 +5,11 @@ io.split.client java-client-parent - 4.18.1-rc5 + 4.18.1 java-client-testing jar - 4.18.1-rc3 + 4.18.1 Java Client For Testing Testing suite for Java SDK for Split