Files
SGF/scripts/sgf-workshop-read-lock.mjs
2026-11-11 09:00:17 +02:00

3 lines
1.6 KiB
JavaScript

import fs from 'node:fs';import assert from 'node:assert/strict';import {spawn} from 'node:child_process';
const root=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json')).root+'/private/receipt-composition-b4093c6f6707',directory=root+'/workshop-read-lock-'+Date.now();fs.mkdirSync(directory);const start=mode=>{const child=spawn('C:/laragon/tools/sgf-tempo/php-8.4.27/php.exe',['scripts/sgf-workshop-read-lock.php',mode,directory],{windowsHide:true});let output='';child.stdout.on('data',v=>output+=v);child.stderr.on('data',v=>output+=v);return{child,done:new Promise(resolve=>child.on('close',code=>resolve({code,output})))};};const held=start('hold');let read;try{const end=Date.now()+8000;while(!fs.existsSync(directory+'/locked')&&Date.now()<end)await new Promise(r=>setTimeout(r,30));assert(fs.existsSync(directory+'/locked'),'company row lock acquired');read=start('read');const result=await Promise.race([read.done,new Promise(resolve=>setTimeout(()=>resolve({timeout:true}),8000))]);assert(!result.timeout,'read should finish while first transaction remains held');assert.equal(result.code,0,result.output);const proof=JSON.parse(fs.readFileSync(directory+'/read.json'));assert(proof.passed&&proof.first_transaction_still_held);fs.writeFileSync(directory+'/result.json',JSON.stringify({...proof,regression_only:true,business_commands:0,lock_bypassed_by_read_only_sql:true},null,2));console.log(JSON.stringify({passed:true,proof:directory+'/result.json',seconds:proof.seconds}));}finally{fs.writeFileSync(directory+'/release','1');await held.done;if(read)await read.done;}