@@ -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