cube-js/cube · error
CacheStore cannot be used on the worker node! queue_list was
Error message
CacheStore cannot be used on the worker node! queue_list was used.
What it means
queue_list returns queue items with optional status filtering, priority sorting and payload inclusion; it reads metastore-owned queue tables. CacheStore panics on workers because they hold no queue data.
Source
Thrown at rust/cubestore/cubestore/src/cachestore/cache_rocksstore.rs:2027
async fn queue_to_cancel(
&self,
_prefix: String,
_orphaned_timeout: Option<u32>,
_heartbeat_timeout: Option<u32>,
) -> Result<Vec<IdRow<QueueItem>>, CubeError> {
panic!("CacheStore cannot be used on the worker node! queue_to_cancel was used.")
}
async fn queue_list(
&self,
_prefix: String,
_status_filter: Option<QueueItemStatus>,
_priority_sort: bool,
_with_payload: bool,
_caller_process_id: Option<String>,
) -> Result<Vec<QueueListItem>, CubeError> {
panic!("CacheStore cannot be used on the worker node! queue_list was used.")
}
async fn queue_get(&self, _key: QueueKey) -> Result<Option<QueueGetResponse>, CubeError> {
panic!("CacheStore cannot be used on the worker node! queue_get was used.")
}
async fn queue_cancel(&self, _key: QueueKey) -> Result<Option<QueueCancelResponse>, CubeError> {
panic!("CacheStore cannot be used on the worker node! queue_cancel was used.")
}
async fn queue_heartbeat(&self, _key: QueueKey) -> Result<(), CubeError> {
panic!("CacheStore cannot be used on the worker node! queue_heartbeat_by_id was used.")
}
async fn queue_retrieve_by_path(
&self,
_path: String,
_allow_concurrency: u32,View on GitHub (pinned to 7d981676b3)
Solutions
- Point queue inspection tools at the metastore node.
- Restrict queue list APIs to the metastore in any proxy/load-balancer config.
- Verify node role via CubeStore status endpoints before querying queue state.
- Update client libraries to accept separate metastore vs store addresses.
Example fix
// before: monitor queries worker
monitor.connect('worker-0:3030').queueList(prefix);
// after
monitor.connect('metastore-0:3030').queueList(prefix); Defensive patterns
Strategy: validation
Validate before calling
if !is_metastore(node) {
return Err(CubeError::internal("queue_list requires the metastore node"));
}
let items = node.queueList(prefix, status, sort, with_payload, caller).await?; Type guard
fn is_metastore(node: &CubeStoreNode) -> bool {
matches!(node.role(), NodeRole::Metastore)
} Prevention
- Point monitoring dashboards at the metastore endpoint.
- Don't put metastore queue reads behind round-robin DNS including workers.
- Surface node role in monitoring metadata to catch misconfig early.
When it happens
Trigger: Listing queue items (queue_list with prefix/status filter/priority_sort/with_payload/caller_process_id) against a CubeStore worker node.
Common situations: Monitoring UIs or CLI tools querying a worker address to view the queue; round-robin DNS balancing metastore API reads onto workers.
Related errors
- CacheStore cannot be used on the worker node! queue_results_
- CacheStore cannot be used on the worker node! queue_add was
- CacheStore cannot be used on the worker node! queue_add_and_
- CacheStore cannot be used on the worker node! queue_clear wa
- CacheStore cannot be used on the worker node! queue_to_cance
AI-assisted analysis of cube-js/cube@7d981676b3 (2026-09-02).
Data as JSON: /api/errors/c294b54e1dcc8916.
Report an issue: GitHub.