@@ -470,9 +470,8 @@ typedef struct XLogCtlData
470
470
471
471
XLogSegNo lastRemovedSegNo ; /* latest removed/recycled XLOG segment */
472
472
473
- /* Fake LSN counter, for unlogged relations. Protected by ulsn_lck. */
474
- XLogRecPtr unloggedLSN ;
475
- slock_t ulsn_lck ;
473
+ /* Fake LSN counter, for unlogged relations. */
474
+ pg_atomic_uint64 unloggedLSN ;
476
475
477
476
/* Time and LSN of last xlog segment switch. Protected by WALWriteLock. */
478
477
pg_time_t lastSegSwitchTime ;
@@ -4498,14 +4497,7 @@ DataChecksumsEnabled(void)
4498
4497
XLogRecPtr
4499
4498
GetFakeLSNForUnloggedRel (void )
4500
4499
{
4501
- XLogRecPtr nextUnloggedLSN ;
4502
-
4503
- /* increment the unloggedLSN counter, need SpinLock */
4504
- SpinLockAcquire (& XLogCtl -> ulsn_lck );
4505
- nextUnloggedLSN = XLogCtl -> unloggedLSN ++ ;
4506
- SpinLockRelease (& XLogCtl -> ulsn_lck );
4507
-
4508
- return nextUnloggedLSN ;
4500
+ return pg_atomic_fetch_add_u64 (& XLogCtl -> unloggedLSN , 1 );
4509
4501
}
4510
4502
4511
4503
/*
@@ -4921,7 +4913,7 @@ XLOGShmemInit(void)
4921
4913
4922
4914
SpinLockInit (& XLogCtl -> Insert .insertpos_lck );
4923
4915
SpinLockInit (& XLogCtl -> info_lck );
4924
- SpinLockInit (& XLogCtl -> ulsn_lck );
4916
+ pg_atomic_init_u64 (& XLogCtl -> unloggedLSN , InvalidXLogRecPtr );
4925
4917
}
4926
4918
4927
4919
/*
@@ -5526,9 +5518,11 @@ StartupXLOG(void)
5526
5518
* the unlogged LSN counter can be reset too.
5527
5519
*/
5528
5520
if (ControlFile -> state == DB_SHUTDOWNED )
5529
- XLogCtl -> unloggedLSN = ControlFile -> unloggedLSN ;
5521
+ pg_atomic_write_membarrier_u64 (& XLogCtl -> unloggedLSN ,
5522
+ ControlFile -> unloggedLSN );
5530
5523
else
5531
- XLogCtl -> unloggedLSN = FirstNormalUnloggedLSN ;
5524
+ pg_atomic_write_membarrier_u64 (& XLogCtl -> unloggedLSN ,
5525
+ FirstNormalUnloggedLSN );
5532
5526
5533
5527
/*
5534
5528
* Copy any missing timeline history files between 'now' and the recovery
@@ -7110,9 +7104,7 @@ CreateCheckPoint(int flags)
7110
7104
* unused on non-shutdown checkpoints, but seems useful to store it always
7111
7105
* for debugging purposes.
7112
7106
*/
7113
- SpinLockAcquire (& XLogCtl -> ulsn_lck );
7114
- ControlFile -> unloggedLSN = XLogCtl -> unloggedLSN ;
7115
- SpinLockRelease (& XLogCtl -> ulsn_lck );
7107
+ ControlFile -> unloggedLSN = pg_atomic_read_membarrier_u64 (& XLogCtl -> unloggedLSN );
7116
7108
7117
7109
UpdateControlFile ();
7118
7110
LWLockRelease (ControlFileLock );
0 commit comments