apache/cassandra · warning

No response from

Error message

No response from %s

What it means

RemoteToLocalVirtualTable.collect() issues a read to a remote node; if the round-trip returns no ReadResponse before its deadline, it warns 'No response from <node>' and skips that node's data rather than failing the whole virtual-table query. The message names the unreachable/slow node (rr.nodeId).

Solutions

  1. Check nodetool status / gossip to see if the node named in the warning is UP.
  2. Retry the query once the reported node recovers or load drops below the timeout threshold.
  3. Investigate the named node's logs, GC pauses, and network connectivity (nodetool netstats, tpstats).
  4. Treat returned data as incomplete for that node; re-run to assemble full results.
Defensive patterns

Strategy: retry

Validate before calling

// confirm the cluster is healthy before querying remote-fed virtual tables
boolean allUp = session.execute("SELECT status FROM system_views.peers").all()
    .stream().allMatch(r -> "UP".equals(r.getString("status")));

Prevention

When it happens

Trigger: A SELECT on the remote-fed virtual table where rr.getNow() returns null for a peer: the peer did not reply within the internal timeout (InternalTimeoutException thrown just above) or was unreachable/overloaded while not failing outright.

Common situations: One node of the cluster is down, network-partitioned, GC-thrashing, or heavily loaded; querying the virtual table from the coordinator while a replica is slow; mixed-version clusters where a peer doesn't answer the internal request.

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


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

Appendix: source

Thrown at src/java/org/apache/cassandra/db/virtual/RemoteToLocalVirtualTable.java:289

            {
                if (failure.failure == null) promise.tryFailure(new RuntimeException(failure.reason.toString()));
                else promise.tryFailure(failure.failure);
            }
        };

        MessagingService.instance().sendWithCallback(message, endpoint, callback);
    }

    private void collect(PartitionsCollector collector, RequestAndResponse rr, Function<DecoratedKey, ByteBuffer[]> pksToCks)
    {
        if (!rr.awaitUntilThrowUncheckedOnInterrupt(collector.deadlineNanos()))
            throw new InternalTimeoutException();

        rr.rethrowIfFailed();
        ReadResponse response = rr.getNow();
        if (response == null)
        {
            ClientWarn.instance.warn("No response from " + rr.nodeId);
            return;
        }

        int pkCount = local.partitionKeyColumns().size();
        PartitionCollector out = rr.partitions.partition(rr.nodeId.id());
        try (UnfilteredPartitionIterator partitions = response.makeIterator(rr.readCommand))
        {
            while (partitions.hasNext())
            {
                try (UnfilteredRowIterator iter = partitions.next())
                {
                    ByteBuffer[] clusterings = pksToCks.apply(iter.partitionKey());
                    while (iter.hasNext())
                    {
                        Unfiltered next = iter.next();
                        if (!next.isRow())
                            throw new UnsupportedOperationException("Range tombstones not supported");

View on GitHub (pinned to 88fd0f6a0e)