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
- 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.
- If the table should exist, check nodetool describecluster / schema agreement for schema divergence and re-run DDL if one node is missing the table.
- Confirm all nodes are on a version supporting compression dictionaries and schema sync is healthy (no pending schema ops in system.local).
- 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
- Coordinate table drops with dictionary training activity so in-flight updates don't target dropped tables.
- Monitor schema agreement across nodes before running dictionary training.
- Treat this warning as benign during normal drops; alert only on persistence for live tables.
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
- If the ' ' option is set to false no other options must be…
- Missing sub-option ' ' for the 'compression' option.
- ACCESS TO DATACENTERS operations not supported by…
- ALREADY_EXISTS
- Already exists
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)