{"record":{"id":"e5d96f3d65247346","repo":"influxdata/influxdb","slug":"cannot-remove-node-node-id-because-it-is-a-member-of-query","errorCode":null,"errorMessage":"cannot remove node '{node_id}' because it is a member of query group '{query_group_name}' (id {query_group_id})","messagePattern":"cannot remove node '(.+?)' because it is a member of query group '(.+?)' \\(id (.+?)\\)","errorType":"error_code","errorClass":"CatalogError","httpStatus":null,"severity":"error","filePath":"influxdb3_catalog/src/error.rs","lineNumber":371,"sourceCode":"        committed: FeatureLevel,\n    },\n\n    #[error(\n        \"this node's feature level (core={}, enterprise={}) is below the cluster's committed level (core={}, enterprise={}); upgrade required\",\n        local.core,\n        local.enterprise,\n        committed.core,\n        committed.enterprise,\n    )]\n    NodeBelowCommittedFeatureLevel {\n        committed: FeatureLevel,\n        local: FeatureLevel,\n    },\n\n    #[error(\"missing object store for restore operation\")]\n    MissingObjectStoreForRestore,\n\n    #[error(\n        \"cannot remove node '{node_id}' because it is a member of query group '{query_group_name}' (id {query_group_id})\"\n    )]\n    NodeInQueryGroup {\n        node_id: Arc<str>,\n        query_group_name: Arc<str>,\n        query_group_id: QueryGroupId,\n    },\n\n    #[error(\n        \"cannot place node '{node_id}' in this query group because it already belongs to query group '{query_group_name}' (id {query_group_id})\"\n    )]\n    NodeAlreadyInQueryGroup {\n        node_id: Arc<str>,\n        query_group_name: Arc<str>,\n        query_group_id: QueryGroupId,\n    },\n\n    #[error(","sourceCodeStart":353,"sourceCodeEnd":389,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_catalog/src/error.rs#L353-L389","documentation":"This error is returned by the InfluxDB 3 catalog when an attempt is made to remove a node that is currently a member of a query group. The catalog prevents removal because query groups require their member nodes to remain present for distributed query planning; removing a member silently would break the group. The error carries the node id and the name/id of the blocking query group so the operator can act on the group first.","triggerScenarios":"Calling the catalog API to delete/remove a node (e.g. node removal via admin/catalog APIs) while that node's id still appears in a query group's member list.","commonSituations":"Operators decommissioning or replacing a cluster node without first draining it from its query group; scripted node cleanup after a failed upgrade; attempting `influxdb3` node removal while the node is still registered in query-group membership in the catalog.","solutions":["Remove the node from its query group first (update the query group membership to exclude node_id), then retry the node removal","Dissolve or reconfigure the query group if it is no longer needed, then remove the node","Verify the node id is correct — a stale/wrong node id may still be referenced by an old query group"],"exampleFix":"// before\ncatalog.remove_node(node_id)?; // fails: node still in query group\n// after\ncatalog.remove_node_from_query_group(query_group_id, node_id)?;\ncatalog.remove_node(node_id)?;","handlingStrategy":"try-catch","validationCode":"let is_member = catalog.query_groups().iter()\n    .any(|g| g.member_node_ids().contains(&node_id));\nif is_member { /* remove from group first */ }","typeGuard":null,"tryCatchPattern":"match catalog.remove_node(node_id) {\n    Err(e @ CatalogError::NodeInQueryGroup { query_group_id, .. }) => {\n        catalog.remove_node_from_query_group(query_group_id, node_id)?;\n        catalog.remove_node(node_id)?;\n    }\n    r => r?,\n}","preventionTips":["Before deleting a node, always query its query-group membership","Build node decommission runbooks that drain query groups first","Check catalog state before scripted bulk node cleanup"],"tags":["catalog","node-management","query-group","state-conflict"],"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"}