apache/cassandra · warning

Received dictionary update for unknown table with tableId

Error message

Received dictionary update for unknown table with tableId {}

What it means

This is a WARN log emitted by CompressionDictionaryUpdateVerbHandler.doVerb when an internode message carrying a Zstd compression dictionary update arrives for a tableId that no longer exists in the local schema. The handler looks up the ColumnFamilyStore via Schema.instance.getColumnFamilyStoreInstance; a null result means the table was dropped (or never created on this node), so the update is safely ignored.

Solutions

  1. Verify the tableId references a still-existing table (SELECT id, keyspace_name, table_name FROM system_schema.tables); if the table was intentionally dropped, this warning is benign and can be ignored.
  2. If the table should exist, check nodetool describecluster / schema agreement for schema divergence and re-run DDL if one node is missing the table.
  3. Confirm all nodes are on a version supporting compression dictionaries and schema sync is healthy (no pending schema ops in system.local).
  4. If warnings persist for a live table, collect logs and report — it indicates a schema propagation race or message replay bug.
Defensive patterns

Strategy: validation

Validate before calling

// before relying on a dictionary update target
ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(tableId);
if (cfs == null) {
    logger.warn("Skipping dictionary update for unknown tableId {}", tableId);
    return;
}

Prevention

When it happens

Trigger: A dictionary-trained notification for table T is in flight or queued while T is dropped on the receiving node; schema propagation races let a node receive a dictionary update verb before/after the table's schema is locally known; a message is delivered to a node that has not yet applied CREATE TABLE for that tableId.

Common situations: Operators dropping tables with sstable compression dictionaries enabled (zstd dictionary training) while clusters are busy; rolling upgrades or multi-DC deployments where schema versions drift briefly; replicas in another datacenter receiving updates out of order during topology changes.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


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

Appendix: source

Thrown at src/java/org/apache/cassandra/db/compression/CompressionDictionaryUpdateVerbHandler.java:46

public class CompressionDictionaryUpdateVerbHandler implements IVerbHandler<CompressionDictionaryUpdateMessage>
{
    private static final Logger logger = LoggerFactory.getLogger(CompressionDictionaryUpdateVerbHandler.class);
    public static final CompressionDictionaryUpdateVerbHandler instance = new CompressionDictionaryUpdateVerbHandler();

    private CompressionDictionaryUpdateVerbHandler() {}

    @Override
    public void doVerb(Message<CompressionDictionaryUpdateMessage> message)
    {
        CompressionDictionaryUpdateMessage payload = message.payload;

        try
        {
            ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(payload.tableId);
            if (cfs == null)
            {
                logger.warn("Received dictionary update for unknown table with tableId {}", payload.tableId);
                return;
            }

            logger.debug("Received dictionary update notification for {}.{} with dictionaryId {}",
                         cfs.keyspace, cfs.name, payload.dictionaryId);
            CompressionDictionaryManager manager = cfs.compressionDictionaryManager();
            manager.onNewDictionaryAvailable(payload.dictionaryId);
        }
        catch (Exception e)
        {
            logger.error("Failed to process dictionary update notification for tableId {}",
                         payload.tableId, e);
        }
    }
}

View on GitHub (pinned to 88fd0f6a0e)