{"record":{"id":"8ff4347046a917af","repo":"risingwavelabs/risingwave","slug":"invalid-worker-0-1","errorCode":null,"errorMessage":"Invalid worker: {0}, {1}","messagePattern":"Invalid worker: (.+?), (.+?)","errorType":"error_code","errorClass":"MetaError","httpStatus":null,"severity":"error","filePath":"src/meta/src/error.rs","lineNumber":69,"sourceCode":"\n    #[error(\"Hummock error: {0}\")]\n    HummockError(\n        #[from]\n        #[backtrace]\n        HummockError,\n    ),\n\n    #[error(transparent)]\n    RpcError(\n        #[from]\n        #[backtrace]\n        RpcError,\n    ),\n\n    #[error(\"{0}\")]\n    PermissionDenied(String),\n\n    #[error(\"Invalid worker: {0}, {1}\")]\n    InvalidWorker(WorkerId, String),\n\n    #[error(\"Invalid parameter: {0}\")]\n    InvalidParameter(#[message] String),\n\n    // Used for catalog errors.\n    #[error(\"{0} id not found: {1}\")]\n    #[construct(skip)]\n    CatalogIdNotFound(&'static str, String),\n\n    #[error(\"table_fragment does not exist: id={0}\")]\n    FragmentNotFound(FragmentId),\n\n    #[error(\"{0} named {1} already exists{under_creation}\", under_creation = (.2).map(|_| \" and is still being created\").unwrap_or(\"\"))]\n    Duplicated(\n        &'static str,\n        String,\n        // if under creation, take streaming job id, otherwise None","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/meta/src/error.rs#L51-L87","documentation":"Meta service rejected a request because the referenced worker is not registered or not recognized by the cluster manager. WorkerId identifies a compute/compactor/frontend node that must have registered with the meta before being addressed. Thrown by RPC handlers when a worker node id lookup or state validation fails.","triggerScenarios":"Calls to meta RPCs (e.g. heartbeat, fragment or worker status APIs) referencing a WorkerId that was never registered, has been removed, or whose registration was invalidated by cluster restart.","commonSituations":"Stale worker metadata after meta node restart, worker removed via `risectl`/worker manager while still referenced, mismatched cluster state after failover, nodes joining with reused ids.","solutions":["Verify the worker is registered: list workers via risectl meta or `SHOW NODES`-style admin APIs and confirm the WorkerId exists.","Restart the worker node so it re-registers with the meta service.","If the meta was restored from backup, confirm worker registrations persisted; otherwise re-register all workers.","Check network/partition issues causing the meta to expire the worker's liveness."],"exampleFix":"// before\nlet status = meta_client.get_worker_status(stale_worker_id).await?; // InvalidWorker\n// after\nlet workers = meta_client.list_workers().await?;\nif workers.iter().any(|w| w.id == worker_id) {\n    let status = meta_client.get_worker_status(worker_id).await?;\n}","handlingStrategy":"validation","validationCode":"let registered = meta_client.list_workers().await?;\nif !registered.iter().any(|w| w.id == worker_id) {\n    // re-register or refresh the worker id before calling\n}","typeGuard":"fn is_known_worker(worker_id: WorkerId, workers: &[WorkerInfo]) -> bool {\n    workers.iter().any(|w| w.id == worker_id)\n}","tryCatchPattern":"match meta_result {\n    Err(MetaError::InvalidWorker(id, msg)) => { /* re-register worker id, then retry */ }\n    other => other?,\n}","preventionTips":["Always obtain WorkerId from a fresh registration/lookup, never from persisted stale state.","Refresh worker lists after meta restart or failover.","Monitor worker liveness/heartbeats before issuing worker-targeted requests."],"tags":["meta","worker-registration","rpc"],"backgroundTag":"entity-not-found","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}