{"record":{"id":"ea115e8f767991d9","repo":"apache/cassandra","slug":"not-failing-repair-due-to-remote-host-not","errorCode":null,"errorMessage":"[#{}] Not failing repair due to remote host {} not supporting repair message timeouts (version is unknown)","messagePattern":"\\[#(.+?)\\] Not failing repair due to remote host (.+?) not supporting repair message timeouts \\(version is unknown\\)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"src/java/org/apache/cassandra/repair/messages/RepairMessage.java","lineNumber":285,"sourceCode":"            {\n                return true;\n            }\n        };\n        sendMessageWithRetries(ctx, allowRetry, request, verb, endpoint, callback);\n    }\n\n    private static ErrorHandling errorHandlingSupported(SharedContext ctx, InetAddressAndPort from, Verb verb, TimeUUID parentSessionId)\n    {\n        if (SUPPORTS_RETRY_WITHOUT_VERSION_CHECK.contains(verb))\n            return ErrorHandling.RETRY;\n        // Repair in mixed mode isn't fully supported, but also not activally blocked... so in the common case all participants\n        // will be on the same version as this instance, so can avoid the lookup from gossip\n        CassandraVersion remoteVersion = ctx.gossiper().getReleaseVersion(from);\n        if (remoteVersion == null)\n        {\n            if (VERB_TIMEOUT_VERSIONS.containsKey(verb))\n            {\n                logger.warn(\"[#{}] Not failing repair due to remote host {} not supporting repair message timeouts (version is unknown)\", parentSessionId, from);\n                return ErrorHandling.NONE;\n            }\n            return ErrorHandling.TIMEOUT;\n        }\n        if (remoteVersion.compareTo(SUPPORTS_RETRY) >= 0)\n            return ErrorHandling.RETRY;\n        CassandraVersion timeoutVersion = VERB_TIMEOUT_VERSIONS.get(verb);\n        if (timeoutVersion == null || remoteVersion.compareTo(timeoutVersion) >= 0)\n            return ErrorHandling.TIMEOUT;\n        return ErrorHandling.NONE;\n    }\n\n    public static void sendFailureResponse(SharedContext ctx, Message<?> respondTo)\n    {\n        Message<?> reply = respondTo.failureResponse(RequestFailureReason.UNKNOWN);\n        ctx.messaging().send(reply, respondTo.from());\n    }\n","sourceCodeStart":267,"sourceCodeEnd":303,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/repair/messages/RepairMessage.java#L267-L303","documentation":"Logged by RepairMessage.errorHandlingSupported when a repair message verb is known to support timeouts but the remote host's release version cannot be determined from gossip. Instead of failing the repair on timeout, the node conservatively returns ErrorHandling.NONE so the repair is not aborted due to a possibly unsupported feature.","triggerScenarios":"Receiving a repair message from a node whose gossiped release version is null (peer just joined/restarted, gossip not yet populated) while the verb is in VERB_TIMEOUT_VERSIONS.","commonSituations":"Rolling upgrades or freshly bootstrapped nodes where gossip release versions have not propagated; decommissioned or flapping nodes with stale/missing gossip state.","solutions":["Wait for gossip to converge (nodetool gossipinfo) so the peer's release version is known, then re-run repair","Ensure all nodes are on versions supporting repair message timeouts/retries","Investigate why the peer's release version is missing from gossip (stale node, gossip issues)","Safe to ignore: the log explicitly says the repair is not failed; verify repairs complete"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// check the peer version is known before repair\nCassandraVersion v = Gossiper.instance.getReleaseVersion(peer);\nboolean versionKnown = v != null;\nboolean supportsTimeouts = versionKnown && v.compareTo(RepairMessage.SUPPORTS_RETRY) >= 0;","typeGuard":"boolean versionKnown(CassandraVersion v) { return v != null; }","tryCatchPattern":null,"preventionTips":["Avoid repairs during rolling upgrades when gossip versions may be missing","Wait for gossip convergence after node restart before repairing","Keep the cluster on versions supporting repair message timeouts"],"tags":["repair","gossip","versioning","upgrade"],"backgroundTag":"incompatible-node-version","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}