Skip to content

Commit 985f100

Browse files
Change DefaultSharedIndexInformer constructor to use Threads.threadFactory
While internally, the controllers use `Threads.threadFactory`, `DefaultSharedIndexInformer` starts an ad-hoc thread. This makes it invisible to instrumentation setup via `Threads.setDefaultThreadFactory`. This changes the constructor to also use the same. Signed-off-by: Adrian Cole <[email protected]>
1 parent e18ff1a commit 985f100

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

util/src/main/java/io/kubernetes/client/informer/impl/DefaultSharedIndexInformer.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import io.kubernetes.client.informer.cache.Indexer;
2525
import io.kubernetes.client.informer.cache.ProcessorListener;
2626
import io.kubernetes.client.informer.cache.SharedProcessor;
27+
import io.kubernetes.client.util.Threads;
2728
import java.util.Deque;
2829
import java.util.List;
2930
import java.util.Map;
31+
import java.util.concurrent.ThreadFactory;
3032
import java.util.function.BiConsumer;
3133
import java.util.function.Function;
3234
import org.apache.commons.collections4.CollectionUtils;
@@ -142,8 +144,9 @@ public DefaultSharedIndexInformer(
142144
resyncCheckPeriodMillis,
143145
exceptionHandler);
144146

145-
controllerThread =
146-
new Thread(controller::run, "informer-controller-" + apiTypeClass.getSimpleName());
147+
ThreadFactory threadFactory =
148+
Threads.threadFactory("informer-controller-" + apiTypeClass.getSimpleName());
149+
controllerThread = threadFactory.newThread(controller::run);
147150
}
148151

149152
/** add event callback */

util/src/test/java/io/kubernetes/client/informer/impl/DefaultSharedIndexInformerTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,21 @@
1717
import io.kubernetes.client.informer.cache.Indexer;
1818
import io.kubernetes.client.openapi.models.V1Pod;
1919
import io.kubernetes.client.openapi.models.V1PodList;
20+
import io.kubernetes.client.util.Threads;
21+
import java.util.concurrent.Executors;
22+
import java.util.concurrent.ThreadFactory;
2023
import java.util.function.BiConsumer;
2124
import org.junit.Rule;
2225
import org.junit.Test;
2326
import org.mockito.Mock;
2427
import org.mockito.junit.MockitoJUnit;
2528
import org.mockito.junit.MockitoRule;
2629

30+
import static org.mockito.ArgumentMatchers.any;
31+
import static org.mockito.Mockito.verify;
32+
import static org.mockito.Mockito.verifyNoMoreInteractions;
33+
import static org.mockito.Mockito.when;
34+
2735
public class DefaultSharedIndexInformerTest {
2836

2937
private static final Class<V1Pod> anyApiType = V1Pod.class;
@@ -35,6 +43,25 @@ public class DefaultSharedIndexInformerTest {
3543
@Mock private DeltaFIFO deltaFIFOMock;
3644
@Mock private Indexer<V1Pod> indexerMock;
3745
@Mock private BiConsumer<Class<V1Pod>, Throwable> exceptionHandler;
46+
@Mock private ThreadFactory threadFactory;
47+
@Mock private Thread thread;
48+
49+
@Test
50+
public void testConstructorUsesDefaultThreadFactory() {
51+
when(threadFactory.newThread(any())).thenReturn(thread);
52+
53+
try {
54+
Threads.setDefaultThreadFactory(threadFactory);
55+
new DefaultSharedIndexInformer<>(
56+
anyApiType, listerWatcher, anyResyncPeriod, deltaFIFOMock, indexerMock, exceptionHandler);
57+
} finally { // revert to default
58+
Threads.setDefaultThreadFactory(Executors.defaultThreadFactory());
59+
}
60+
61+
verify(threadFactory).newThread(any());
62+
verify(thread).setName("informer-controller-V1Pod");
63+
verifyNoMoreInteractions(threadFactory, thread);
64+
}
3865

3966
@Test
4067
public void testConstructorWithExceptionHandlerExists() {

0 commit comments

Comments
 (0)