Skip to content

Commit e88344c

Browse files
ipdaeclaude
andcommitted
feat(seasonpass): bump mainnet image to git-bfbe0b2 (deploy #310 status-backfill lock fix, stacked on #306+#308+#309)
#310 is stacked on #309 -> #308 -> #306, so this single tag bump ships the whole stack on top of the currently-live 52e16aa: 485b172 raise DB pool 30 -> 60 [#306] 887fe57 API: call cleared-stage RPC outside the DB transaction [#308] 52e16aa tracker: run tx-tracker GQL outside the DB transaction [#309] bfbe0b2 API: resolve level before mutating target in backfill [#310] #310 is the durable fix for the recurring lock convoy: the WorldClear on-read backfill set target.exp then called get_level(), whose SELECT autoflushed an UPDATE user_season_pass and held the row lock across the whole block. The reorder (compute level first) keeps the lock to the commit flush only; behaviour and persisted exp/level are unchanged. Adds the first regression tests for the status endpoints. Complements the live ALTER ROLE timeouts. No migration coupling: the #307 partial index is already applied live and the code works with or without it. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 20a74a1 commit e88344c

1 file changed

Lines changed: 14 additions & 9 deletions

File tree

9c-main/external-services/values.yaml

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,25 @@ volumeReclaimPolicy: "Retain"
2727
seasonpass:
2828
enabled: true
2929
image:
30-
# SeasonPass #309 (tx-tracker GQL-out-of-txn) — stacked on #308 -> #306, so
31-
# this bump ships all three at once on top of the live 887fe57:
30+
# SeasonPass #310 (status backfill: drop early row lock) — stacked on
31+
# #309 -> #308 -> #306, so this bump ships the whole stack on top of live
32+
# 52e16aa:
3233
# 485b172 raise DB pool 30 -> 60 (absorb connection holds) [#306]
3334
# 887fe57 API: call cleared-stage RPC outside the DB transaction [#308]
3435
# 52e16aa tracker: run tx-tracker GQL outside the DB transaction [#309]
35-
# #308 stopped API requests from holding a user_season_pass row lock
36-
# idle-in-transaction across the slow GQL call (was piling up claim FOR
37-
# UPDATE waiters and exhausting the pool -> block-status / invalid-claim
38-
# alarms). #309 fixes the same anti-pattern in the tx-tracker, whose
39-
# SELECT-then-GQL held a transaction idle for minutes (observed 448s),
40-
# pinning the xmin horizon and blocking autovacuum on claim/user_season_pass.
36+
# bfbe0b2 API: resolve level before mutating target in backfill [#310]
37+
# #310 is the durable fix for the recurring lock convoy: the WorldClear
38+
# on-read backfill set target.exp then called get_level(), whose SELECT
39+
# autoflushed an UPDATE user_season_pass and took the row lock across the
40+
# whole block. Concurrent polling of the same avatars + claim's FOR UPDATE
41+
# convoyed and exhausted the pool -> block-status / invalid-claim alarms.
42+
# The reorder (compute level first) keeps the row lock to the commit flush
43+
# only; behaviour is unchanged. Complements the live ALTER ROLE timeouts
44+
# (lock_timeout=10s / idle_in_transaction_session_timeout=60s /
45+
# statement_timeout=30s) applied as the safety net.
4146
# No migration coupling: the partial index (#307) is already applied live and
4247
# the code works with or without it.
43-
tag: "git-52e16aa37a83974234e7fef449453b8654ce658c"
48+
tag: "git-bfbe0b2ccd1905f4d9dee59363b38e2755b79ed5"
4449

4550
api:
4651
enabled: true

0 commit comments

Comments
 (0)