mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-26 16:46:28 +00:00
Ensure shared memory functions handle NULL parameters correctly
This commit is contained in:
@@ -38,6 +38,12 @@ SELECT repmgr.am_bdr_failover_handler(-1);
|
|||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT repmgr.am_bdr_failover_handler(NULL);
|
||||||
|
am_bdr_failover_handler
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT repmgr.get_new_primary();
|
SELECT repmgr.get_new_primary();
|
||||||
get_new_primary
|
get_new_primary
|
||||||
-----------------
|
-----------------
|
||||||
@@ -56,18 +62,60 @@ SELECT repmgr.notify_follow_primary(-1);
|
|||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT repmgr.notify_follow_primary(NULL);
|
||||||
|
notify_follow_primary
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT repmgr.other_node_is_candidate(-1,-1);
|
SELECT repmgr.other_node_is_candidate(-1,-1);
|
||||||
other_node_is_candidate
|
other_node_is_candidate
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
(1 row)
|
(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);
|
SELECT repmgr.request_vote(-1,-1);
|
||||||
request_vote
|
request_vote
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
(1 row)
|
(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();
|
SELECT repmgr.reset_voting_status();
|
||||||
reset_voting_status
|
reset_voting_status
|
||||||
---------------------
|
---------------------
|
||||||
@@ -80,6 +128,12 @@ SELECT repmgr.set_local_node_id(-1);
|
|||||||
|
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT repmgr.set_local_node_id(NULL);
|
||||||
|
set_local_node_id
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
(1 row)
|
||||||
|
|
||||||
SELECT repmgr.set_voting_status_initiated();
|
SELECT repmgr.set_voting_status_initiated();
|
||||||
set_voting_status_initiated
|
set_voting_status_initiated
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|||||||
46
repmgr.c
46
repmgr.c
@@ -227,11 +227,16 @@ repmgr_shmem_startup(void)
|
|||||||
Datum
|
Datum
|
||||||
set_local_node_id(PG_FUNCTION_ARGS)
|
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)
|
if (!shared_state)
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
|
|
||||||
|
if (PG_ARGISNULL(0))
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
|
||||||
|
local_node_id = PG_GETARG_INT32(0);
|
||||||
|
|
||||||
LWLockAcquire(shared_state->lock, LW_EXCLUSIVE);
|
LWLockAcquire(shared_state->lock, LW_EXCLUSIVE);
|
||||||
|
|
||||||
/* only set local_node_id once, as it should never change */
|
/* only set local_node_id once, as it should never change */
|
||||||
@@ -301,14 +306,20 @@ request_vote(PG_FUNCTION_ARGS)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* node_id used for logging purposes */
|
/* node_id used for logging purposes */
|
||||||
int requesting_node_id = PG_GETARG_INT32(0);
|
int requesting_node_id = UNKNOWN_NODE_ID;
|
||||||
int current_electoral_term = PG_GETARG_INT32(1);
|
int current_electoral_term = UNKNOWN_NODE_ID;
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!shared_state)
|
if (!shared_state)
|
||||||
PG_RETURN_NULL();
|
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);
|
LWLockAcquire(shared_state->lock, LW_SHARED);
|
||||||
|
|
||||||
/* only do something if local_node_id is initialised */
|
/* only do something if local_node_id is initialised */
|
||||||
@@ -453,12 +464,19 @@ Datum
|
|||||||
other_node_is_candidate(PG_FUNCTION_ARGS)
|
other_node_is_candidate(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
#ifndef BDR_ONLY
|
#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)
|
if (!shared_state)
|
||||||
PG_RETURN_NULL();
|
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);
|
LWLockAcquire(shared_state->lock, LW_SHARED);
|
||||||
|
|
||||||
/* only do something if local_node_id is initialised */
|
/* only do something if local_node_id is initialised */
|
||||||
@@ -493,11 +511,16 @@ Datum
|
|||||||
notify_follow_primary(PG_FUNCTION_ARGS)
|
notify_follow_primary(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
#ifndef BDR_ONLY
|
#ifndef BDR_ONLY
|
||||||
int primary_node_id = PG_GETARG_INT32(0);
|
int primary_node_id = UNKNOWN_NODE_ID;
|
||||||
|
|
||||||
if (!shared_state)
|
if (!shared_state)
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
|
|
||||||
|
if (PG_ARGISNULL(0))
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
|
||||||
|
primary_node_id = PG_GETARG_INT32(0);
|
||||||
|
|
||||||
LWLockAcquire(shared_state->lock, LW_SHARED);
|
LWLockAcquire(shared_state->lock, LW_SHARED);
|
||||||
|
|
||||||
/* only do something if local_node_id is initialised */
|
/* only do something if local_node_id is initialised */
|
||||||
@@ -536,6 +559,10 @@ get_new_primary(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
LWLockRelease(shared_state->lock);
|
LWLockRelease(shared_state->lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (new_primary_node_id == UNKNOWN_NODE_ID)
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
|
||||||
PG_RETURN_INT32(new_primary_node_id);
|
PG_RETURN_INT32(new_primary_node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -569,12 +596,17 @@ reset_voting_status(PG_FUNCTION_ARGS)
|
|||||||
Datum
|
Datum
|
||||||
am_bdr_failover_handler(PG_FUNCTION_ARGS)
|
am_bdr_failover_handler(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
int node_id = PG_GETARG_INT32(0);
|
int node_id = UNKNOWN_NODE_ID;
|
||||||
bool am_handler = false;
|
bool am_handler = false;
|
||||||
|
|
||||||
if (!shared_state)
|
if (!shared_state)
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
|
|
||||||
|
if (PG_ARGISNULL(0))
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
|
||||||
|
node_id = PG_GETARG_INT32(0);
|
||||||
|
|
||||||
LWLockAcquire(shared_state->lock, LW_SHARED);
|
LWLockAcquire(shared_state->lock, LW_SHARED);
|
||||||
|
|
||||||
if (shared_state->bdr_failover_handler == UNKNOWN_NODE_ID)
|
if (shared_state->bdr_failover_handler == UNKNOWN_NODE_ID)
|
||||||
|
|||||||
@@ -18,13 +18,22 @@ SELECT * FROM repmgr.show_nodes;
|
|||||||
|
|
||||||
-- functions
|
-- functions
|
||||||
SELECT repmgr.am_bdr_failover_handler(-1);
|
SELECT repmgr.am_bdr_failover_handler(-1);
|
||||||
|
SELECT repmgr.am_bdr_failover_handler(NULL);
|
||||||
SELECT repmgr.get_new_primary();
|
SELECT repmgr.get_new_primary();
|
||||||
SELECT repmgr.get_voting_status();
|
SELECT repmgr.get_voting_status();
|
||||||
SELECT repmgr.notify_follow_primary(-1);
|
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,-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,-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.reset_voting_status();
|
||||||
SELECT repmgr.set_local_node_id(-1);
|
SELECT repmgr.set_local_node_id(-1);
|
||||||
|
SELECT repmgr.set_local_node_id(NULL);
|
||||||
SELECT repmgr.set_voting_status_initiated();
|
SELECT repmgr.set_voting_status_initiated();
|
||||||
SELECT repmgr.standby_get_last_updated();
|
SELECT repmgr.standby_get_last_updated();
|
||||||
SELECT repmgr.standby_set_last_updated();
|
SELECT repmgr.standby_set_last_updated();
|
||||||
|
|||||||
Reference in New Issue
Block a user