Commit 69f94108 authored by Michael Paquier's avatar Michael Paquier

Allow definition of lock mode for custom reloptions

Relation options can define a lock mode other than AccessExclusiveMode
since 47167b79, but modules defining custom relation options did not
really have a way to enforce that.  Correct that by extending the
current API set so as modules can define a custom lock mode.

Author: Michael Paquier
Reviewed-by: Kuntal Ghosh
Discussion: https://postgr.es/m/20190920013831.GD1844@paquier.xyz
parent 736b84ee
...@@ -60,7 +60,8 @@ _PG_init(void) ...@@ -60,7 +60,8 @@ _PG_init(void)
/* Option for length of signature */ /* Option for length of signature */
add_int_reloption(bl_relopt_kind, "length", add_int_reloption(bl_relopt_kind, "length",
"Length of signature in bits", "Length of signature in bits",
DEFAULT_BLOOM_LENGTH, 1, MAX_BLOOM_LENGTH); DEFAULT_BLOOM_LENGTH, 1, MAX_BLOOM_LENGTH,
AccessExclusiveLock);
bl_relopt_tab[0].optname = "length"; bl_relopt_tab[0].optname = "length";
bl_relopt_tab[0].opttype = RELOPT_TYPE_INT; bl_relopt_tab[0].opttype = RELOPT_TYPE_INT;
bl_relopt_tab[0].offset = offsetof(BloomOptions, bloomLength); bl_relopt_tab[0].offset = offsetof(BloomOptions, bloomLength);
...@@ -71,7 +72,8 @@ _PG_init(void) ...@@ -71,7 +72,8 @@ _PG_init(void)
snprintf(buf, sizeof(buf), "col%d", i + 1); snprintf(buf, sizeof(buf), "col%d", i + 1);
add_int_reloption(bl_relopt_kind, buf, add_int_reloption(bl_relopt_kind, buf,
"Number of bits generated for each index column", "Number of bits generated for each index column",
DEFAULT_BLOOM_BITS, 1, MAX_BLOOM_BITS); DEFAULT_BLOOM_BITS, 1, MAX_BLOOM_BITS,
AccessExclusiveLock);
bl_relopt_tab[i + 1].optname = MemoryContextStrdup(TopMemoryContext, bl_relopt_tab[i + 1].optname = MemoryContextStrdup(TopMemoryContext,
buf); buf);
bl_relopt_tab[i + 1].opttype = RELOPT_TYPE_INT; bl_relopt_tab[i + 1].opttype = RELOPT_TYPE_INT;
......
...@@ -621,7 +621,8 @@ add_reloption(relopt_gen *newoption) ...@@ -621,7 +621,8 @@ add_reloption(relopt_gen *newoption)
* (for types other than string) * (for types other than string)
*/ */
static relopt_gen * static relopt_gen *
allocate_reloption(bits32 kinds, int type, const char *name, const char *desc) allocate_reloption(bits32 kinds, int type, const char *name, const char *desc,
LOCKMODE lockmode)
{ {
MemoryContext oldcxt; MemoryContext oldcxt;
size_t size; size_t size;
...@@ -658,13 +659,7 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc) ...@@ -658,13 +659,7 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc)
newoption->kinds = kinds; newoption->kinds = kinds;
newoption->namelen = strlen(name); newoption->namelen = strlen(name);
newoption->type = type; newoption->type = type;
newoption->lockmode = lockmode;
/*
* Set the default lock mode for this option. There is no actual way
* for a module to enforce it when declaring a custom relation option,
* so just use the highest level, which is safe for all cases.
*/
newoption->lockmode = AccessExclusiveLock;
MemoryContextSwitchTo(oldcxt); MemoryContextSwitchTo(oldcxt);
...@@ -676,12 +671,13 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc) ...@@ -676,12 +671,13 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc)
* Add a new boolean reloption * Add a new boolean reloption
*/ */
void void
add_bool_reloption(bits32 kinds, const char *name, const char *desc, bool default_val) add_bool_reloption(bits32 kinds, const char *name, const char *desc,
bool default_val, LOCKMODE lockmode)
{ {
relopt_bool *newoption; relopt_bool *newoption;
newoption = (relopt_bool *) allocate_reloption(kinds, RELOPT_TYPE_BOOL, newoption = (relopt_bool *) allocate_reloption(kinds, RELOPT_TYPE_BOOL,
name, desc); name, desc, lockmode);
newoption->default_val = default_val; newoption->default_val = default_val;
add_reloption((relopt_gen *) newoption); add_reloption((relopt_gen *) newoption);
...@@ -693,12 +689,12 @@ add_bool_reloption(bits32 kinds, const char *name, const char *desc, bool defaul ...@@ -693,12 +689,12 @@ add_bool_reloption(bits32 kinds, const char *name, const char *desc, bool defaul
*/ */
void void
add_int_reloption(bits32 kinds, const char *name, const char *desc, int default_val, add_int_reloption(bits32 kinds, const char *name, const char *desc, int default_val,
int min_val, int max_val) int min_val, int max_val, LOCKMODE lockmode)
{ {
relopt_int *newoption; relopt_int *newoption;
newoption = (relopt_int *) allocate_reloption(kinds, RELOPT_TYPE_INT, newoption = (relopt_int *) allocate_reloption(kinds, RELOPT_TYPE_INT,
name, desc); name, desc, lockmode);
newoption->default_val = default_val; newoption->default_val = default_val;
newoption->min = min_val; newoption->min = min_val;
newoption->max = max_val; newoption->max = max_val;
...@@ -712,12 +708,12 @@ add_int_reloption(bits32 kinds, const char *name, const char *desc, int default_ ...@@ -712,12 +708,12 @@ add_int_reloption(bits32 kinds, const char *name, const char *desc, int default_
*/ */
void void
add_real_reloption(bits32 kinds, const char *name, const char *desc, double default_val, add_real_reloption(bits32 kinds, const char *name, const char *desc, double default_val,
double min_val, double max_val) double min_val, double max_val, LOCKMODE lockmode)
{ {
relopt_real *newoption; relopt_real *newoption;
newoption = (relopt_real *) allocate_reloption(kinds, RELOPT_TYPE_REAL, newoption = (relopt_real *) allocate_reloption(kinds, RELOPT_TYPE_REAL,
name, desc); name, desc, lockmode);
newoption->default_val = default_val; newoption->default_val = default_val;
newoption->min = min_val; newoption->min = min_val;
newoption->max = max_val; newoption->max = max_val;
...@@ -736,7 +732,7 @@ add_real_reloption(bits32 kinds, const char *name, const char *desc, double defa ...@@ -736,7 +732,7 @@ add_real_reloption(bits32 kinds, const char *name, const char *desc, double defa
*/ */
void void
add_string_reloption(bits32 kinds, const char *name, const char *desc, const char *default_val, add_string_reloption(bits32 kinds, const char *name, const char *desc, const char *default_val,
validate_string_relopt validator) validate_string_relopt validator, LOCKMODE lockmode)
{ {
relopt_string *newoption; relopt_string *newoption;
...@@ -745,7 +741,7 @@ add_string_reloption(bits32 kinds, const char *name, const char *desc, const cha ...@@ -745,7 +741,7 @@ add_string_reloption(bits32 kinds, const char *name, const char *desc, const cha
(validator) (default_val); (validator) (default_val);
newoption = (relopt_string *) allocate_reloption(kinds, RELOPT_TYPE_STRING, newoption = (relopt_string *) allocate_reloption(kinds, RELOPT_TYPE_STRING,
name, desc); name, desc, lockmode);
newoption->validate_cb = validator; newoption->validate_cb = validator;
if (default_val) if (default_val)
{ {
......
...@@ -247,13 +247,16 @@ typedef struct ...@@ -247,13 +247,16 @@ typedef struct
extern relopt_kind add_reloption_kind(void); extern relopt_kind add_reloption_kind(void);
extern void add_bool_reloption(bits32 kinds, const char *name, const char *desc, extern void add_bool_reloption(bits32 kinds, const char *name, const char *desc,
bool default_val); bool default_val, LOCKMODE lockmode);
extern void add_int_reloption(bits32 kinds, const char *name, const char *desc, extern void add_int_reloption(bits32 kinds, const char *name, const char *desc,
int default_val, int min_val, int max_val); int default_val, int min_val, int max_val,
LOCKMODE lockmode);
extern void add_real_reloption(bits32 kinds, const char *name, const char *desc, extern void add_real_reloption(bits32 kinds, const char *name, const char *desc,
double default_val, double min_val, double max_val); double default_val, double min_val, double max_val,
LOCKMODE lockmode);
extern void add_string_reloption(bits32 kinds, const char *name, const char *desc, extern void add_string_reloption(bits32 kinds, const char *name, const char *desc,
const char *default_val, validate_string_relopt validator); const char *default_val, validate_string_relopt validator,
LOCKMODE lockmode);
extern Datum transformRelOptions(Datum oldOptions, List *defList, extern Datum transformRelOptions(Datum oldOptions, List *defList,
const char *namspace, char *validnsps[], const char *namspace, char *validnsps[],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment