{"record":{"id":"b26a67a65c43e380","repo":"cube-js/cube","slug":"cachestore-cannot-be-used-on-the-worker-node-queu-b26a67","errorCode":null,"errorMessage":"CacheStore cannot be used on the worker node! queue_cancel was used.","messagePattern":"CacheStore cannot be used on the worker node! queue_cancel was used\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"rust/cubestore/cubestore/src/cachestore/cache_rocksstore.rs","lineNumber":2035,"sourceCode":"    }\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,\n        _caller_process_id: Option<String>,\n    ) -> Result<QueueRetrieveResponse, CubeError> {\n        panic!(\"CacheStore cannot be used on the worker node! queue_retrieve_by_path was used.\")\n    }\n\n    async fn queue_ack(&self, _key: QueueKey, _result: Option<String>) -> Result<bool, CubeError> {\n        panic!(\"CacheStore cannot be used on the worker node! queue_ack was used.\")\n    }","sourceCodeStart":2017,"sourceCodeEnd":2053,"githubUrl":"https://github.com/cube-js/cube/blob/7d981676b36392fec34088b9afab6bdcad40207c/rust/cubestore/cubestore/src/cachestore/cache_rocksstore.rs#L2017-L2053","documentation":"A hard guard panic inside the RocksDB-based CacheStore on a Cube Store worker node: queue_cancel was invoked on a store whose queue methods are intentionally unimplemented, as queue lifecycle is owned by the router node. Encountering it means a worker node is trying to cancel a queue item, which the Cube Store topology does not support.","triggerScenarios":"Requesting cancellation of a queue item (queue_cancel with QueueKey) while connected to a worker node.","commonSituations":"Users cancelling stuck pre-aggregation builds via a UI whose backend talks to a worker; automation scripts iterating all nodes to cancel jobs.","solutions":["Route cancellation requests to the metastore node.","Gate admin cancel actions in tooling to use the metastore endpoint only.","Fix any proxy that forwards mutating queue APIs to workers.","Verify the metastore address in your Cube driver / cubestore connection config."],"exampleFix":"// before\nawait workerConn.queueCancel(key);\n// after\nawait metastoreConn.queueCancel(key);","handlingStrategy":"validation","validationCode":"if !is_metastore(node) {\n    return Err(CubeError::internal(\"queue_cancel requires the metastore node\"));\n}\nnode.queueCancel(key).await?;","typeGuard":"fn is_metastore(node: &CubeStoreNode) -> bool {\n    matches!(node.role(), NodeRole::Metastore)\n}","tryCatchPattern":null,"preventionTips":["Restrict mutating admin APIs to the metastore endpoint.","Fix reverse proxies forwarding POST queue routes to workers.","Validate target node role in automation before cancelling jobs."],"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"}