fix(hybridcloud): Allow skip-on-failure for Jira, Jira Server, VSTS and MS Teams webhooks - #123422
Open
vaind wants to merge 1 commit into
Open
fix(hybridcloud): Allow skip-on-failure for Jira, Jira Server, VSTS and MS Teams webhooks#123422vaind wants to merge 1 commit into
vaind wants to merge 1 commit into
Conversation
…nd MS Teams webhooks Since #122893 strict-ordering providers deliver on one thread per drain, and per-integration Jira and VSTS mailboxes now back up at serial speed. Their handlers tolerate reordering as well as the providers already listed: assignee sync applies the payload's assignee snapshot, status sync is dispatched to a task behind the provider-time watermark from #121084, and Jira's rekey is idempotent. MS Teams forwards card actions and bot membership events, both self-contained. Tests of the strict path pin jira out of the allowlist instead of relying on the default.
vaind
marked this pull request as ready for review
September 2, 2026 12:14
This was referenced Sep 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
jira,jira_server,vstsandmsteamstohybridcloud.webhookpayload.skip_on_failure_providers, which now lists every provider the integration middleware forwards throughWebhookPayload. These four were left as follow-ups in #121057.Why now
Before #122893, any claim of 60 or more records went through the parallel drain regardless of provider, so a strict provider's deep mailbox already got concurrent, reordered delivery with skip-on-failure inside each wave. Jira routinely cleared that depth, so everything below has been reachable in production for months, precisely when its mailbox was deep. #122893 fixed that: a strict claim now delivers on one thread, in order, stopping at the first retryable failure. That is correct, but it also removed the accidental throughput, and the per-integration Jira and VSTS mailboxes are backing up at serial speed. Since the deploy, Jira holds the deepest single mailbox of any provider, its pending count roughly doubled over two hours, and its oldest pending record is aging at wall-clock speed. VSTS peaked at the second-deepest mailbox in the same window.
outcome:retryis rare for both: this is the one-thread ceiling, not head-blocking.What the option exposes
Two webhooks for the same issue can be delivered concurrently or in reverse order, and a failed one is retried after the ones behind it. For every provider here the state that can go wrong is the same as for the providers already listed:
sync_status_inbound, which enqueues a task viaapply_async, and the task drops any event not strictly newer than theExternalIssueprovider-time watermark from fix(integrations): Ignore reordered and replayed inbound status webhooks #121084. Jira and Jira Server stampissue.fields.updated; VSTS stampsSystem.ChangedDate. Thesync_status_inbound.stale_eventcounter already fires for Jira in production.issue.fields.assigneesnapshot. VSTS was held back in fix(hybridcloud): Allow skip-on-failure for Bitbucket, GHE and GitLab webhooks #121057 as syncing from a delta, but Azure work items have a single assignee, soSystem.AssignedTo.newValueis the assignee after the change and an absentnewValueis unassigned, the same snapshot Jira sends.Provider-specific caveats
handle_issue_movedrekeys by exactold_key, so it is idempotent on redelivery, but two moves of one issue delivered in reverse leave theExternalIssueat the intermediate key with no log or halt, and later lookups by key miss until the next move. A status or assignee webhook already carrying the new key can also run before a concurrent rekey commits and drop asno-affected-groups. No GitHub analogue, and Jira project moves are rare. feat(integrations): Report renames that moved no external issue #123480 makes a zero-row rekey observable, splitting a stranded link from the far more common move of an issue nobody linked. Note also that a unique-key conflict during a rekey merges the stale row's links into the survivor and deletes it, which is irreversible rather than a no-op. Jira Server's issue-id bucketing only engages above a volume gate and puts same-issue webhooks in the same bucket, so it is not a mitigation here._get_done_statusesfails open to unresolve. On anyApiError, including a rate limit, it returns an empty set, which makesget_resolve_sync_actionreturnUNRESOLVEfor every state change, and the watermark then advances past the lost resolve. Jira propagates the same failure and no-ops; GitHub and GitLab make no API call. Sixteen threads enqueue sixteen times as many uncachedstateslookups against Azure DevOps per second, so a 429 burst on a deep mailbox would reopen issues in bulk. fix(vsts): Stop unresolving when the work item states lookup fails #123478 fixes this by raising instead, which leaves both the status and the watermark alone. It should deploy beforevstsis added here.installationUpdateand personal messages stay synchronous. A card action is applied as the clicking user via the issue update API with no watermark, so resolve followed by unresolve on one issue in one backed-up claim can land in either order, and the refreshed card can disagree with the result. Self-correcting on the next click, and the double click that causes it is itself a symptom of the wedge. Channel mentions andteamMemberAddedonly send a card;teamMemberRemoveddeletes the integration, and retry backoff could already reorder it against a re-install. The wedge itself is a bug, fixed in fix(msteams): Answer a rejected card action with the API's status #123477:_issue_state_changehit an unboundresponseon any 4xx from the issue update and returned 500, so the record head-blocked the tenant's mailbox through ten attempts at hour-long backoff.What to watch after the flip
Jira Cloud is the only provider here with an unbucketed per-integration mailbox and a cell-side rate limit of 100 requests per second on the webhook endpoint. A 429 is retryable, so watch
outcome:retryforprovider:jira. For VSTS, watch unresolve volume andvsts.get-done-states.failed.Not covered
stripeandvercelalso appear as strictWebhookPayloadproviders, but their forwarding lives in getsentry and was not assessed here.No production effect on its own
sentry-options-automatorpins this option; https://github.com/getsentry/sentry-options-automator/pull/9540 is the change that takes effect. Tests of the strict path now pinjiraout of the allowlist instead of relying on the default.