Ensure shared memory functions handle NULL parameters correctly

This commit is contained in:
Ian Barwick
2017-11-08 12:19:07 +09:00
parent fe98270b3f
commit 7232187f4d
3 changed files with 102 additions and 7 deletions

View File

@@ -38,6 +38,12 @@ SELECT repmgr.am_bdr_failover_handler(-1);
(1 row)
SELECT repmgr.am_bdr_failover_handler(NULL);
am_bdr_failover_handler
-------------------------
(1 row)
SELECT repmgr.get_new_primary();
get_new_primary
-----------------
@@ -56,18 +62,60 @@ SELECT repmgr.notify_follow_primary(-1);
(1 row)
SELECT repmgr.notify_follow_primary(NULL);
notify_follow_primary
-----------------------
(1 row)
SELECT repmgr.other_node_is_candidate(-1,-1);
other_node_is_candidate
-------------------------
(1 row)
SELECT repmgr.other_node_is_candidate(-1,NULL);
other_node_is_candidate
-------------------------
(1 row)
SELECT repmgr.other_node_is_candidate(NULL,-1);
other_node_is_candidate
-------------------------
(1 row)
SELECT repmgr.other_node_is_candidate(NULL,NULL);
other_node_is_candidate
-------------------------
(1 row)
SELECT repmgr.request_vote(-1,-1);
request_vote
--------------
(1 row)
SELECT repmgr.request_vote(-1,NULL);
request_vote
--------------
(1 row)
SELECT repmgr.request_vote(NULL,-1);
request_vote
--------------
(1 row)
SELECT repmgr.request_vote(NULL,NULL);
request_vote
--------------
(1 row)
SELECT repmgr.reset_voting_status();
reset_voting_status
---------------------
@@ -80,6 +128,12 @@ SELECT repmgr.set_local_node_id(-1);
(1 row)
SELECT repmgr.set_local_node_id(NULL);
set_local_node_id
-------------------
(1 row)
SELECT repmgr.set_voting_status_initiated();
set_voting_status_initiated
-----------------------------

View File

@@ -227,11 +227,16 @@ repmgr_shmem_startup(void)
Datum
set_local_node_id(PG_FUNCTION_ARGS)
{
int local_node_id = PG_GETARG_INT32(0);
int local_node_id = UNKNOWN_NODE_ID;
if (!shared_state)
PG_RETURN_NULL();
if (PG_ARGISNULL(0))
PG_RETURN_NULL();
local_node_id = PG_GETARG_INT32(0);
LWLockAcquire(shared_state->lock, LW_EXCLUSIVE);
/* only set local_node_id once, as it should never change */
@@ -301,14 +306,20 @@ request_vote(PG_FUNCTION_ARGS)
#endif
/* node_id used for logging purposes */
int requesting_node_id = PG_GETARG_INT32(0);
int current_electoral_term = PG_GETARG_INT32(1);
int requesting_node_id = UNKNOWN_NODE_ID;
int current_electoral_term = UNKNOWN_NODE_ID;
int ret;
if (!shared_state)
PG_RETURN_NULL();
if (PG_ARGISNULL(0) || PG_ARGISNULL(1))
PG_RETURN_NULL();
requesting_node_id = PG_GETARG_INT32(0);
current_electoral_term = PG_GETARG_INT32(1);
LWLockAcquire(shared_state->lock, LW_SHARED);
/* only do something if local_node_id is initialised */
@@ -453,12 +464,19 @@ Datum
other_node_is_candidate(PG_FUNCTION_ARGS)
{
#ifndef BDR_ONLY
int requesting_node_id = PG_GETARG_INT32(0);
int electoral_term = PG_GETARG_INT32(1);
int requesting_node_id = UNKNOWN_NODE_ID;
int electoral_term = UNKNOWN_NODE_ID;
if (!shared_state)
PG_RETURN_NULL();
if (PG_ARGISNULL(0) || PG_ARGISNULL(1))
PG_RETURN_NULL();
requesting_node_id = PG_GETARG_INT32(0);
electoral_term = PG_GETARG_INT32(1);
LWLockAcquire(shared_state->lock, LW_SHARED);
/* only do something if local_node_id is initialised */
@@ -493,11 +511,16 @@ Datum
notify_follow_primary(PG_FUNCTION_ARGS)
{
#ifndef BDR_ONLY
int primary_node_id = PG_GETARG_INT32(0);
int primary_node_id = UNKNOWN_NODE_ID;
if (!shared_state)
PG_RETURN_NULL();
if (PG_ARGISNULL(0))
PG_RETURN_NULL();
primary_node_id = PG_GETARG_INT32(0);
LWLockAcquire(shared_state->lock, LW_SHARED);
/* only do something if local_node_id is initialised */
@@ -536,6 +559,10 @@ get_new_primary(PG_FUNCTION_ARGS)
LWLockRelease(shared_state->lock);
#endif
if (new_primary_node_id == UNKNOWN_NODE_ID)
PG_RETURN_NULL();
PG_RETURN_INT32(new_primary_node_id);
}
@@ -569,12 +596,17 @@ reset_voting_status(PG_FUNCTION_ARGS)
Datum
am_bdr_failover_handler(PG_FUNCTION_ARGS)
{
int node_id = PG_GETARG_INT32(0);
int node_id = UNKNOWN_NODE_ID;
bool am_handler = false;
if (!shared_state)
PG_RETURN_NULL();
if (PG_ARGISNULL(0))
PG_RETURN_NULL();
node_id = PG_GETARG_INT32(0);
LWLockAcquire(shared_state->lock, LW_SHARED);
if (shared_state->bdr_failover_handler == UNKNOWN_NODE_ID)

View File

@@ -18,13 +18,22 @@ SELECT * FROM repmgr.show_nodes;
-- functions
SELECT repmgr.am_bdr_failover_handler(-1);
SELECT repmgr.am_bdr_failover_handler(NULL);
SELECT repmgr.get_new_primary();
SELECT repmgr.get_voting_status();
SELECT repmgr.notify_follow_primary(-1);
SELECT repmgr.notify_follow_primary(NULL);
SELECT repmgr.other_node_is_candidate(-1,-1);
SELECT repmgr.other_node_is_candidate(-1,NULL);
SELECT repmgr.other_node_is_candidate(NULL,-1);
SELECT repmgr.other_node_is_candidate(NULL,NULL);
SELECT repmgr.request_vote(-1,-1);
SELECT repmgr.request_vote(-1,NULL);
SELECT repmgr.request_vote(NULL,-1);
SELECT repmgr.request_vote(NULL,NULL);
SELECT repmgr.reset_voting_status();
SELECT repmgr.set_local_node_id(-1);
SELECT repmgr.set_local_node_id(NULL);
SELECT repmgr.set_voting_status_initiated();
SELECT repmgr.standby_get_last_updated();
SELECT repmgr.standby_set_last_updated();