{"record":{"id":"07eeb215d75bfce1","repo":"influxdata/influxdb","slug":"plugin-not-found","errorCode":null,"errorMessage":"Plugin not found: {}","messagePattern":"Plugin not found: (.+?)","errorType":"exception","errorClass":"ProcessingEngineError::PluginError","httpStatus":null,"severity":"error","filePath":"influxdb3_processing_engine/src/lib.rs","lineNumber":1120,"sourceCode":"                    async_fs::write(&plugin_path, content).await.map_err(|e| {\n                        ProcessingEngineError::PluginError(plugins::PluginError::ReadPluginError(e))\n                    })?;\n\n                    return Ok(db_schema.name.to_string());\n                }\n\n                // For multi-file plugins (directories), update __init__.py by default\n                let init_file = plugin_path.join(INIT_PY);\n                async_fs::write(&init_file, content).await.map_err(|e| {\n                    ProcessingEngineError::PluginError(plugins::PluginError::ReadPluginError(e))\n                })?;\n\n                return Ok(db_schema.name.to_string());\n            }\n        }\n\n        Err(ProcessingEngineError::PluginError(\n            plugins::PluginError::AnyhowError(anyhow::anyhow!(\"Plugin not found: {}\", plugin_name)),\n        ))\n    }\n\n    /// Replace an entire plugin directory atomically with new files.\n    pub async fn replace_plugin_directory(\n        self: &Arc<Self>,\n        plugin_name: &str,\n        files: Vec<(String, String)>, // Vec of (relative_path, content)\n    ) -> Result<String, ProcessingEngineError> {\n        if self.environment_manager.plugin_dir_only {\n            return Err(ProcessingEngineError::PluginError(\n                PluginError::PluginInstallationDisabled,\n            ));\n        }\n\n        // Find the trigger to get the plugin filename\n        let (db_name, plugin_filename) = {\n            let mut result = None;","sourceCodeStart":1102,"sourceCodeEnd":1138,"githubUrl":"https://github.com/influxdata/influxdb/blob/d28e26e048401c53cbb98cf2d6ab0cf1e98048ca/influxdb3_processing_engine/src/lib.rs#L1102-L1138","documentation":"update_plugin() locates the plugin to update by iterating every database schema's processing_engine_triggers and matching trigger_name against the requested plugin_name; it rewrites the found plugin's __init__.py. If no trigger matches, it returns ProcessingEngineError::PluginError('Plugin not found: {plugin_name}'). Matching is exact (case-sensitive) on the trigger name, not the file name.","triggerScenarios":"Calling the plugin update endpoint/method with a name that does not exactly equal an installed trigger's name — a typo, different casing, or using the plugin filename (e.g. 'my_plugin.py') where the trigger name (e.g. 'my-plugin') is required. Also updating a plugin that was never created.","commonSituations":"Renaming plugins after creation; automating update flows where the name comes from a config that drifted from the installed trigger name; environments with several databases where the operator assumed a global name.","solutions":["List the installed plugin files via the HTTP endpoints (/api/v3/plugins/files, /api/v3/plugins/directory) and check the trigger names in your create-trigger command history","Use the exact, case-sensitive trigger name the trigger was created with","If the plugin genuinely does not exist, create it first, then update"],"exampleFix":"# before: trigger was created as 'my-scheduler'\nPUT /api/v3/plugins/files?name=MyScheduler   # -> Plugin not found: MyScheduler\n\n# after\nPUT /api/v3/plugins/files?name=my-scheduler","handlingStrategy":"validation","validationCode":"# confirm the plugin file exists before updating it\ncurl -sf \"${INFLUXDB3_HOST_URL}/api/v3/plugins/files\" \\\n  | grep -q \"\\\"${PLUGIN_NAME}\\\"\" \\\n  || { echo \"plugin '${PLUGIN_NAME}' not installed\" >&2; exit 1; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep a manifest of installed trigger names and drive updates from it","Trigger-name matching is exact and case-sensitive — copy names from the create-trigger command","Create the plugin/trigger before scripting updates against it"],"tags":["influxdb","processing-engine","plugins","not-found","triggers"],"backgroundTag":"plugin-not-found","analyzedSha":"d28e26e048401c53cbb98cf2d6ab0cf1e98048ca","analyzedAt":"2026-08-16T19:53:34.623Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}