{"record":{"id":"5e6f9348ec53b223","repo":"pinpoint-apm/pinpoint","slug":"reconnectscheduledexecutor-shutdown-failed","errorCode":null,"errorMessage":"reconnectScheduledExecutor shutdown failed","messagePattern":"reconnectScheduledExecutor 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":121,"sourceCode":"\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 +\n                \", reconnectScheduledExecutorService=\" + reconnectScheduledExecutorService +\n                '}';\n    }\n}\n","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java#L103-L139","documentation":"In GrpcModuleLifeCycle.shutdown(), the reconnect scheduler (reconnectScheduledExecutorService, which retries gRPC channel connections to the collector) is stopped with a 3-second shutdownAndAwaitTermination. If scheduled reconnect tasks don't finish/terminate in time, \"reconnectScheduledExecutor shutdown failed\" is logged. Non-fatal: shutdown proceeds, but reconnect worker threads may linger briefly.","triggerScenarios":"shutdown() called while reconnect tasks are queued/executing — typically when the collector is unreachable and the retry scheduler is actively re-attempting connections every few seconds.","commonSituations":"Stopping the agent during a collector outage; flaky network causing aggressive reconnect scheduling; abrupt container termination racing the scheduler; tests that shut down the module without ever establishing a connection.","solutions":["Restore connectivity to the Pinpoint collector so reconnect tasks idle down, then shut down.","Ignore the warning at JVM exit if it appears sporadically — threads are daemon-bound and die with the process.","Check collector address/port config to prevent perpetual reconnect loops.","Upgrade Pinpoint for improved executor shutdown handling in GrpcModuleLifeCycle."],"exampleFix":"// before: perpetual reconnect loop blocks clean shutdown\nprofiler.collector.span.ip=unreachable-host\n// after\nprofiler.collector.span.ip=collector.pinpoint.local","handlingStrategy":"fallback","validationCode":"// Verify collector reachability so reconnect tasks are idle before shutdown\nboolean reachable = new Socket(host, port).connect(new InetSocketAddress(host, port), 2000);","typeGuard":null,"tryCatchPattern":"try {\n    lifeCycle.shutdown();\n} catch (Exception e) {\n    logger.warn(\"reconnect scheduler did not stop in time\", e);\n}","preventionTips":["Fix collector address/port config to avoid perpetual reconnect loops.","Ensure network/firewall allows the collector port.","Treat sporadic warnings at JVM exit as benign."],"tags":["grpc","reconnect","executor","shutdown","scheduler"],"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"}