|
|
|
@ -17,11 +17,6 @@ |
|
|
|
|
#include "storage/lwlock.h" |
|
|
|
|
#include "storage/shmem.h" |
|
|
|
|
|
|
|
|
|
typedef struct TdeSharedState |
|
|
|
|
{ |
|
|
|
|
void *rawDsaArea; /* DSA area pointer to store cache hashes */ |
|
|
|
|
} TdeSharedState; |
|
|
|
|
|
|
|
|
|
static void tde_shmem_shutdown(int code, Datum arg); |
|
|
|
|
|
|
|
|
|
List *registeredShmemRequests = NIL; |
|
|
|
@ -47,7 +42,6 @@ TdeRequiredSharedMemorySize(void) |
|
|
|
|
if (routine->required_shared_mem_size) |
|
|
|
|
sz = add_size(sz, routine->required_shared_mem_size()); |
|
|
|
|
} |
|
|
|
|
sz = add_size(sz, sizeof(TdeSharedState)); |
|
|
|
|
return MAXALIGN(sz); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -61,25 +55,22 @@ void |
|
|
|
|
TdeShmemInit(void) |
|
|
|
|
{ |
|
|
|
|
bool found; |
|
|
|
|
TdeSharedState *tdeState; |
|
|
|
|
char *free_start; |
|
|
|
|
Size required_shmem_size = TdeRequiredSharedMemorySize(); |
|
|
|
|
|
|
|
|
|
LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); |
|
|
|
|
/* Create or attach to the shared memory state */ |
|
|
|
|
ereport(NOTICE, errmsg("TdeShmemInit: requested %ld bytes", required_shmem_size)); |
|
|
|
|
tdeState = ShmemInitStruct("pg_tde", required_shmem_size, &found); |
|
|
|
|
free_start = ShmemInitStruct("pg_tde", required_shmem_size, &found); |
|
|
|
|
|
|
|
|
|
if (!found) |
|
|
|
|
{ |
|
|
|
|
/* First time through ... */ |
|
|
|
|
char *p = (char *) tdeState; |
|
|
|
|
dsa_area *dsa; |
|
|
|
|
ListCell *lc; |
|
|
|
|
Size used_size = 0; |
|
|
|
|
Size dsa_area_size; |
|
|
|
|
|
|
|
|
|
p += MAXALIGN(sizeof(TdeSharedState)); |
|
|
|
|
used_size += MAXALIGN(sizeof(TdeSharedState)); |
|
|
|
|
/* Now place all shared state structures */ |
|
|
|
|
foreach(lc, registeredShmemRequests) |
|
|
|
|
{ |
|
|
|
@ -88,19 +79,18 @@ TdeShmemInit(void) |
|
|
|
|
|
|
|
|
|
if (routine->init_shared_state) |
|
|
|
|
{ |
|
|
|
|
sz = routine->init_shared_state(p); |
|
|
|
|
sz = routine->init_shared_state(free_start); |
|
|
|
|
used_size += MAXALIGN(sz); |
|
|
|
|
p += MAXALIGN(sz); |
|
|
|
|
free_start += MAXALIGN(sz); |
|
|
|
|
Assert(used_size <= required_shmem_size); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
/* Create DSA area */ |
|
|
|
|
dsa_area_size = required_shmem_size - used_size; |
|
|
|
|
Assert(dsa_area_size > 0); |
|
|
|
|
tdeState->rawDsaArea = p; |
|
|
|
|
|
|
|
|
|
ereport(LOG, errmsg("creating DSA area of size %lu", dsa_area_size)); |
|
|
|
|
dsa = dsa_create_in_place(tdeState->rawDsaArea, |
|
|
|
|
dsa = dsa_create_in_place(free_start, |
|
|
|
|
dsa_area_size, |
|
|
|
|
LWLockNewTrancheId(), 0); |
|
|
|
|
dsa_pin(dsa); |
|
|
|
@ -112,7 +102,7 @@ TdeShmemInit(void) |
|
|
|
|
TDEShmemSetupRoutine *routine = (TDEShmemSetupRoutine *) lfirst(lc); |
|
|
|
|
|
|
|
|
|
if (routine->init_dsa_area_objects) |
|
|
|
|
routine->init_dsa_area_objects(dsa, tdeState->rawDsaArea); |
|
|
|
|
routine->init_dsa_area_objects(dsa, free_start); |
|
|
|
|
} |
|
|
|
|
ereport(LOG, errmsg("setting no limit to DSA area of size %lu", dsa_area_size)); |
|
|
|
|
|
|
|
|
|