apache/cassandra · error · RepairException

Sync failed between and

Error message

Sync failed between %s and %s

What it means

An asymmetric remote sync task (used in preview/ir-synchronous repairs where streaming is one-directional) failed between the coordinator node and its peer. The task is failed with a RepairException carrying this message, which aborts the surrounding repair session.

Solutions

  1. Check the peer node's logs for the underlying streaming/stream-plan failure.
  2. Re-run the repair once both nodes are healthy.
  3. Verify disk space, permissions, and network connectivity between nodePair.coordinator and nodePair.peer.
  4. Increase repair session/streaming timeouts if the data volume is large.
  5. Use nodetool netstats and check for failed streams to pinpoint the failure.
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-check before repair:
// nodetool status  (all nodes UP/UN)
// nodetool netstats (no failed/stuck streams)
// df -h on both endpoints (sufficient disk)

Try / catch

try {
    repairAsync(keyspace);
} catch (RuntimeException e) {
    if (e.getMessage().contains("Sync failed between")) {
        // check peer health/logs, then retry repair
    }
}

Prevention

When it happens

Trigger: syncComplete is invoked with success=false after the remote sync/streaming request to nodePair.peer completed unsuccessfully (remote node error, stream failure, timeout).

Common situations: Node down or restarting mid-repair, streaming failures due to disk space or permissions, network partitions, or timeouts while transferring stream summaries between replicas.

Related errors


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/a84a4a5956a3e7d0. Report an issue: GitHub.

Appendix: source

Thrown at src/java/org/apache/cassandra/repair/AsymmetricRemoteSyncTask.java:62

    public void startSync()
    {
        InetAddressAndPort local = ctx.broadcastAddressAndPort();
        SyncRequest request = new SyncRequest(desc, local, nodePair.coordinator, nodePair.peer, rangesToSync, previewKind, true);
        String message = String.format("Forwarding streaming repair of %d ranges to %s (to be streamed with %s)", request.ranges.size(), request.src, request.dst);
        Tracing.traceRepair(message);
        sendRequest(request, request.src);
    }

    public void syncComplete(boolean success, List<SessionSummary> summaries)
    {
        if (success)
        {
            trySuccess(stat.withSummaries(summaries));
        }
        else
        {
            tryFailure(RepairException.warn(desc, previewKind, String.format("Sync failed between %s and %s", nodePair.coordinator, nodePair.peer)));
        }
    }

    @Override
    public String toString()
    {
        return "AsymmetricRemoteSyncTask{" +
               "rangesToSync=" + rangesToSync +
               ", nodePair=" + nodePair +
               '}';
    }
}

View on GitHub (pinned to 88fd0f6a0e)