@@ -112,7 +112,7 @@ addLSNWaiter(XLogRecPtr lsn)
112
112
113
113
Assert (!procInfo -> inHeap );
114
114
115
- procInfo -> latch = MyLatch ;
115
+ procInfo -> procno = MyProcNumber ;
116
116
procInfo -> waitLSN = lsn ;
117
117
118
118
pairingheap_add (& waitLSNState -> waitersHeap , & procInfo -> phNode );
@@ -154,16 +154,17 @@ void
154
154
WaitLSNSetLatches (XLogRecPtr currentLSN )
155
155
{
156
156
int i ;
157
- Latch * * wakeUpProcLatches ;
157
+ ProcNumber * wakeUpProcs ;
158
158
int numWakeUpProcs = 0 ;
159
159
160
- wakeUpProcLatches = palloc (sizeof (Latch * ) * MaxBackends );
160
+ wakeUpProcs = palloc (sizeof (ProcNumber ) * MaxBackends );
161
161
162
162
LWLockAcquire (WaitLSNLock , LW_EXCLUSIVE );
163
163
164
164
/*
165
165
* 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.
167
168
*/
168
169
while (!pairingheap_is_empty (& waitLSNState -> waitersHeap ))
169
170
{
@@ -174,7 +175,7 @@ WaitLSNSetLatches(XLogRecPtr currentLSN)
174
175
procInfo -> waitLSN > currentLSN )
175
176
break ;
176
177
177
- wakeUpProcLatches [numWakeUpProcs ++ ] = procInfo -> latch ;
178
+ wakeUpProcs [numWakeUpProcs ++ ] = procInfo -> procno ;
178
179
(void ) pairingheap_remove_first (& waitLSNState -> waitersHeap );
179
180
procInfo -> inHeap = false;
180
181
}
@@ -191,9 +192,9 @@ WaitLSNSetLatches(XLogRecPtr currentLSN)
191
192
*/
192
193
for (i = 0 ; i < numWakeUpProcs ; i ++ )
193
194
{
194
- SetLatch (wakeUpProcLatches [i ]);
195
+ SetLatch (& GetPGProcByNumber ( wakeUpProcs [i ]) -> procLatch );
195
196
}
196
- pfree (wakeUpProcLatches );
197
+ pfree (wakeUpProcs );
197
198
}
198
199
199
200
/*
0 commit comments