{"record":{"id":"c294b54e1dcc8916","repo":"cube-js/cube","slug":"cachestore-cannot-be-used-on-the-worker-node-queu-c294b5","errorCode":null,"errorMessage":"CacheStore cannot be used on the worker node! queue_list was used.","messagePattern":"CacheStore cannot be used on the worker node! queue_list was used\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"rust/cubestore/cubestore/src/cachestore/cache_rocksstore.rs","lineNumber":2027,"sourceCode":"\n    async fn queue_to_cancel(\n        &self,\n        _prefix: String,\n        _orphaned_timeout: Option<u32>,\n        _heartbeat_timeout: Option<u32>,\n    ) -> Result<Vec<IdRow<QueueItem>>, CubeError> {\n        panic!(\"CacheStore cannot be used on the worker node! queue_to_cancel was used.\")\n    }\n\n    async fn queue_list(\n        &self,\n        _prefix: String,\n        _status_filter: Option<QueueItemStatus>,\n        _priority_sort: bool,\n        _with_payload: bool,\n        _caller_process_id: Option<String>,\n    ) -> Result<Vec<QueueListItem>, CubeError> {\n        panic!(\"CacheStore cannot be used on the worker node! queue_list was used.\")\n    }\n\n    async fn queue_get(&self, _key: QueueKey) -> Result<Option<QueueGetResponse>, CubeError> {\n        panic!(\"CacheStore cannot be used on the worker node! queue_get was used.\")\n    }\n\n    async fn queue_cancel(&self, _key: QueueKey) -> Result<Option<QueueCancelResponse>, CubeError> {\n        panic!(\"CacheStore cannot be used on the worker node! queue_cancel was used.\")\n    }\n\n    async fn queue_heartbeat(&self, _key: QueueKey) -> Result<(), CubeError> {\n        panic!(\"CacheStore cannot be used on the worker node! queue_heartbeat_by_id was used.\")\n    }\n\n    async fn queue_retrieve_by_path(\n        &self,\n        _path: String,\n        _allow_concurrency: u32,","sourceCodeStart":2009,"sourceCodeEnd":2045,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/rust/cubestore/cubestore/src/cachestore/cache_rocksstore.rs#L2009-L2045","documentation":"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.","triggerScenarios":"Listing queue items (queue_list with prefix/status filter/priority_sort/with_payload/caller_process_id) against a CubeStore worker node.","commonSituations":"Monitoring UIs or CLI tools querying a worker address to view the queue; round-robin DNS balancing metastore API reads onto workers.","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."],"exampleFix":"// before: monitor queries worker\nmonitor.connect('worker-0:3030').queueList(prefix);\n// after\nmonitor.connect('metastore-0:3030').queueList(prefix);","handlingStrategy":"validation","validationCode":"if !is_metastore(node) {\n    return Err(CubeError::internal(\"queue_list requires the metastore node\"));\n}\nlet items = node.queueList(prefix, status, sort, with_payload, caller).await?;","typeGuard":"fn is_metastore(node: &CubeStoreNode) -> bool {\n    matches!(node.role(), NodeRole::Metastore)\n}","tryCatchPattern":null,"preventionTips":["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."],"tags":["cubestore","rust","topology","queue"],"backgroundTag":"wrong-node-role","analyzedSha":"7d981676b36392fec34088b9afab6bdcad40207c","analyzedAt":"2026-09-02T03:45:10.400Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}