瀏覽代碼

Tighten up `ThreadPool#assertCurrentThreadPool` (#108943)

As suggested in #108934, we can extract the exact executor name from the
thread name with some simple string manipulations. Using this utility,
this commit tightens up the existing assertions about the current
executor.

Co-authored-by: Henning Andersen <henning.andersen@elastic.co>
David Turner 1 年之前
父節點
當前提交
331b78fde0

+ 10 - 0
server/src/main/java/org/elasticsearch/common/util/concurrent/EsExecutors.java

@@ -266,6 +266,16 @@ public class EsExecutors {
         return "elasticsearch" + (nodeName.isEmpty() ? "" : "[") + nodeName + (nodeName.isEmpty() ? "" : "]") + "[" + namePrefix + "]";
     }
 
+    public static String executorName(String threadName) {
+        // subtract 2 to avoid the `]` of the thread number part.
+        int executorNameEnd = threadName.lastIndexOf(']', threadName.length() - 2);
+        int executorNameStart = threadName.lastIndexOf('[', executorNameEnd);
+        if (executorNameStart == -1 || executorNameEnd - executorNameStart <= 1) {
+            return null;
+        }
+        return threadName.substring(executorNameStart + 1, executorNameEnd);
+    }
+
     public static ThreadFactory daemonThreadFactory(Settings settings, String namePrefix) {
         return daemonThreadFactory(threadName(settings, namePrefix));
     }

+ 2 - 1
server/src/main/java/org/elasticsearch/threadpool/ThreadPool.java

@@ -1118,9 +1118,10 @@ public class ThreadPool implements ReportingService<ThreadPoolInfo>, Scheduler {
 
     public static boolean assertCurrentThreadPool(String... permittedThreadPoolNames) {
         final var threadName = Thread.currentThread().getName();
+        final var executorName = EsExecutors.executorName(threadName);
         assert threadName.startsWith("TEST-")
             || threadName.startsWith("LuceneTestCase")
-            || Arrays.stream(permittedThreadPoolNames).anyMatch(n -> threadName.contains('[' + n + ']'))
+            || Arrays.asList(permittedThreadPoolNames).contains(executorName)
             : threadName + " not in " + Arrays.toString(permittedThreadPoolNames) + " nor a test thread";
         return true;
     }

+ 11 - 0
server/src/test/java/org/elasticsearch/common/util/concurrent/EsExecutorsTests.java

@@ -626,6 +626,17 @@ public class EsExecutorsTests extends ESTestCase {
         );
     }
 
+    public void testParseExecutorName() throws InterruptedException {
+        final var executorName = randomAlphaOfLength(10);
+        final var threadFactory = EsExecutors.daemonThreadFactory(rarely() ? null : randomAlphaOfLength(10), executorName);
+        final var thread = threadFactory.newThread(() -> {});
+        try {
+            assertThat(EsExecutors.executorName(thread.getName()), equalTo(executorName));
+        } finally {
+            thread.join();
+        }
+    }
+
     private static void runRejectOnShutdownTest(ExecutorService executor) {
         for (int i = between(0, 10); i > 0; i--) {
             final var delayMillis = between(0, 100);