From 8c34a207d9cc1a3f6e0b26755d72bca17f0a6c8c Mon Sep 17 00:00:00 2001 From: gayyappan Date: Mon, 5 Feb 2024 16:18:46 -0500 Subject: [PATCH] Add LWLock for OSM usage in loader Modify the loader to add a LWLock for OSM code. Update the loader API version to 4. --- .unreleased/pr_6608 | 1 + src/bgw/launcher_interface.c | 2 +- src/loader/bgw_interface.c | 9 ++++++++- src/loader/lwlocks.c | 16 +++++++++++++++- src/loader/lwlocks.h | 1 + test/expected/loader-tsl.out | 1 + test/src/loader/osm_init.c | 11 +++++++++++ 7 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 .unreleased/pr_6608 diff --git a/.unreleased/pr_6608 b/.unreleased/pr_6608 new file mode 100644 index 00000000000..1f400a3e8d4 --- /dev/null +++ b/.unreleased/pr_6608 @@ -0,0 +1 @@ +Implements: #6608 Add LWLock for OSM usage in loader diff --git a/src/bgw/launcher_interface.c b/src/bgw/launcher_interface.c index 7681832dcbe..61487bb3362 100644 --- a/src/bgw/launcher_interface.c +++ b/src/bgw/launcher_interface.c @@ -11,7 +11,7 @@ #include "launcher_interface.h" #include "compat/compat.h" -#define MIN_LOADER_API_VERSION 3 +#define MIN_LOADER_API_VERSION 4 extern bool ts_bgw_worker_reserve(void) diff --git a/src/loader/bgw_interface.c b/src/loader/bgw_interface.c index 706468a9bb7..6d09c5e10b6 100644 --- a/src/loader/bgw_interface.c +++ b/src/loader/bgw_interface.c @@ -16,7 +16,14 @@ /* This is where versioned-extension facing functions live. They shouldn't live anywhere else. */ -const int32 ts_bgw_loader_api_version = 3; +/* All loader changes should always be backward compatible. + * Update ts_bgw_loader_api_version if the loader changes are needed for newer extension updates. + * e.g. adding a LWLock to loader is required for some future change coming to OSM extension version + * xxxx. RENDEZVOUS_BGW_LOADER_API_VERSION is used to verify if the loader in use is compatible with + * the current TimescaleDB version. This check happens in bgw/bgw_launcher.c When + * ts_bgw_loader_api_version is updated, check the compatibility in bgw/bgw_launcher.c as well + */ +const int32 ts_bgw_loader_api_version = 4; TS_FUNCTION_INFO_V1(ts_bgw_worker_reserve); TS_FUNCTION_INFO_V1(ts_bgw_worker_release); diff --git a/src/loader/lwlocks.c b/src/loader/lwlocks.c index 478c72e6a23..a31bd5cc8fa 100644 --- a/src/loader/lwlocks.c +++ b/src/loader/lwlocks.c @@ -14,6 +14,7 @@ #define TS_LWLOCKS_SHMEM_NAME "ts_lwlocks_shmem" #define CHUNK_APPEND_LWLOCK_TRANCHE_NAME "ts_chunk_append_lwlock_tranche" +#define OSM_PARALLEL_LWLOCK_TRANCHE_NAME "ts_osm_parallel_lwlock_tranche" /* * since shared memory can only be setup in a library loaded as @@ -22,6 +23,7 @@ typedef struct TSLWLocks { LWLock *chunk_append; + LWLock *osm_parallel_lwlock; } TSLWLocks; static TSLWLocks *ts_lwlocks = NULL; @@ -30,7 +32,7 @@ void ts_lwlocks_shmem_startup() { bool found; - LWLock **lock_pointer; + LWLock **lock_pointer, **osm_lock_pointer; LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); ts_lwlocks = ShmemInitStruct(TS_LWLOCKS_SHMEM_NAME, sizeof(TSLWLocks), &found); @@ -38,6 +40,8 @@ ts_lwlocks_shmem_startup() { memset(ts_lwlocks, 0, sizeof(TSLWLocks)); ts_lwlocks->chunk_append = &(GetNamedLWLockTranche(CHUNK_APPEND_LWLOCK_TRANCHE_NAME))->lock; + ts_lwlocks->osm_parallel_lwlock = + &(GetNamedLWLockTranche(OSM_PARALLEL_LWLOCK_TRANCHE_NAME))->lock; } LWLockRelease(AddinShmemInitLock); @@ -48,11 +52,21 @@ ts_lwlocks_shmem_startup() */ lock_pointer = (LWLock **) find_rendezvous_variable(RENDEZVOUS_CHUNK_APPEND_LWLOCK); *lock_pointer = ts_lwlocks->chunk_append; + osm_lock_pointer = (LWLock **) find_rendezvous_variable(RENDEZVOUS_OSM_PARALLEL_LWLOCK); + *osm_lock_pointer = ts_lwlocks->osm_parallel_lwlock; } +/* + * from postgres code comments: + * Extensions (or core code) can obtain an LWLocks by calling + * RequestNamedLWLockTranche() during postmaster startup. Subsequently, + * call GetNamedLWLockTranche() to obtain a pointer to an array containing + * the number of LWLocks requested. + */ void ts_lwlocks_shmem_alloc() { RequestNamedLWLockTranche(CHUNK_APPEND_LWLOCK_TRANCHE_NAME, 1); + RequestNamedLWLockTranche(OSM_PARALLEL_LWLOCK_TRANCHE_NAME, 1); RequestAddinShmemSpace(sizeof(TSLWLocks)); } diff --git a/src/loader/lwlocks.h b/src/loader/lwlocks.h index 41e895c86a2..24b47cc232c 100644 --- a/src/loader/lwlocks.h +++ b/src/loader/lwlocks.h @@ -6,6 +6,7 @@ #pragma once #define RENDEZVOUS_CHUNK_APPEND_LWLOCK "ts_chunk_append_lwlock" +#define RENDEZVOUS_OSM_PARALLEL_LWLOCK "ts_osm_parallel_lwlock" void ts_lwlocks_shmem_startup(void); void ts_lwlocks_shmem_alloc(void); diff --git a/test/expected/loader-tsl.out b/test/expected/loader-tsl.out index 38e30c3fac7..9a2928d65e9 100644 --- a/test/expected/loader-tsl.out +++ b/test/expected/loader-tsl.out @@ -557,6 +557,7 @@ CREATE EXTENSION timescaledb_osm VERSION 'mock-1'; WARNING: mock post_analyze_hook "mock-2" WARNING: mock post_analyze_hook "mock-2" WARNING: OSM-mock-1 _PG_init +WARNING: got lwlock osm lock WARNING: mock post_analyze_hook "mock-2" WARNING: mock post_analyze_hook "mock-2" -- Test that OSM process utility hook works: it should see this DROP TABLE. diff --git a/test/src/loader/osm_init.c b/test/src/loader/osm_init.c index f7d75204d6f..e8995ba80f1 100644 --- a/test/src/loader/osm_init.c +++ b/test/src/loader/osm_init.c @@ -10,6 +10,7 @@ #include "compat/compat.h" #include "export.h" +#include "loader/lwlocks.h" #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; @@ -33,6 +34,16 @@ void _PG_init(void) { elog(WARNING, "OSM-%s _PG_init", OSM_VERSION_MOD); + void *osm_lock_pointer = (LWLock **) find_rendezvous_variable(RENDEZVOUS_OSM_PARALLEL_LWLOCK); + if (osm_lock_pointer != NULL) + { + elog(WARNING, "got lwlock osm lock"); + } + else + { + elog(WARNING, "NO lwlock osm lock"); + } + prev_ProcessUtility_hook = ProcessUtility_hook; ProcessUtility_hook = osm_process_utility_hook; }