Skip to content

Commit a2339e1

Browse files
committed
Adjustments to testing and failed flush behavior.
1 parent bd8471b commit a2339e1

4 files changed

Lines changed: 420 additions & 4 deletions

File tree

lib/shared/internal/src/main/java/com/launchdarkly/sdk/internal/events/DefaultEventProcessor.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -624,9 +624,16 @@ private void triggerFlush(EventBuffer outbox, BlockingQueue<FlushPayload> payloa
624624
} else {
625625
logger.debug("Skipped flushing because all workers are busy");
626626
// All the workers are busy so we can't flush now; keep the events in our state
627-
// Only restore if using single summarizer (not per-context)
628-
if (outbox.summarizer != null && !payload.summaries.isEmpty()) {
629-
outbox.summarizer.restoreTo(payload.summaries.get(0));
627+
if (outbox.perContextSummarization) {
628+
// Per-context mode: restore all summaries
629+
if (outbox.multiContextSummarizer != null && !payload.summaries.isEmpty()) {
630+
outbox.multiContextSummarizer.restoreTo(payload.summaries);
631+
}
632+
} else {
633+
// Single summary mode: restore single summary
634+
if (outbox.summarizer != null && !payload.summaries.isEmpty()) {
635+
outbox.summarizer.restoreTo(payload.summaries.get(0));
636+
}
630637
}
631638
synchronized(busyFlushWorkersCount) {
632639
busyFlushWorkersCount.decrementAndGet();

lib/shared/internal/src/main/java/com/launchdarkly/sdk/internal/events/MultiContextEventSummarizer.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,23 @@ List<EventSummarizer.EventSummary> getSummariesAndReset() {
7070
return summaries;
7171
}
7272

73+
/**
74+
* Restores the summarizer state from a previous snapshot. This is used when a flush
75+
* operation fails and we need to keep the summary data for the next attempt.
76+
*
77+
* @param previousSummaries the list of summaries to restore
78+
*/
79+
void restoreTo(List<EventSummarizer.EventSummary> previousSummaries) {
80+
summarizersByContext.clear();
81+
for (EventSummarizer.EventSummary summary : previousSummaries) {
82+
if (summary.context != null && !summary.isEmpty()) {
83+
EventSummarizer summarizer = new EventSummarizer(summary.context);
84+
summarizer.restoreTo(summary);
85+
summarizersByContext.put(summary.context, summarizer);
86+
}
87+
}
88+
}
89+
7390
/**
7491
* Returns true if there is no summary data for any context.
7592
*

lib/shared/internal/src/test/java/com/launchdarkly/sdk/internal/events/BaseEventTest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ public static class EventsConfigurationBuilder {
333333
private boolean initiallyInBackground = false;
334334
private boolean initiallyOffline = false;
335335
private Set<AttributeRef> privateAttributes = new HashSet<>();
336+
private boolean perContextSummarization = false;
336337

337338
public EventsConfiguration build() {
338339
return new EventsConfiguration(
@@ -347,7 +348,8 @@ public EventsConfiguration build() {
347348
flushIntervalMillis,
348349
initiallyInBackground,
349350
initiallyOffline,
350-
privateAttributes
351+
privateAttributes,
352+
perContextSummarization
351353
);
352354
}
353355

@@ -410,6 +412,11 @@ public EventsConfigurationBuilder privateAttributes(Set<AttributeRef> privateAtt
410412
this.privateAttributes = privateAttributes;
411413
return this;
412414
}
415+
416+
public EventsConfigurationBuilder perContextSummarization(boolean perContextSummarization) {
417+
this.perContextSummarization = perContextSummarization;
418+
return this;
419+
}
413420
}
414421

415422
public static EventContextDeduplicator contextDeduplicatorThatAlwaysSaysKeysAreNew() {

0 commit comments

Comments
 (0)