Skip to content

fix: ValueError "Token was created in a different context" - #661

Open
aticie wants to merge 1 commit into
taskiq-python:masterfrom
aticie:fix/opentelemetry-context-issues
Open

fix: ValueError "Token was created in a different context"#661
aticie wants to merge 1 commit into
taskiq-python:masterfrom
aticie:fix/opentelemetry-context-issues

Conversation

@aticie

@aticie aticie commented Aug 24, 2026

Copy link
Copy Markdown

Fixes an issue that happens with OpenTelemetryMiddleware when a message is requeued with Context.requeue().

Context.requeue() uses self.broker.kick to kick a message to the broker which skips the Middleware pre-send and post-send invocations that kicker does here:

taskiq/taskiq/kicker.py

Lines 160 to 162 in ced1909

for middleware in self.broker.middlewares:
if middleware.__class__.pre_send != TaskiqMiddleware.pre_send:
message = await maybe_awaitable(middleware.pre_send(message))

taskiq/taskiq/kicker.py

Lines 168 to 170 in ced1909

for middleware in reversed(self.broker.middlewares):
if middleware.__class__.post_send != TaskiqMiddleware.post_send:
await maybe_awaitable(middleware.post_send(message))

Messages that are requeued with the same context variables will raise an error on post_save's .detach() because they are now running in a different async context.

The message's lifecycle on OpenTelemetryMiddleware will be:

  • pre_send -> message.labels are injected with context here
  • post_send
  • pre_execute -> message.labels are extracted here and re-used
  • post_execute
  • requeue() happens -> skipping pre_send and post_send, therefore not renewing the context.
  • pre_execute -> context inferred from message.labels again
  • post_execute
  • post_save -> Detaching the stale context here. Raises ValueError: Token was created in a different context

This change gets rid of post_save on OpenTelemetryMiddleware to detach the context on post_execute instead. Since, we are not actually doing anything database save related on the current post_save method, it seems fair to move everything under post_execute as this is where the task execution actually ends.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant