Allow definition of lock mode for custom reloptions
authorMichael Paquier <michael@paquier.xyz>
Wed, 25 Sep 2019 01:13:52 +0000 (10:13 +0900)
committerMichael Paquier <michael@paquier.xyz>
Wed, 25 Sep 2019 01:13:52 +0000 (10:13 +0900)
Relation options can define a lock mode other than AccessExclusiveMode
since 47167b7, 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

contrib/bloom/blutils.c
src/backend/access/common/reloptions.c
src/include/access/reloptions.h

index cc1670934fbfbd0620136845d405cdf49b6eeb5c..dbb24cb5b249b48f41db32ccf1e467e00e6f77c4 100644 (file)
@@ -60,7 +60,8 @@ _PG_init(void)
    /* Option for length of signature */
    add_int_reloption(bl_relopt_kind, "length",
                      "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].opttype = RELOPT_TYPE_INT;
    bl_relopt_tab[0].offset = offsetof(BloomOptions, bloomLength);
@@ -71,7 +72,8 @@ _PG_init(void)
        snprintf(buf, sizeof(buf), "col%d", i + 1);
        add_int_reloption(bl_relopt_kind, buf,
                          "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,
                                                           buf);
        bl_relopt_tab[i + 1].opttype = RELOPT_TYPE_INT;
index b59e6067713d1f266ce7665508ead00397cae7ca..3b8517efeaa8f6627e783f79116cbce55344c4cd 100644 (file)
@@ -621,7 +621,8 @@ add_reloption(relopt_gen *newoption)
  *     (for types other than string)
  */
 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;
    size_t      size;
@@ -658,13 +659,7 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc)
    newoption->kinds = kinds;
    newoption->namelen = strlen(name);
    newoption->type = type;
-
-   /*
-    * 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;
+   newoption->lockmode = lockmode;
 
    MemoryContextSwitchTo(oldcxt);
 
@@ -676,12 +671,13 @@ allocate_reloption(bits32 kinds, int type, const char *name, const char *desc)
  *     Add a new boolean reloption
  */
 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;
 
    newoption = (relopt_bool *) allocate_reloption(kinds, RELOPT_TYPE_BOOL,
-                                                  name, desc);
+                                                  name, desc, lockmode);
    newoption->default_val = default_val;
 
    add_reloption((relopt_gen *) newoption);
@@ -693,12 +689,12 @@ add_bool_reloption(bits32 kinds, const char *name, const char *desc, bool defaul
  */
 void
 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;
 
    newoption = (relopt_int *) allocate_reloption(kinds, RELOPT_TYPE_INT,
-                                                 name, desc);
+                                                 name, desc, lockmode);
    newoption->default_val = default_val;
    newoption->min = min_val;
    newoption->max = max_val;
@@ -712,12 +708,12 @@ add_int_reloption(bits32 kinds, const char *name, const char *desc, int default_
  */
 void
 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;
 
    newoption = (relopt_real *) allocate_reloption(kinds, RELOPT_TYPE_REAL,
-                                                  name, desc);
+                                                  name, desc, lockmode);
    newoption->default_val = default_val;
    newoption->min = min_val;
    newoption->max = max_val;
@@ -736,7 +732,7 @@ add_real_reloption(bits32 kinds, const char *name, const char *desc, double defa
  */
 void
 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;
 
@@ -745,7 +741,7 @@ add_string_reloption(bits32 kinds, const char *name, const char *desc, const cha
        (validator) (default_val);
 
    newoption = (relopt_string *) allocate_reloption(kinds, RELOPT_TYPE_STRING,
-                                                    name, desc);
+                                                    name, desc, lockmode);
    newoption->validate_cb = validator;
    if (default_val)
    {
index 6d392e4d5a4a74d25f43b59e81f14301450ca885..4b82c6370aa25a524aa5a47a5512eb6ba153d017 100644 (file)
@@ -247,13 +247,16 @@ typedef struct
 
 extern relopt_kind add_reloption_kind(void);
 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,
-                             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,
-                              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,
-                                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,
                                 const char *namspace, char *validnsps[],