Skip to content

Commit ba277bf

Browse files
authored
feat: flagd provider creates named daemon threads for error executor (#1625)
Signed-off-by: jarebudev <23311805+jarebudev@users.noreply.github.com>
1 parent 48df358 commit ba277bf

File tree

3 files changed

+79
-2
lines changed

3 files changed

+79
-2
lines changed

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public FlagdProvider(final FlagdOptions options) {
9191
}
9292
hooks.add(new SyncMetadataHook(this::getEnrichedContext));
9393
contextEnricher = options.getContextEnricher();
94-
errorExecutor = Executors.newSingleThreadScheduledExecutor();
94+
errorExecutor = Executors.newSingleThreadScheduledExecutor(new FlagdThreadFactory("flagd-provider-thread"));
9595
gracePeriod = options.getRetryGracePeriod();
9696
deadline = options.getDeadline();
9797
}
@@ -105,7 +105,7 @@ public FlagdProvider(final FlagdOptions options) {
105105
deadline = Config.DEFAULT_DEADLINE;
106106
gracePeriod = Config.DEFAULT_STREAM_RETRY_GRACE_PERIOD;
107107
hooks.add(new SyncMetadataHook(this::getEnrichedContext));
108-
errorExecutor = Executors.newSingleThreadScheduledExecutor();
108+
errorExecutor = Executors.newSingleThreadScheduledExecutor(new FlagdThreadFactory("flagd-provider-thread"));
109109
if (initialized) {
110110
this.syncResources.initialize();
111111
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package dev.openfeature.contrib.providers.flagd;
2+
3+
import java.util.Objects;
4+
import java.util.concurrent.ThreadFactory;
5+
import java.util.concurrent.atomic.AtomicInteger;
6+
7+
/**
8+
* Thread factory for the Flagd provider to allow named daemon threads to be created.
9+
*/
10+
class FlagdThreadFactory implements ThreadFactory {
11+
12+
private final AtomicInteger counter = new AtomicInteger();
13+
private final String namePrefix;
14+
15+
/**
16+
* {@link FlagdThreadFactory}'s constructor.
17+
*
18+
* @param namePrefix Prefix used for setting the new thread's name.
19+
*/
20+
FlagdThreadFactory(String namePrefix) {
21+
this.namePrefix = Objects.requireNonNull(namePrefix, "namePrefix must not be null");
22+
}
23+
24+
@Override
25+
public Thread newThread(Runnable runnable) {
26+
final Thread thread = new Thread(runnable);
27+
thread.setDaemon(true);
28+
thread.setName(namePrefix + "-" + counter.incrementAndGet());
29+
return thread;
30+
}
31+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package dev.openfeature.contrib.providers.flagd;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
6+
import org.junit.jupiter.api.Test;
7+
8+
class FlagdThreadFactoryTest {
9+
10+
private static final String THREAD_NAME = "testthread";
11+
private final Runnable runnable = () -> {};
12+
13+
@Test
14+
void verifyThreadFactoryThrowsNullPointerExceptionWhenNamePrefixIsNull() {
15+
16+
// Then
17+
var exception = assertThrows(NullPointerException.class, () -> {
18+
// When
19+
new FlagdThreadFactory(null);
20+
});
21+
assertThat(exception.toString()).contains("namePrefix must not be null");
22+
}
23+
24+
@Test
25+
void verifyNewThreadHasNamePrefix() {
26+
27+
var flagdThreadFactory = new FlagdThreadFactory(THREAD_NAME);
28+
var thread = flagdThreadFactory.newThread(runnable);
29+
30+
assertThat(thread.getName()).isEqualTo(THREAD_NAME + "-1");
31+
assertThat(thread.isDaemon()).isTrue();
32+
}
33+
34+
@Test
35+
void verifyNewThreadHasNamePrefixWithIncrement() {
36+
37+
var flagdThreadFactory = new FlagdThreadFactory(THREAD_NAME);
38+
var threadOne = flagdThreadFactory.newThread(runnable);
39+
var threadTwo = flagdThreadFactory.newThread(runnable);
40+
41+
assertThat(threadOne.getName()).isEqualTo(THREAD_NAME + "-1");
42+
assertThat(threadOne.isDaemon()).isTrue();
43+
assertThat(threadTwo.getName()).isEqualTo(THREAD_NAME + "-2");
44+
assertThat(threadTwo.isDaemon()).isTrue();
45+
}
46+
}

0 commit comments

Comments
 (0)