{"record":{"id":"a7a4c53a6608daf1","repo":"pinpoint-apm/pinpoint","slug":"metadatadatasender-close-fail","errorCode":null,"errorMessage":"metadataDataSender close fail","messagePattern":"metadataDataSender 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":112,"sourceCode":"\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{\" +\n                \", agentDataSender=\" + agentDataSender +","sourceCodeStart":94,"sourceCodeEnd":130,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java#L94-L130","documentation":"GrpcModuleLifeCycle.shutdown() closes each gRPC data sender via IOUtils.closeQuietly; when metadataDataSender.close() throws (e.g. the underlying gRPC channel/stream fails to terminate cleanly), the exception is passed to the warning callback which logs \"metadataDataSender close fail\". It is a non-fatal shutdown-time warning: the profiler still shuts down, but the metadata sender's resources (channel, executor) may not have been released cleanly.","triggerScenarios":"Calling GrpcModuleLifeCycle.shutdown() (agent stop, JVM shutdown hook, module restart) while the metadataDataSender's gRPC channel is in a bad state — e.g. already disconnected, mid-reconnect, or its close() implementation throws (UncaughtExceptionHandler / channel shutdown failure).","commonSituations":"Agent stopping while the collector is unreachable; network drop during shutdown causing the gRPC channel's awaitTermination to fail; abrupt collector restart racing with agent shutdown; unit/integration tests tearing down the profiler module with mocked or half-initialized senders.","solutions":["Check the logged cause exception below this warning; if it's a channel shutdown timeout, verify the collector address/port and network before shutdown.","Ensure the profiler is started normally so metadataDataSender is a fully-initialized sender (not null/half-built); reinitialize with -Dpinpoint.profiler.test=false or proper collector config.","Upgrade Pinpoint — newer releases hardened Sender close/shutdown paths in GrpcModuleLifeCycle.","If the warning only appears at JVM exit and metadata was already flushed, it can be safely ignored."],"exampleFix":"// before: collector host unreachable at shutdown -> warning\nprofiler.collector.span.ip=wrong-host\n// after\nprofiler.collector.span.ip=collector.pinpoint.local","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"// This warning is internal to Pinpoint; guard the shutdown path in host code\ntry {\n    lifeCycle.shutdown();\n} catch (Exception e) {\n    logger.warn(\"profiler module shutdown incomplete\", e); // never block JVM exit\n}","preventionTips":["Keep the collector reachable through agent stop; check the cause logged under the warning.","Use graceful JVM shutdown hooks to give senders time to close.","Upgrade Pinpoint for hardened sender close paths."],"tags":["grpc","shutdown","resource-cleanup","network"],"backgroundTag":"resource-cleanup-failed","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"}