mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-23 07:06:30 +00:00
Because PQcancel() establish a new synchronous connection to the database, if it fails it means something wrong has happenned with master. So instead of just ignore the failure, CancelQuery() now reports a failure condition so we can detect master's death in that situation. This is very important specially when only postmaster crashes but other children/backend connections are still there. Because the children connection won't fail and CancelQuery() failure is our only indication of something wrong happenning. Currently we just ignore the PQcancel() failure which leads us to a situation in which we just loop forever trying to cancel the async query. Reported by: Martin Euser <martin.euser@nl.abnamro.com> Problem analyzed and bug spotted by: Andres Freund <andres@2ndquadrant.com> Patch by: Jaime Casanova <jaime@2ndquadrant.com>
42 lines
1.6 KiB
C
42 lines
1.6 KiB
C
/*
|
|
* dbutils.h
|
|
* Copyright (c) 2ndQuadrant, 2010-2012
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#ifndef _REPMGR_DBUTILS_H_
|
|
#define _REPMGR_DBUTILS_H_
|
|
|
|
#include "strutil.h"
|
|
|
|
PGconn *establishDBConnection(const char *conninfo, const bool exit_on_error);
|
|
PGconn *establishDBConnectionByParams(const char *keywords[],
|
|
const char *values[],
|
|
const bool exit_on_error);
|
|
bool is_standby(PGconn *conn);
|
|
bool is_witness(PGconn *conn, char *schema, char *cluster, int node_id);
|
|
bool is_pgup(PGconn *conn, int timeout);
|
|
char *pg_version(PGconn *conn, char* major_version);
|
|
bool guc_setted(PGconn *conn, const char *parameter, const char *op,
|
|
const char *value);
|
|
const char *get_cluster_size(PGconn *conn);
|
|
PGconn *getMasterConnection(PGconn *standby_conn, char *schema, char *cluster,
|
|
int *master_id, char *master_conninfo_out);
|
|
|
|
int wait_connection_availability(PGconn *conn, int timeout);
|
|
bool CancelQuery(PGconn *conn, int timeout);
|
|
#endif
|