{"record":{"id":"593d73ebd31288bd","repo":"influxdata/influxdb","slug":"plugin-trigger-is-already-disabled","errorCode":null,"errorMessage":"plugin trigger is already disabled","messagePattern":"plugin trigger is already disabled","errorType":"validation","errorClass":"CatalogError","httpStatus":409,"severity":"warning","filePath":"influxdb3_catalog/src/error.rs","lineNumber":87,"sourceCode":"    )]\n    BackupCheckpointAhead {\n        checkpoint_sequence: u64,\n        live_sequence: u64,\n    },\n\n    #[error(\"invalid configuration provided: {message}\")]\n    InvalidConfiguration { message: Box<str> },\n\n    #[error(\"only tag and string columns are supported in the distinct cache\")]\n    InvalidDistinctCacheColumnType,\n\n    #[error(\"only uint64, int64, bool, tag, and string columns are supported in the last cache\")]\n    InvalidLastCacheKeyColumnType,\n\n    #[error(\"plugin trigger is already enabled\")]\n    TriggerAlreadyEnabled,\n\n    #[error(\"plugin trigger is already disabled\")]\n    TriggerAlreadyDisabled,\n\n    #[error(\"invalid column type for column '{column_name}', expected {expected}, got {got}\")]\n    InvalidColumnType {\n        column_name: Arc<str>,\n        expected: InfluxColumnType,\n        got: InfluxColumnType,\n    },\n\n    #[error(\"'{0}' is a reserved column\")]\n    ReservedColumn(Arc<str>),\n\n    #[error(\n        \"table '{table_name}' is not defined in database '{db_name}', which uses explicit schemas; \\\n         create the table with the /api/v3/configure/table API before writing to it\"\n    )]\n    UndeclaredTable {\n        db_name: Arc<str>,","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/influxdata/influxdb/blob/06200ef96ba82c5f6727e5038a83af8e722c6875/influxdb3_catalog/src/error.rs#L69-L105","documentation":"CatalogError::TriggerAlreadyDisabled is thrown when disabling a plugin trigger that is already in the disabled state. The catalog validates the trigger's status during the disable operation and rejects the redundant state transition.","triggerScenarios":"POSTing to the trigger disable API for a trigger whose status is already 'disabled', or calling catalog disable_trigger twice without an intervening enable.","commonSituations":"Cleanup/teardown scripts that disable all triggers on shutdown and are run more than once; concurrent API clients issuing the same disable; retries after ambiguous network failures.","solutions":["Check the trigger's current status before disabling and skip if already disabled.","Treat this error as success in idempotent teardown: catch it and continue when the intent was 'ensure disabled'.","Enable the trigger first if you intended to toggle rather than just disable."],"exampleFix":"// before\nfor (const t of triggers) await client.post(`/api/v3/configure/triggers/${t}/disable`); // errors on second run\n// after\nfor (const t of triggers) {\n  const s = (await client.get(`/api/v3/configure/triggers/${t}`)).status;\n  if (s === \"enabled\") await client.post(`/api/v3/configure/triggers/${t}/disable`);\n}","handlingStrategy":"try-catch","validationCode":"const trig = await client.get(`/api/v3/configure/triggers/${name}`);\nif (trig.status === \"disabled\") return; // already disabled","typeGuard":null,"tryCatchPattern":"try {\n  await disableTrigger(name);\n} catch (e) {\n  if (e.message.includes(\"already disabled\")) return; // treat as success\n  throw e;\n}","preventionTips":["Make teardown scripts idempotent: check status first.","Serialize trigger management through a single control plane/lock.","Treat state-conflict errors as success when the goal is 'ensure state X'."],"tags":["influxdb3","trigger","plugin","idempotency"],"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"}