{"record":{"id":"45c3ada30f3b4ee5","repo":"pinpoint-apm/pinpoint","slug":"dnsexecutor-shutdown-failed","errorCode":null,"errorMessage":"dnsExecutor shutdown failed","messagePattern":"dnsExecutor shutdown failed","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java","lineNumber":116,"sourceCode":"        this.dnsExecutorService = dnsExecutorServiceProvider.get();\n        logger.info(\"dnsExecutorServiceProvider:{}\", dnsExecutorService);\n\n        this.reconnectScheduledExecutorService = reconnectScheduledExecutorProvider.get();\n        logger.info(\"reconnectScheduledExecutorServiceProvider:{}\", reconnectScheduledExecutorService);\n\n    }\n\n    @Override\n    public void shutdown() {\n        logger.info(\"shutdown()\");\n        IOUtils.closeQuietly(spanDataSender, (ex) -> logger.warn(\"spanDataSender close fail\", ex));\n        IOUtils.closeQuietly(statDataSender, (ex) -> logger.warn(\"statDataSender close fail\", ex));\n        IOUtils.closeQuietly(agentDataSender, (ex) -> logger.warn(\"agentDataSender close fail\", ex));\n        IOUtils.closeQuietly(metadataDataSender, (ex) -> logger.warn(\"metadataDataSender close fail\", ex));\n\n        if (dnsExecutorService != null) {\n            if (!MoreExecutors.shutdownAndAwaitTermination(dnsExecutorService, Duration.ofSeconds(3))) {\n                logger.warn(\"dnsExecutor shutdown failed\");\n            }\n        }\n        if (reconnectScheduledExecutorService != null) {\n            if (!MoreExecutors.shutdownAndAwaitTermination(reconnectScheduledExecutorService, Duration.ofSeconds(3))) {\n                logger.warn(\"reconnectScheduledExecutor shutdown failed\");\n            }\n        }\n        IOUtils.closeQuietly(reporter, (ex) -> logger.warn(\"reporter close fail\", ex));\n    }\n\n    @Override\n    public String toString() {\n        return \"GrpcModuleLifeCycle{\" +\n                \", agentDataSender=\" + agentDataSender +\n                \", metadataDataSender=\" + metadataDataSender +\n                \", spanDataSender=\" + spanDataSender +\n                \", statDataSender=\" + statDataSender +\n                \", dnsExecutorService=\" + dnsExecutorService +","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java#L98-L134","documentation":"During GrpcModuleLifeCycle.shutdown(), the dedicated DNS-resolution executor (dnsExecutorService, used by gRPC's DNS name resolver) is stopped with MoreExecutors.shutdownAndAwaitTermination with a 3-second timeout. If it does not terminate within 3 seconds, the code logs \"dnsExecutor shutdown failed\". It means lingering DNS-resolver threads may remain after shutdown — a thread-leak warning, not a fatal error.","triggerScenarios":"shutdown() invoked while a DNS lookup is in progress or blocked (slow/unresponsive DNS server), so the executor's tasks ignore the shutdown signal and the 3s awaitTermination elapses.","commonSituations":"Corporate networks with slow DNS resolvers; DNS server outage while stopping the agent; containers where DNS queries hang; stopping the agent immediately after startup while the first resolution is still running.","solutions":["Verify DNS server responsiveness (e.g. dig/nslookup from the agent host); fix resolver configuration in /etc/resolv.conf.","Configure gRPC to use an IP address or a faster resolver for the collector address to reduce DNS dependency.","Increase the 3s timeout in a patched GrpcModuleLifeCycle if your environment legitimately has slow DNS.","Check for leaked pinpoint/dns threads after shutdown with jstack; if only a warning, leak is small and bounded."],"exampleFix":"// before: hostname requires DNS lookup at shutdown\nprofiler.collector.span.ip=collector.pinpoint.local\n// after: avoid runtime DNS dependency\nprofiler.collector.span.ip=10.0.0.5","handlingStrategy":"fallback","validationCode":"// Pre-check DNS health before starting/stopping the agent\nboolean dnsOk = InetAddress.getByName(\"collector.pinpoint.local\") != null;","typeGuard":null,"tryCatchPattern":"try {\n    lifeCycle.shutdown();\n} catch (Exception e) {\n    logger.warn(\"shutdown warning ignored\", e);\n}","preventionTips":["Use a resolvable, fast DNS server or configure collector by IP.","Test DNS from the agent host (dig/nslookup) before deployment.","Monitor for lingering dnsExecutor threads after shutdown with jstack."],"tags":["grpc","dns","executor","shutdown","thread-leak"],"backgroundTag":"executor-shutdown-timeout","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}