[
https://issues.apache.org/jira/browse/FLINK-29330?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17611520#comment-17611520
]
Chesnay Schepler commented on FLINK-29330:
------------------------------------------
Should LeaderRetrievalService really implement it though? It doesn't seem to be
doing asynchronously; or are you proposing to keep that as an implementation
detail?
> Provide better logs of MiniCluster shutdown procedure
> -----------------------------------------------------
>
> Key: FLINK-29330
> URL: https://issues.apache.org/jira/browse/FLINK-29330
> Project: Flink
> Issue Type: Technical Debt
> Components: Tests
> Reporter: Chesnay Schepler
> Assignee: Chesnay Schepler
> Priority: Major
> Fix For: 1.17.0
>
>
> I recently ran into an issue where the shutdown of a MiniCluster timed out.
> The logs weren't helpful at all and I had to go in and check every
> asynchronously component for whether _that_ component was the cause.
> The main issues were that various components don't log anything at all, or
> that when they did it wasn't clear who owned that component.
> I'd like to add a util that makes it easier for us log the start/stop of a
> shutdown procedure,
> {code:java}
> public class ShutdownLog {
> /**
> * Logs the beginning and end of the shutdown procedure for the given
> component.
> *
> * <p>This method accepts a {@link Supplier} instead of a {@link
> CompletableFuture} because the
> * latter usually required implies the shutdown to already have begun.
> *
> * @param log Logger of owning component
> * @param component component that will be shut down
> * @param shutdownTrigger component shutdown trigger
> * @return termination future of the component
> */
> public static <C> CompletableFuture<C> logShutdown(
> Logger log, String component, Supplier<CompletableFuture<C>>
> shutdownTrigger) {
> log.debug("Starting shutdown of {}.", component);
> return FutureUtils.logCompletion(log, "shutdown of " + component,
> shutdownTrigger.get());
> }
> }
> public class FutureUtils {
> public static <T> CompletableFuture<T> logCompletion(
> Logger log, String action, CompletableFuture<T> future) {
> future.handle(
> (t, throwable) -> {
> if (throwable == null) {
> log.debug("Completed {}.", action);
> } else {
> log.debug("Failed {}.", action, throwable);
> }
> return null;
> });
> return future;
> }
> ...
> {code}
> and extend the AutoCloseableAsync interface for an easy opt-in and customized
> logging:
> {code:java}
> default CompletableFuture<Void> closeAsync(Logger log) {
> return ShutdownLog.logShutdown(log, getClass().getSimpleName(),
> this::closeAsync);
> }
> {code}
> MiniCluster example usages:
> {code:java}
> -terminationFutures.add(dispatcherResourceManagerComponent.closeAsync())
> +terminationFutures.add(dispatcherResourceManagerComponent.closeAsync(LOG))
> {code}
> {code:java}
> -return ExecutorUtils.nonBlockingShutdown(
> - executorShutdownTimeoutMillis, TimeUnit.MILLISECONDS, ioExecutor);
> +return ShutdownLog.logShutdown(
> + LOG,
> + "ioExecutor",
> + () ->
> + ExecutorUtils.nonBlockingShutdown(
> + executorShutdownTimeoutMillis,
> + TimeUnit.MILLISECONDS,
> + ioExecutor));
> {code}
> [~mapohl] I'm interested what you think about this.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)