|
43 | 43 | import org.opensearch.threadpool.RunnableTaskExecutionListener;
|
44 | 44 | import org.opensearch.threadpool.TaskAwareRunnable;
|
45 | 45 |
|
| 46 | +import java.security.AccessController; |
| 47 | +import java.security.PrivilegedAction; |
46 | 48 | import java.util.List;
|
47 | 49 | import java.util.Optional;
|
48 | 50 | import java.util.concurrent.AbstractExecutorService;
|
@@ -384,6 +386,19 @@ public static ThreadFactory daemonThreadFactory(String namePrefix) {
|
384 | 386 | return new OpenSearchThreadFactory(namePrefix);
|
385 | 387 | }
|
386 | 388 |
|
| 389 | + public static ThreadFactory privilegedDaemonThreadFactory(Settings settings, String namePrefix) { |
| 390 | + return privilegedDaemonThreadFactory(threadName(settings, namePrefix)); |
| 391 | + } |
| 392 | + |
| 393 | + public static ThreadFactory privilegedDaemonThreadFactory(String nodeName, String namePrefix) { |
| 394 | + assert nodeName != null && false == nodeName.isEmpty(); |
| 395 | + return privilegedDaemonThreadFactory(threadName(nodeName, namePrefix)); |
| 396 | + } |
| 397 | + |
| 398 | + public static ThreadFactory privilegedDaemonThreadFactory(String namePrefix) { |
| 399 | + return new PrivilegedOpenSearchThreadFactory(namePrefix); |
| 400 | + } |
| 401 | + |
387 | 402 | /**
|
388 | 403 | * A thread factory
|
389 | 404 | *
|
@@ -411,6 +426,42 @@ public Thread newThread(Runnable r) {
|
411 | 426 |
|
412 | 427 | }
|
413 | 428 |
|
| 429 | + /** |
| 430 | + * A thread factory |
| 431 | + * |
| 432 | + * @opensearch.internal |
| 433 | + */ |
| 434 | + static class PrivilegedOpenSearchThreadFactory implements ThreadFactory { |
| 435 | + |
| 436 | + final ThreadGroup group; |
| 437 | + final AtomicInteger threadNumber = new AtomicInteger(1); |
| 438 | + final String namePrefix; |
| 439 | + |
| 440 | + @SuppressWarnings("removal") |
| 441 | + PrivilegedOpenSearchThreadFactory(String namePrefix) { |
| 442 | + this.namePrefix = namePrefix; |
| 443 | + SecurityManager s = System.getSecurityManager(); |
| 444 | + group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); |
| 445 | + } |
| 446 | + |
| 447 | + @Override |
| 448 | + public Thread newThread(Runnable r) { |
| 449 | + final Thread t = new Thread(group, new Runnable() { |
| 450 | + @SuppressWarnings({ "deprecation", "removal" }) |
| 451 | + @Override |
| 452 | + public void run() { |
| 453 | + AccessController.doPrivileged((PrivilegedAction<Void>) () -> { |
| 454 | + r.run(); |
| 455 | + return null; |
| 456 | + }); |
| 457 | + } |
| 458 | + }, namePrefix + "[T#" + threadNumber.getAndIncrement() + "]", 0); |
| 459 | + t.setDaemon(true); |
| 460 | + return t; |
| 461 | + } |
| 462 | + |
| 463 | + } |
| 464 | + |
414 | 465 | /**
|
415 | 466 | * Cannot instantiate.
|
416 | 467 | */
|
|
0 commit comments