Add LWLock for OSM usage in loader

Modify the loader to add a LWLock for OSM code.
Update the loader API version to 4.
This commit is contained in:
gayyappan 2024-02-05 16:18:46 -05:00 committed by gayyappan
parent 101e4c57ef
commit 8c34a207d9
7 changed files with 38 additions and 3 deletions

1
.unreleased/pr_6608 Normal file
View File

@ -0,0 +1 @@
Implements: #6608 Add LWLock for OSM usage in loader

View File

@ -11,7 +11,7 @@
#include "launcher_interface.h" #include "launcher_interface.h"
#include "compat/compat.h" #include "compat/compat.h"
#define MIN_LOADER_API_VERSION 3 #define MIN_LOADER_API_VERSION 4
extern bool extern bool
ts_bgw_worker_reserve(void) ts_bgw_worker_reserve(void)

View File

@ -16,7 +16,14 @@
/* This is where versioned-extension facing functions live. They shouldn't live anywhere else. */ /* 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_reserve);
TS_FUNCTION_INFO_V1(ts_bgw_worker_release); TS_FUNCTION_INFO_V1(ts_bgw_worker_release);

View File

@ -14,6 +14,7 @@
#define TS_LWLOCKS_SHMEM_NAME "ts_lwlocks_shmem" #define TS_LWLOCKS_SHMEM_NAME "ts_lwlocks_shmem"
#define CHUNK_APPEND_LWLOCK_TRANCHE_NAME "ts_chunk_append_lwlock_tranche" #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 * since shared memory can only be setup in a library loaded as
@ -22,6 +23,7 @@
typedef struct TSLWLocks typedef struct TSLWLocks
{ {
LWLock *chunk_append; LWLock *chunk_append;
LWLock *osm_parallel_lwlock;
} TSLWLocks; } TSLWLocks;
static TSLWLocks *ts_lwlocks = NULL; static TSLWLocks *ts_lwlocks = NULL;
@ -30,7 +32,7 @@ void
ts_lwlocks_shmem_startup() ts_lwlocks_shmem_startup()
{ {
bool found; bool found;
LWLock **lock_pointer; LWLock **lock_pointer, **osm_lock_pointer;
LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE);
ts_lwlocks = ShmemInitStruct(TS_LWLOCKS_SHMEM_NAME, sizeof(TSLWLocks), &found); ts_lwlocks = ShmemInitStruct(TS_LWLOCKS_SHMEM_NAME, sizeof(TSLWLocks), &found);
@ -38,6 +40,8 @@ ts_lwlocks_shmem_startup()
{ {
memset(ts_lwlocks, 0, sizeof(TSLWLocks)); memset(ts_lwlocks, 0, sizeof(TSLWLocks));
ts_lwlocks->chunk_append = &(GetNamedLWLockTranche(CHUNK_APPEND_LWLOCK_TRANCHE_NAME))->lock; 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); LWLockRelease(AddinShmemInitLock);
@ -48,11 +52,21 @@ ts_lwlocks_shmem_startup()
*/ */
lock_pointer = (LWLock **) find_rendezvous_variable(RENDEZVOUS_CHUNK_APPEND_LWLOCK); lock_pointer = (LWLock **) find_rendezvous_variable(RENDEZVOUS_CHUNK_APPEND_LWLOCK);
*lock_pointer = ts_lwlocks->chunk_append; *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 void
ts_lwlocks_shmem_alloc() ts_lwlocks_shmem_alloc()
{ {
RequestNamedLWLockTranche(CHUNK_APPEND_LWLOCK_TRANCHE_NAME, 1); RequestNamedLWLockTranche(CHUNK_APPEND_LWLOCK_TRANCHE_NAME, 1);
RequestNamedLWLockTranche(OSM_PARALLEL_LWLOCK_TRANCHE_NAME, 1);
RequestAddinShmemSpace(sizeof(TSLWLocks)); RequestAddinShmemSpace(sizeof(TSLWLocks));
} }

View File

@ -6,6 +6,7 @@
#pragma once #pragma once
#define RENDEZVOUS_CHUNK_APPEND_LWLOCK "ts_chunk_append_lwlock" #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_startup(void);
void ts_lwlocks_shmem_alloc(void); void ts_lwlocks_shmem_alloc(void);

View File

@ -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: mock post_analyze_hook "mock-2" WARNING: mock post_analyze_hook "mock-2"
WARNING: OSM-mock-1 _PG_init 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"
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. -- Test that OSM process utility hook works: it should see this DROP TABLE.

View File

@ -10,6 +10,7 @@
#include "compat/compat.h" #include "compat/compat.h"
#include "export.h" #include "export.h"
#include "loader/lwlocks.h"
#ifdef PG_MODULE_MAGIC #ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC; PG_MODULE_MAGIC;
@ -33,6 +34,16 @@ void
_PG_init(void) _PG_init(void)
{ {
elog(WARNING, "OSM-%s _PG_init", OSM_VERSION_MOD); 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; prev_ProcessUtility_hook = ProcessUtility_hook;
ProcessUtility_hook = osm_process_utility_hook; ProcessUtility_hook = osm_process_utility_hook;
} }