Skip to content

Commit 93311f2

Browse files
Only release redis lock if billed
1 parent 56c2dba commit 93311f2

File tree

1 file changed

+8
-1
lines changed
  • apps/sim/app/api/billing/update-cost

1 file changed

+8
-1
lines changed

apps/sim/app/api/billing/update-cost/route.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export async function POST(req: NextRequest) {
3131
const requestId = generateRequestId()
3232
const startTime = Date.now()
3333
let claim: AtomicClaimResult | null = null
34+
let usageCommitted = false
3435

3536
try {
3637
logger.info(`[${requestId}] Update cost request started`)
@@ -137,6 +138,7 @@ export async function POST(req: NextRequest) {
137138
],
138139
additionalStats,
139140
})
141+
usageCommitted = true
140142

141143
logger.info(`[${requestId}] Recorded usage`, {
142144
userId,
@@ -173,7 +175,7 @@ export async function POST(req: NextRequest) {
173175
duration,
174176
})
175177

176-
if (claim?.claimed) {
178+
if (claim?.claimed && !usageCommitted) {
177179
await billingIdempotency
178180
.release(claim.normalizedKey, claim.storageMethod)
179181
.catch((releaseErr) => {
@@ -182,6 +184,11 @@ export async function POST(req: NextRequest) {
182184
normalizedKey: claim?.normalizedKey,
183185
})
184186
})
187+
} else if (claim?.claimed && usageCommitted) {
188+
logger.warn(
189+
`[${requestId}] Error occurred after usage committed; retaining idempotency claim to prevent double-billing`,
190+
{ normalizedKey: claim.normalizedKey }
191+
)
185192
}
186193

187194
return NextResponse.json(

0 commit comments

Comments
 (0)