@@ -379,6 +379,18 @@ describe('connector lease ACL pages in PostgreSQL', () => {
379379 } )
380380 } )
381381
382+ async function waitForDocumentLock ( ) : Promise < number > {
383+ return vi . waitFor ( async ( ) => {
384+ const [ row ] = await db . execute < { pid : number } > ( sql `
385+ SELECT pid FROM pg_stat_activity
386+ WHERE wait_event_type = 'Lock' AND datname = current_database()
387+ AND (query ILIKE 'update "document" set "acl"%'
388+ OR query ILIKE 'select "id", "chunk_count" from "document"%for update')` )
389+ if ( ! row ) throw new Error ( 'Document ACL writer has not reached the held row' )
390+ return row . pid
391+ } )
392+ }
393+
382394 describe ( 'fence-last pages' , ( ) => {
383395 /**
384396 * A processing commit holds a document row for its whole write. A page waiting on it must not
@@ -409,17 +421,7 @@ describe('connector lease ACL pages in PostgreSQL', () => {
409421 leaseTransaction ( ids . connectorId , adminLease ( ) )
410422 )
411423 try {
412- let waiter : number | undefined
413- for ( let attempt = 0 ; attempt < 100 && waiter === undefined ; attempt ++ ) {
414- const [ row ] = await db . execute < { pid : number } > ( sql `
415- SELECT pid FROM pg_stat_activity
416- WHERE wait_event_type = 'Lock' AND datname = current_database()
417- AND (query ILIKE 'update "document" set "acl"%'
418- OR query ILIKE 'select "id", "chunk_count" from "document"%for update')` )
419- waiter = row ?. pid
420- if ( waiter === undefined ) await new Promise < void > ( ( resolve ) => setImmediate ( resolve ) )
421- }
422- expect ( waiter ) . toBeDefined ( )
424+ const waiter = await waitForDocumentLock ( )
423425 const connectorLocks = await db . execute < { mode : string } > ( sql `
424426 SELECT mode FROM pg_locks
425427 WHERE pid = ${ waiter } AND relation = 'knowledge_connector'::regclass` )
@@ -522,17 +524,7 @@ describe('connector lease ACL pages in PostgreSQL', () => {
522524 lease : createMemberSyncLease ( members . connectorId , members . runId ) ,
523525 } )
524526 try {
525- let waiter : number | undefined
526- for ( let attempt = 0 ; attempt < 200 && waiter === undefined ; attempt ++ ) {
527- const [ row ] = await db . execute < { pid : number } > ( sql `
528- SELECT pid FROM pg_stat_activity
529- WHERE wait_event_type = 'Lock' AND datname = current_database()
530- AND (query ILIKE 'update "document" set "acl"%'
531- OR query ILIKE 'select "id", "chunk_count" from "document"%for update')` )
532- waiter = row ?. pid
533- if ( waiter === undefined ) await new Promise < void > ( ( resolve ) => setImmediate ( resolve ) )
534- }
535- expect ( waiter ) . toBeDefined ( )
527+ const waiter = await waitForDocumentLock ( )
536528 const connectorLocks = await db . execute < { mode : string } > ( sql `
537529 SELECT mode FROM pg_locks
538530 WHERE pid = ${ waiter } AND relation = 'knowledge_connector'::regclass` )
0 commit comments