diff options
author | Nathan Bossart <nathan@postgresql.org> | 2024-02-29 10:17:55 -0600 |
---|---|---|
committer | Nathan Bossart <nathan@postgresql.org> | 2024-02-29 10:17:55 -0600 |
commit | 3179701505b9ec58243ffba9d22b1803f320bf60 (patch) | |
tree | 18a874c50433a72bb21057a2142b6ca996908c03 /src | |
parent | bd5132db558b6c8d11eb838be81e2177a95c7388 (diff) | |
download | postgresql-3179701505b9ec58243ffba9d22b1803f320bf60.tar.gz postgresql-3179701505b9ec58243ffba9d22b1803f320bf60.zip |
Convert archiver's force_dir_scan variable to an atomic variable.
Commit bd5132db55 introduced new atomic read/write functions with
full barrier semantics, which are intended to simplify converting
non-performance-critical code to use atomic variables. This commit
demonstrates one such conversion.
Reviewed-by: Yong Li
Discussion: https://postgr.es/m/20231110205128.GB1315705%40nathanxps13
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/postmaster/pgarch.c | 21 |
1 files changed, 5 insertions, 16 deletions
diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index 9c18e4b3efb..04fedfae2fa 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -45,7 +45,6 @@ #include "storage/proc.h" #include "storage/procsignal.h" #include "storage/shmem.h" -#include "storage/spin.h" #include "utils/guc.h" #include "utils/memutils.h" #include "utils/ps_status.h" @@ -83,11 +82,9 @@ typedef struct PgArchData int pgprocno; /* pgprocno of archiver process */ /* - * Forces a directory scan in pgarch_readyXlog(). Protected by arch_lck. + * Forces a directory scan in pgarch_readyXlog(). */ - bool force_dir_scan; - - slock_t arch_lck; + pg_atomic_uint32 force_dir_scan; } PgArchData; char *XLogArchiveLibrary = ""; @@ -174,7 +171,7 @@ PgArchShmemInit(void) /* First time through, so initialize */ MemSet(PgArch, 0, PgArchShmemSize()); PgArch->pgprocno = INVALID_PGPROCNO; - SpinLockInit(&PgArch->arch_lck); + pg_atomic_init_u32(&PgArch->force_dir_scan, 0); } } @@ -545,18 +542,12 @@ pgarch_readyXlog(char *xlog) char XLogArchiveStatusDir[MAXPGPATH]; DIR *rldir; struct dirent *rlde; - bool force_dir_scan; /* * If a directory scan was requested, clear the stored file names and * proceed. */ - SpinLockAcquire(&PgArch->arch_lck); - force_dir_scan = PgArch->force_dir_scan; - PgArch->force_dir_scan = false; - SpinLockRelease(&PgArch->arch_lck); - - if (force_dir_scan) + if (pg_atomic_exchange_u32(&PgArch->force_dir_scan, 0) == 1) arch_files->arch_files_size = 0; /* @@ -707,9 +698,7 @@ ready_file_comparator(Datum a, Datum b, void *arg) void PgArchForceDirScan(void) { - SpinLockAcquire(&PgArch->arch_lck); - PgArch->force_dir_scan = true; - SpinLockRelease(&PgArch->arch_lck); + pg_atomic_write_membarrier_u32(&PgArch->force_dir_scan, 1); } /* |