pgpool2.git / summary / log / commit / refs

commit    605eb38faaac06e7dd68d708aab70ba5d2b40990
Author:   Tatsuo Ishii <ishii@postgresql.org>
Date:     Wed Apr 18 01:03:37 2018 +0000

    Prevent pcp_recovery_node from recovering "unused" status node.
    
    This allowed to try to recover a node without configuration data,
    which leads to variety of problems. See discussion:
    https://www.pgpool.net/pipermail/pgpool-general/2018-March/006021.html
    for more details.
    
    Also I fixed pgpool_recovery function so that it quotes an empty
    string argument with double quotes. Without this, the argument is
    treated as if it does not exist, which was the source of the complain
    from the user.


src/pcp_con/recovery.c | 4 ++++ src/sql/pgpool-recovery/pgpool-recovery.c | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/pcp_con/recovery.c b/src/pcp_con/recovery.c index 95ffd3a5d..67098a3ca 100644 --- a/src/pcp_con/recovery.c +++ b/src/pcp_con/recovery.c @@ -71,6 +71,10 @@ void start_recovery(int recovery_node) ereport(ERROR, (errmsg("node recovery failed, node id: %d is not valid", recovery_node))); + if (*(my_backend_status[(recovery_node)]) == CON_UNUSED) + ereport(ERROR, + (errmsg("node recovery failed, node id: %d is unused", recovery_node))); + if (VALID_BACKEND(recovery_node)) ereport(ERROR, (errmsg("node recovery failed, node id: %d is alive", recovery_node))); diff --git a/src/sql/pgpool-recovery/pgpool-recovery.c b/src/sql/pgpool-recovery/pgpool-recovery.c index 4c6824d8e..532660930 100644 --- a/src/sql/pgpool-recovery/pgpool-recovery.c +++ b/src/sql/pgpool-recovery/pgpool-recovery.c @@ -4,7 +4,7 @@ * * pgpool-recovery: exec online recovery script from SELECT statement. * - * Copyright (c) 2003-2013 PgPool Global Development Group + * Copyright (c) 2003-2018 PgPool Global Development Group * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose and without fee is hereby @@ -84,7 +84,7 @@ pgpool_recovery(PG_FUNCTION_ARGS) char *remote_port = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(PG_GETARG_TEXT_P(3)))); int recovery_node = PG_GETARG_INT32(4); - snprintf(recovery_script, sizeof(recovery_script), "%s/%s %s %s %s %s %d", + snprintf(recovery_script, sizeof(recovery_script), "\\"%s/%s\\" \\"%s\\" \\"%s\\" \\"%s\\" \\"%s\\" %d", DataDir, script, DataDir, remote_host, remote_data_directory, remote_port, recovery_node); } @@ -92,13 +92,13 @@ pgpool_recovery(PG_FUNCTION_ARGS) { char *remote_port = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(PG_GETARG_TEXT_P(3)))); - snprintf(recovery_script, sizeof(recovery_script), "%s/%s %s %s %s %s", + snprintf(recovery_script, sizeof(recovery_script), "\\"%s/%s\\" \\"%s\\" \\"%s\\" \\"%s\\" \\"%s\\"", DataDir, script, DataDir, remote_host, remote_data_directory, remote_port); } else { - snprintf(recovery_script, sizeof(recovery_script), "%s/%s %s %s %s", + snprintf(recovery_script, sizeof(recovery_script), "\\"%s/%s\\" \\"%s\\" \\"%s\"" \\"%s\\"", DataDir, script, DataDir, remote_host, remote_data_directory); } [parent: 723072d51be2]