fix(test): wait for database timeout before judging fleet rollback

This commit is contained in:
2026-10-04 10:37:43 +08:00
parent 8a735020e3
commit ba4179b28c
2 changed files with 16 additions and 5 deletions
+9 -4
View File
@@ -62,6 +62,11 @@ export function assertMidTransactionObservation(rows) {
demand(dispatch.length===1&&dispatch[0].status==='DEPARTED'&&dispatch[0].shipped===1&&outbound.length===1&&outbound[0].status==='OUTBOUNDED'&&replay.length===1&&replay[0].count===1,'FIRST_CUSTOMER_UNCOMMITTED_WRITE_NOT_PROVED')
return {leaseConnectionId:lease[0].connectionId,requestingConnectionId:wait[0].requester,lockId:lease[0].lockId,dirtyObservationOnly:true}
}
export function requestRollbackDeparture(context,path,body,token) {
// The normal JSON request stops at 30 seconds. This deliberate 50-second
// database timeout needs the existing 60-second, single-attempt request path.
return context.requestWithBody('POST',path,body,token)
}
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})})
@@ -90,16 +95,13 @@ export function createDepartureRollbackVerifier(env,config,runtime) {
if(rows.filter(x=>x.collection==='lease').length===1)break
demand(i!==11,'LIVE_LEASE_NOT_OBSERVED');await pause(250)
}
pending=context.request('POST',departPath,departBody,fixture.pdaToken).then(value=>({value}),error=>({error:error.message}))
pending=requestRollbackDeparture(context,departPath,departBody,fixture.pdaToken).then(value=>({value}),error=>({error:error.message}))
for(let i=0;i<20;i++) {
const rows=(await remote(env,scope,'OBSERVE')).rows;report.samples.push({phase:'MID_TRANSACTION',rows});save()
if(rows.some(x=>x.collection==='wait')) {report.observation=assertMidTransactionObservation(rows);save();break}
demand(i!==19,'MID_TRANSACTION_NOT_OBSERVED');await pause(250)
}
report.response=await pending;save()
demand(!report.response.error,'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')
report.lease=await leasePromise;save()
demand(!report.lease.error&&report.lease.value.rows.at(-1)?.released===true,'LEASE_RELEASE_NOT_PROVED')
const released=report.released=(await remote(env,scope,'RELEASED')).rows
@@ -107,6 +109,9 @@ export function createDepartureRollbackVerifier(env,config,runtime) {
const restored=await snapshot('ROLLBACK_AFTER_FAULT')
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')
// The caller also checks restoration before sending the same original command.
report.verified=true;return report
}catch(error){report.error=error.message;throw error}