|
137 | 137 | * SerialControlLock
|
138 | 138 | * - Protects SerialControlData members
|
139 | 139 | *
|
140 |
| - * SerialSLRULock |
| 140 | + * SLRU per-bank locks |
141 | 141 | * - Protects SerialSlruCtl
|
142 | 142 | *
|
143 | 143 | * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
@@ -908,20 +908,25 @@ SerialAdd(TransactionId xid, SerCommitSeqNo minConflictCommitSeqNo)
|
908 | 908 | if (isNewPage)
|
909 | 909 | serialControl->headPage = targetPage;
|
910 | 910 |
|
911 |
| - LWLockAcquire(lock, LW_EXCLUSIVE); |
912 |
| - |
913 | 911 | if (isNewPage)
|
914 | 912 | {
|
915 |
| - /* Initialize intervening pages. */ |
916 |
| - while (firstZeroPage != targetPage) |
| 913 | + /* Initialize intervening pages; might involve trading locks */ |
| 914 | + for (;;) |
917 | 915 | {
|
918 |
| - (void) SimpleLruZeroPage(SerialSlruCtl, firstZeroPage); |
| 916 | + lock = SimpleLruGetBankLock(SerialSlruCtl, firstZeroPage); |
| 917 | + LWLockAcquire(lock, LW_EXCLUSIVE); |
| 918 | + slotno = SimpleLruZeroPage(SerialSlruCtl, firstZeroPage); |
| 919 | + if (firstZeroPage == targetPage) |
| 920 | + break; |
919 | 921 | firstZeroPage = SerialNextPage(firstZeroPage);
|
| 922 | + LWLockRelease(lock); |
920 | 923 | }
|
921 |
| - slotno = SimpleLruZeroPage(SerialSlruCtl, targetPage); |
922 | 924 | }
|
923 | 925 | else
|
| 926 | + { |
| 927 | + LWLockAcquire(lock, LW_EXCLUSIVE); |
924 | 928 | slotno = SimpleLruReadPage(SerialSlruCtl, targetPage, true, xid);
|
| 929 | + } |
925 | 930 |
|
926 | 931 | SerialValue(slotno, xid) = minConflictCommitSeqNo;
|
927 | 932 | SerialSlruCtl->shared->page_dirty[slotno] = true;
|
|
0 commit comments