influxdata/influxdb · error · PluginError

shouldn't have request path trigger for scheduled plugin

Error message

shouldn't have request path trigger for scheduled plugin

What it means

Raised by ScheduleRunner::try_new when a scheduled plugin is constructed with a RequestPath trigger specification. Scheduled plugins cannot be invoked via HTTP request-path triggers; only request-path-capable plugins may use that spec.

Solutions

  1. Use a Schedule trigger spec with a cron expression for this plugin.
  2. If HTTP invocation is needed, register the plugin as a request-path plugin instead.
  3. Correct the CREATE TRIGGER statement to drop the request-path spec.

Example fix

// before
CREATE TRIGGER "t" AT GET /write  // for a scheduled plugin
// after
CREATE TRIGGER "t" ... SCHEDULE '0 * * * *'
Defensive patterns

Strategy: validation

Validate before calling

fn request_path_allowed(spec: &TriggerSpecificationDefinition, plugin_kind: PluginKind) -> bool {
    !matches!(spec, TriggerSpecificationDefinition::RequestPath { .. }) || plugin_kind == PluginKind::Request
}

Prevention

When it happens

Trigger: Calling try_new with TriggerSpecificationDefinition::RequestPath for a scheduled plugin.

Common situations: Admin creates a trigger binding a scheduled plugin to an API endpoint path; confusion between request-trigger plugins and cron plugins.

Understand the failure class

Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.

Related errors


AI-assisted analysis of influxdata/influxdb@06200ef96b (2026-09-19). Data as JSON: /api/errors/390aba0ed1ef72f4. Report an issue: GitHub.

Appendix: source

Thrown at influxdb3_processing_engine/src/plugins.rs:175

}

struct ScheduleTriggerRunner {
    schedule: Schedule,
    next_trigger_time: Option<DateTime<Utc>>,
}

impl ScheduleTriggerRunner {
    fn try_new(
        trigger_spec: &TriggerSpecificationDefinition,
        time_provider: Arc<dyn TimeProvider>,
    ) -> Result<Self, PluginError> {
        match trigger_spec {
            TriggerSpecificationDefinition::AllTablesWalWrite
            | TriggerSpecificationDefinition::SingleTableWalWrite { .. } => {
                Err(anyhow!("shouldn't have table trigger for scheduled plugin").into())
            }
            TriggerSpecificationDefinition::RequestPath { .. } => {
                Err(anyhow!("shouldn't have request path trigger for scheduled plugin").into())
            }
            TriggerSpecificationDefinition::Schedule { schedule } => {
                let schedule = CronSchedule::from_str(schedule.as_str())
                    .context("cron schedule should be parsable")?;
                Ok(Self::new_cron(schedule, time_provider))
            }
            TriggerSpecificationDefinition::Every { duration } => {
                // check that duration isn't longer than a year, so we avoid overflows.
                if *duration > parse_duration("1 year").unwrap() {
                    return Err(anyhow!("schedule duration cannot be greater than 1 year").into());
                }
                Ok(Self::new_every(
                    Duration::from_std(*duration)
                        .context("should be able to convert durations. ")?,
                    time_provider,
                ))
            }
        }

View on GitHub (pinned to 06200ef96b)