{"version":"2.1.222","anchor":"design-oauth-refresh-distinguishes-lock-contention-from-fail","canonical_anchor":"design-oauth-refresh-distinguishes-lock-contention-from-fail","heading":"Design OAuth refresh distinguishes lock contention from failure","tier":"notice","area":"Elsewhere","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.222\/e\/design-oauth-refresh-distinguishes-lock-contention-from-fail","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.222","markdown":"### Design OAuth refresh distinguishes lock contention from failure\n\nDesign sign-in refreshes no longer report a failure when another process just got there first.\n\n**What**\n\nA refresh that loses the cross-process lock race is now reported as contention rather than as a failed refresh, and a compromised lock can still succeed.\n\n**Details**\n\n- New `DesignOauthLockContendedError` marks the case where another process holds the refresh lock.\n- On a compromised lock the stored token is re-read and accepted if it is still fresh.\n- New telemetry codes: `design_oauth_refresh_lock_contention`, `_lock_compromised`, `_lock_error`.\n\n**Evidence**\n\n`Design OAuth lock contention: another process is holding the refresh lock`\n\n- Area: Elsewhere\n- Tier: You'll notice\n- Useful: 2\/5\n- Signal: 0\/5"}