fix(test): require precise database lock conflict during rollback

This commit is contained in:
2026-10-04 10:44:33 +08:00
parent ba4179b28c
commit 446fad33d0
2 changed files with 13 additions and 3 deletions
+6 -2
View File
@@ -67,6 +67,11 @@ export function requestRollbackDeparture(context,path,body,token) {
// database timeout needs the existing 60-second, single-attempt request path.
return context.requestWithBody('POST',path,body,token)
}
export function assertDatabaseLockConflict(response) {
demand(response?.http===200&&String(response.body?.code)==='A0409'
&&response.body?.message==='资源正在处理中,请稍后重试'
&&response.requestId&&response.traceId,'EXPECTED_DATABASE_LOCK_CONFLICT_REQUIRED')
}
async function remote(env,scope,mode) {
const script=buildRollbackRemoteScript(scope,mode,env.FBA_CORE_JENKINS_AGENT)
const response=await fetch(new URL('scriptText',env.JENKINS_URL.replace(/\/?$/,'/')),{method:'POST',redirect:'error',signal:AbortSignal.timeout(mode==='LEASE'?95000:45000),headers:{Authorization:'Basic '+Buffer.from(env.JENKINS_USER+':'+env.JENKINS_API_TOKEN).toString('base64'),'Content-Type':'application/x-www-form-urlencoded'},body:new URLSearchParams({script})})
@@ -110,8 +115,7 @@ export function createDepartureRollbackVerifier(env,config,runtime) {
report.consistentSnapshot={beforeSha256:createHash('sha256').update(canonical(ready)).digest('hex'),afterSha256:createHash('sha256').update(canonical(restored)).digest('hex')}
demand(report.consistentSnapshot.beforeSha256===report.consistentSnapshot.afterSha256,'FULL_TWO_CUSTOMER_ROLLBACK_SNAPSHOT_CHANGED')
demand(!report.response.error&&report.response.value?.http!==0,'DEPARTURE_OUTCOME_UNKNOWN_RETAIN_ORIGINAL_COMMAND')
const response=report.response.value
demand(response.http===500||(response.http===200&&String(response.body?.code)==='S0500'),'EXPECTED_DATABASE_FAILURE_RESPONSE_REQUIRED')
assertDatabaseLockConflict(report.response.value)
// The caller also checks restoration before sending the same original command.
report.verified=true;return report
}catch(error){report.error=error.message;throw error}