@@ -112,7 +112,7 @@ addLSNWaiter(XLogRecPtr lsn)
112112
113113	Assert (!procInfo -> inHeap );
114114
115- 	procInfo -> latch  =  MyLatch ;
115+ 	procInfo -> procno  =  MyProcNumber ;
116116	procInfo -> waitLSN  =  lsn ;
117117
118118	pairingheap_add (& waitLSNState -> waitersHeap , & procInfo -> phNode );
@@ -154,16 +154,17 @@ void
154154WaitLSNSetLatches (XLogRecPtr  currentLSN )
155155{
156156	int 			i ;
157- 	Latch 	   * * wakeUpProcLatches ;
157+ 	ProcNumber   * wakeUpProcs ;
158158	int 			numWakeUpProcs  =  0 ;
159159
160- 	wakeUpProcLatches  =  palloc (sizeof (Latch   * ) *  MaxBackends );
160+ 	wakeUpProcs  =  palloc (sizeof (ProcNumber ) *  MaxBackends );
161161
162162	LWLockAcquire (WaitLSNLock , LW_EXCLUSIVE );
163163
164164	/* 
165165	 * Iterate the pairing heap of waiting processes till we find LSN not yet 
166- 	 * replayed.  Record the process latches to set them later. 
166+ 	 * replayed.  Record the process numbers to wake up, but to avoid holding 
167+ 	 * the lock for too long, send the wakeups only after releasing the lock. 
167168	 */ 
168169	while  (!pairingheap_is_empty (& waitLSNState -> waitersHeap ))
169170	{
@@ -174,7 +175,7 @@ WaitLSNSetLatches(XLogRecPtr currentLSN)
174175			procInfo -> waitLSN  >  currentLSN )
175176			break ;
176177
177- 		wakeUpProcLatches [numWakeUpProcs ++ ] =  procInfo -> latch ;
178+ 		wakeUpProcs [numWakeUpProcs ++ ] =  procInfo -> procno ;
178179		(void ) pairingheap_remove_first (& waitLSNState -> waitersHeap );
179180		procInfo -> inHeap  =  false;
180181	}
@@ -191,9 +192,9 @@ WaitLSNSetLatches(XLogRecPtr currentLSN)
191192	 */ 
192193	for  (i  =  0 ; i  <  numWakeUpProcs ; i ++ )
193194	{
194- 		SetLatch (wakeUpProcLatches [i ]);
195+ 		SetLatch (& GetPGProcByNumber ( wakeUpProcs [i ]) -> procLatch );
195196	}
196- 	pfree (wakeUpProcLatches );
197+ 	pfree (wakeUpProcs );
197198}
198199
199200/* 
0 commit comments