{"record":{"id":"6335a9c41dd27c8d","repo":"pinpoint-apm/pinpoint","slug":"agentdatasender-close-fail","errorCode":null,"errorMessage":"agentDataSender close fail","messagePattern":"agentDataSender close fail","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java","lineNumber":111,"sourceCode":"        logger.info(\"spanDataSenderProvider:{}\", spanDataSender);\n\n        this.statDataSender = this.statDataSenderProvider.get();\n        logger.info(\"statDataSenderProvider:{}\", statDataSender);\n\n        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{\" +","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java#L93-L129","documentation":"In GrpcModuleLifeCycle.shutdown(), agentDataSender (used for agent information/handshake data) is closed with IOUtils.closeQuietly; any close exception is logged as \"agentDataSender close fail\". Like the sibling warnings, it is logged and shutdown proceeds.","triggerScenarios":"Closing agentDataSender at shutdown while its gRPC channel or stream is already failed/closed — e.g. lost connection to collector, channel shutdown already in progress, or pending RPC failing during close().","commonSituations":"Collector restarted before agent shutdown, long-running agents with stale TCP connections killed by firewalls/LBs, JVM shutdown hooks firing after network teardown (e.g. container stop).","solutions":["Review the logged cause; stale-connection errors at exit are typically harmless","Ensure the collector is reachable during graceful shutdowns, or accept the warning on forced terminations","Keep only one lifecycle shutdown path; concurrent shutdowns of the same sender cause close failures","Consider short keepalive/idle-timeout tuning so dead channels are detected before shutdown"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (channel != null && channel.isShutdown()) { logger.warn(\"agent channel already closed; skip graceful close\"); }","typeGuard":"boolean isClosable(Object sender) { return sender instanceof io.grpc.ManagedChannel && !((io.grpc.ManagedChannel) sender).isShutdown(); }","tryCatchPattern":"try {\n  profiler.stop();\n} catch (Throwable t) {\n  logger.warn(\"Profiler shutdown incomplete; agentDataSender failure logged separately\", t);\n}","preventionTips":["Tune gRPC keepalive so stale connections are detected before shutdown","Ensure collector availability during rolling deployments and graceful stops","Call shutdown exactly once per lifecycle instance","Log and ignore close-time failures on process exit; they do not affect data integrity of already-flushed spans"],"tags":["grpc","shutdown","network","resource-cleanup"],"backgroundTag":"broken-pipe","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"}