{"record":{"id":"6bf4e0f382dcb7ef","repo":"influxdata/influxdb","slug":"node-node-id-is-not-fully-stopped-current-state-current","errorCode":null,"errorMessage":"node '{node_id}' is not fully stopped (current state: {current_state}); run \"stop node\" first","messagePattern":"node '(.+?)' is not fully stopped \\(current state: (.+?)\\); run \"stop node\" first","errorType":"error_code","errorClass":"CatalogError","httpStatus":null,"severity":"error","filePath":"influxdb3_catalog/src/error.rs","lineNumber":300,"sourceCode":"    #[error(\"token name already exists, {0}\")]\n    TokenNameAlreadyExists(String),\n\n    #[error(\"token hash already exists\")]\n    TokenHashAlreadyExists,\n\n    #[error(\"missing admin token, cannot update\")]\n    MissingAdminTokenToUpdate,\n\n    #[error(\"cannot delete internal db\")]\n    CannotDeleteInternalDatabase,\n\n    #[error(\"cannot modify internal db\")]\n    CannotModifyInternalDatabase,\n\n    #[error(\"tried to stop a node ({node_id}) that is already stopped\")]\n    NodeAlreadyStopped { node_id: Arc<str> },\n\n    #[error(\n        \"node '{node_id}' is not fully stopped (current state: {current_state}); run \\\"stop node\\\" first\"\n    )]\n    NodeNotFullyStopped {\n        node_id: Arc<str>,\n        current_state: &'static str,\n    },\n\n    #[error(\"node '{node_id}' has compact mode and cannot be removed\")]\n    NodeModeNotRemovable { node_id: Arc<str> },\n\n    #[error(\"invalid stop ack for node '{node_id}' (current state: {current_state})\")]\n    InvalidStopAck {\n        node_id: Arc<str>,\n        current_state: &'static str,\n    },\n\n    #[error(\"invalid unregister for node '{node_id}' (current state: {current_state})\")]\n    InvalidUnregister {","sourceCodeStart":282,"sourceCodeEnd":318,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_catalog/src/error.rs#L282-L318","documentation":"This error is returned when a node operation (such as a delete or start) requires the node to be fully stopped, but the node's current state is something other than fully stopped (e.g. `paused`). The message includes the node id and its current state, and instructs the operator to run `stop node` first.","triggerScenarios":"Deleting or otherwise operating on a node via admin APIs while the node is in a state like `paused` rather than fully `stopped`.","commonSituations":"Pausing a node and immediately trying to delete it without completing the stop; assuming `pause` equals `stop`; orchestration gaps between stop and subsequent node removal.","solutions":["Run `influxdb3 stop node --node-id <id>` (or the equivalent admin API) and wait for the node to reach the stopped state","Re-check the node state before retrying the original operation","Update orchestration to poll for the `stopped` state instead of assuming pause is sufficient","Retry the delete/start operation once the state confirms stopped"],"exampleFix":"// before\nadmin.pause_node(node_id)?;\nadmin.delete_node(node_id)?; // fails: node not fully stopped\n// after\nadmin.stop_node(node_id)?;\nwait_until(node_id, NodeState::Stopped);\nadmin.delete_node(node_id)?;","handlingStrategy":"validation","validationCode":"fn ready_for_node_op(state: &str) -> bool { state == \"stopped\" }","typeGuard":null,"tryCatchPattern":"match delete_node(node_id) {\n    Err(e) if e.to_string().contains(\"not fully stopped\") => {\n        stop_node_and_wait(node_id)?;\n        delete_node(node_id)\n    },\n    r => r,\n}","preventionTips":["Poll node state until it reports fully stopped before delete/start ops","Never assume `pause` implies `stopped`","Encode stop-then-wait-then-operate as one orchestration step"],"tags":["catalog","nodes","lifecycle","state-machine"],"backgroundTag":"invalid-state-transition","analyzedSha":"06200ef96ba82c5f6727e5038a83af8e722c6875","analyzedAt":"2026-09-19T12:55:30.003Z","contentChangedAt":"2026-09-19T12:55:30.003Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}