aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNathan Bossart <nathan@postgresql.org>2024-02-29 10:17:55 -0600
committerNathan Bossart <nathan@postgresql.org>2024-02-29 10:17:55 -0600
commit3179701505b9ec58243ffba9d22b1803f320bf60 (patch)
tree18a874c50433a72bb21057a2142b6ca996908c03 /src
parentbd5132db558b6c8d11eb838be81e2177a95c7388 (diff)
downloadpostgresql-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.c21
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);
}
/*