{"record":{"id":"ff1b65da84c976a0","repo":"pinpoint-apm/pinpoint","slug":"spandatasender-close-fail","errorCode":null,"errorMessage":"spanDataSender close fail","messagePattern":"spanDataSender 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":109,"sourceCode":"\n        this.spanDataSender = spanDataSenderProvider.get();\n        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","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java#L91-L127","documentation":"During GrpcModuleLifeCycle.shutdown(), each gRPC data sender (span, stat, agent, metadata) is closed via IOUtils.closeQuietly. When closing spanDataSender throws, the provided consumer logs the warning \"spanDataSender close fail\" — this is a logged warning, not an exception; shutdown continues with the remaining senders.","triggerScenarios":"Calling profiler shutdown while spanDataSender's underlying gRPC channel/StreamObserver is in a failed state (network already down, channel already closed, in-flight RPCs failing on close).","commonSituations":"Agent shutdown during network outage to the collector, double shutdown of the module, abrupt termination (kill) leaving the channel half-closed, collector stopped before agent shutdown.","solutions":["Inspect the nested exception in the log to identify the underlying channel failure","Verify network connectivity/DNS to the collector at shutdown time","Ensure shutdown() is called only once per module lifecycle; double shutdown can surface as close failures","If errors are purely during shutdown of an already-broken connection and the process is exiting, they are safe to tolerate"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (channel != null && channel.isShutdown()) { logger.warn(\"span 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(); // triggers GrpcModuleLifeCycle.shutdown()\n} catch (Throwable t) {\n  logger.warn(\"Shutdown reported sender close problems\", t); // individual sender failures are already logged as warnings\n}","preventionTips":["Ensure the collector is reachable when performing graceful shutdowns","Avoid double shutdown; guard lifecycle state before calling stop()","Increase shutdown hooks' patience so gRPC close() can finish (avoid SIGKILL)"],"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"}