{"record":{"id":"674cb73e42e29af3","repo":"neondatabase/neon","slug":"this-command-is-not-a-clean-node-decommission-and","errorCode":null,"errorMessage":"This command is not a clean node decommission, and uncleanly drops all controller state for the node, without checking if any tenants still refer to it.  If you know what you're doing, add `--unclean` to proceed.","messagePattern":"This command is not a clean node decommission, and uncleanly drops all controller state for the node, without checking if any tenants still refer to it\\.  If you know what you're doing, add `--unclean` to proceed\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"control_plane/storcon_cli/src/main.rs","lineNumber":953,"sourceCode":"                .await?;\n        }\n        Command::TenantDrop { tenant_id, unclean } => {\n            if !unclean {\n                anyhow::bail!(\n                    \"This command is not a tenant deletion, and uncleanly drops all controller state for the tenant.  If you know what you're doing, add `--unclean` to proceed.\"\n                )\n            }\n            storcon_client\n                .dispatch::<(), ()>(\n                    Method::POST,\n                    format!(\"debug/v1/tenant/{tenant_id}/drop\"),\n                    None,\n                )\n                .await?;\n        }\n        Command::NodeDrop { node_id, unclean } => {\n            if !unclean {\n                anyhow::bail!(\n                    \"This command is not a clean node decommission, and uncleanly drops all controller state for the node, without checking if any tenants still refer to it.  If you know what you're doing, add `--unclean` to proceed.\"\n                )\n            }\n            storcon_client\n                .dispatch::<(), ()>(Method::POST, format!(\"debug/v1/node/{node_id}/drop\"), None)\n                .await?;\n        }\n        Command::NodeDelete { node_id } => {\n            eprintln!(\"Warning: This command is obsolete and will be removed in a future version\");\n            eprintln!(\"Use `NodeStartDelete` instead, if possible\");\n            storcon_client\n                .dispatch::<(), ()>(Method::DELETE, format!(\"control/v1/node/{node_id}\"), None)\n                .await?;\n        }\n        Command::NodeStartDelete { node_id, force } => {\n            let query = if force {\n                format!(\"control/v1/node/{node_id}/delete?force=true\")\n            } else {","sourceCodeStart":935,"sourceCodeEnd":971,"githubUrl":"https://github.com/neondatabase/neon/blob/8f60b04da47ffefe0e52bda2440134b42874eb75/control_plane/storcon_cli/src/main.rs#L935-L971","documentation":"storcon_cli's node-drop command POSTs debug/v1/node/{node_id}/drop and removes all controller state for the node without checking whether tenants still refer to it — it is not a clean decommission. The --unclean flag is a mandatory confirmation; without it the command bails before making any request.","triggerScenarios":"Running storcon_cli node-drop without --unclean. The guard triggers purely on the missing flag, regardless of whether tenants reference the node.","commonSituations":"Operators using node-drop where NodeStartDelete (the clean, modern decommission path) is intended; automation written against the debug endpoint; decommissioning a node that still hosts attached shards and breaking tenant placement.","solutions":["Use the clean decommission path instead: storcon_cli node start-delete / NodeStartDelete, which drains the node safely","If you accept the risk of dangling controller state, re-run node-drop with --unclean","After an unclean drop, expect to repair tenant placement for shards that referenced the dropped node"],"exampleFix":"# before\nstorcon_cli node-drop --node-id <id>\n# after (only if unclean drop is intended)\nstorcon_cli node-drop --node-id <id> --unclean","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Default decommissioning automation to node start-delete; treat node-drop --unclean as a break-glass path","Before an unclean node drop, list tenants on the node so you know what placement you will break","Rebalance tenants off the node first whenever possible"],"tags":["storcon","destructive-command","confirmation-flag","cli","decommission"],"backgroundTag":"confirmation-flag-required","analyzedSha":"8f60b04da47ffefe0e52bda2440134b42874eb75","analyzedAt":"2026-08-16T23:39:28.135Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}