apache/cassandra · error

Unable to fetch log entries from

Error message

Unable to fetch log entries from 

What it means

PeerLogFetcher.fetchLogEntriesAndWaitInternal cancels the remote fetch and local log append and returns a failed promise when any Throwable occurs while pulling log entries from a peer. The warning names the peer; the returned IllegalStateException carries the same message plus the cause.

Solutions

  1. Read the chained cause in the IllegalStateException for the root failure.
  2. Verify node version compatibility (serialization failures often mean mixed versions).
  3. Check whether the node was shutting down; if so retry after it is up.
  4. Confirm the remote peer is healthy and retry the fetch.
Defensive patterns

Strategy: try-catch

Validate before calling

if (!FailureDetector.instance.isAlive(remote)) return Futures.immediateFailedFuture(new IllegalStateException("peer down: " + remote));

Try / catch

try { return asyncFetchLog(remote, epoch).get(); } catch (ExecutionException e) { logger.error("fetch from " + remote + " failed", e.getCause()); }

Prevention

When it happens

Trigger: The internal fetch future or append-to-log future completes exceptionally — connection failure, serialization error, rejection due to shutdown, or local log append failure — during asyncFetchLog against `remote`.

Common situations: Remote peer crashing mid-response; mismatched message versions between nodes; node shutting down while a fetch is in flight; disk/local log issues during append.

Related errors


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

Appendix: source

Thrown at src/java/org/apache/cassandra/tcm/PeerLogFetcher.java:123

        });

        logger.info("Fetching log from {}, at least {}", remote, awaitAtleast);
        try (Timer.Context ctx = TCMMetrics.instance.fetchPeerLogLatency.time())
        {
            RemoteProcessor.sendWithRetries(Verb.TCM_FETCH_PEER_LOG_REQ,
                                            new FetchPeerLog(before),
                                            fetchFromRemote,
                                            new RemoteProcessor.CandidateIterator(Collections.singletonList(remote), false),
                                            Retry.untilElapsed(DatabaseDescriptor.getCmsAwaitTimeout().to(TimeUnit.NANOSECONDS), TCMMetrics.instance.fetchLogRetries));
            return appendToLog;
        }
        catch (Throwable t)
        {
            fetchFromRemote.cancel(true);
            appendToLog.cancel(true);
            JVMStabilityInspector.inspectThrowable(t);

            logger.warn("Unable to fetch log entries from " + remote, t);
            Promise<ClusterMetadata> res = new AsyncPromise<>();
            res.setFailure(new IllegalStateException("Unable to fetch log entries from " + remote, t));
            return res;
        }
    }
}

View on GitHub (pinned to 88fd0f6a0e)