From 7686d5fb9a0923663eae6d9eab01d414ae835d36 Mon Sep 17 00:00:00 2001 From: Ryan Lamb <4955475+kinyoklion@users.noreply.github.com> Date: Wed, 4 Feb 2026 09:38:50 -0800 Subject: [PATCH 1/2] chore: Log interrupted exception, address comment todo. --- .../main/java/com/launchdarkly/sdk/server/PollingBase.java | 3 ++- .../launchdarkly/sdk/server/PollingSynchronizerImpl.java | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingBase.java b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingBase.java index 5cd1325a..398a1b55 100644 --- a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingBase.java +++ b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingBase.java @@ -119,7 +119,8 @@ protected CompletableFuture poll(Selector selector, boolean on ); return FDv2SourceResult.changeSet(converted, fdv1Fallback); } catch (Exception e) { - // TODO: Do we need to be more specific about the exception type here? + // Whatever exception happened here means we couldn't handle the data. So we are going to + // treat that as invalid data. DataSourceStatusProvider.ErrorInfo info = new DataSourceStatusProvider.ErrorInfo( DataSourceStatusProvider.ErrorKind.INVALID_DATA, 0, diff --git a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingSynchronizerImpl.java b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingSynchronizerImpl.java index 9169a018..59967449 100644 --- a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingSynchronizerImpl.java +++ b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingSynchronizerImpl.java @@ -17,6 +17,8 @@ class PollingSynchronizerImpl extends PollingBase implements Synchronizer { private final IterableAsyncQueue resultQueue = new IterableAsyncQueue<>(); + private final LDLogger logger; + public PollingSynchronizerImpl( FDv2Requestor requestor, LDLogger logger, @@ -25,6 +27,7 @@ public PollingSynchronizerImpl( Duration pollInterval ) { super(requestor, logger.subLogger(Loggers.POLLING_SYNCHRONIZER)); + this.logger = logger; this.selectorSource = selectorSource; synchronized (this) { @@ -72,7 +75,9 @@ private void doPoll() { resultQueue.put(res); } } catch (InterruptedException | ExecutionException e) { - // TODO: Determine if handling is needed. + // If this happens, then the thread running the poll has been interrupted, or the task has been canceled. + // This would likely be the result of a shutdown, so we are just logging this for debugging purposes. + logger.debug("Polling thread interrupted: {}", e.toString()); } } From 5d0ff6e9874e24776a729f1f1ffef3eec6131cb8 Mon Sep 17 00:00:00 2001 From: Ryan Lamb <4955475+kinyoklion@users.noreply.github.com> Date: Wed, 4 Feb 2026 11:50:23 -0800 Subject: [PATCH 2/2] PR feedback. --- .../java/com/launchdarkly/sdk/server/PollingBase.java | 2 +- .../sdk/server/PollingSynchronizerImpl.java | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingBase.java b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingBase.java index 398a1b55..2ad4ac85 100644 --- a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingBase.java +++ b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingBase.java @@ -17,7 +17,7 @@ class PollingBase { private final FDv2Requestor requestor; - private final LDLogger logger; + protected final LDLogger logger; public PollingBase(FDv2Requestor requestor, LDLogger logger) { this.requestor = requestor; diff --git a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingSynchronizerImpl.java b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingSynchronizerImpl.java index 59967449..65913b36 100644 --- a/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingSynchronizerImpl.java +++ b/lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/PollingSynchronizerImpl.java @@ -17,8 +17,6 @@ class PollingSynchronizerImpl extends PollingBase implements Synchronizer { private final IterableAsyncQueue resultQueue = new IterableAsyncQueue<>(); - private final LDLogger logger; - public PollingSynchronizerImpl( FDv2Requestor requestor, LDLogger logger, @@ -27,7 +25,6 @@ public PollingSynchronizerImpl( Duration pollInterval ) { super(requestor, logger.subLogger(Loggers.POLLING_SYNCHRONIZER)); - this.logger = logger; this.selectorSource = selectorSource; synchronized (this) { @@ -74,10 +71,14 @@ private void doPoll() { } else { resultQueue.put(res); } - } catch (InterruptedException | ExecutionException e) { - // If this happens, then the thread running the poll has been interrupted, or the task has been canceled. + } catch (InterruptedException e) { // This would likely be the result of a shutdown, so we are just logging this for debugging purposes. + // Same with the ExecutionException below. logger.debug("Polling thread interrupted: {}", e.toString()); + Thread.currentThread().interrupt(); + } + catch(ExecutionException e) { + logger.debug("Polling thread execution exception: {}", e.toString()); } }