From 688337dec3b3f9a8d2c362c8bf3327dd87582891 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Tue, 25 Sep 2018 15:54:22 +0900 Subject: [PATCH] repmgr: add "--node-id" option to "cluster cleanup" Implements GitHub #493. --- HISTORY | 1 + dbutils.c | 21 ++++++++++++++++---- dbutils.h | 4 ++-- doc/appendix-release-notes.sgml | 18 +++++++++++++++++ doc/repmgr-cluster-cleanup.sgml | 14 ++++++++++++++ repmgr-action-cluster.c | 34 ++++++++++++++++++++------------- repmgr-client.c | 1 + 7 files changed, 74 insertions(+), 19 deletions(-) diff --git a/HISTORY b/HISTORY index 0c1fa8a4..cfd7c738 100644 --- a/HISTORY +++ b/HISTORY @@ -1,6 +1,7 @@ 4.2.0 2018-??-?? repmgr: add parameter "shutdown_check_timeout" for use by "standby switchover"; GitHub #504 (Ian) + repmgr: add "--node-id" option to "repmgr cluster cleanup"; GitHub #493 (Ian) 4.1.1 2018-09-05 logging: explicitly log the text of failed queries as ERRORs to diff --git a/dbutils.c b/dbutils.c index fbe12281..bc9ba3d2 100644 --- a/dbutils.c +++ b/dbutils.c @@ -4167,7 +4167,7 @@ add_monitoring_record(PGconn *primary_conn, int -get_number_of_monitoring_records_to_delete(PGconn *primary_conn, int keep_history) +get_number_of_monitoring_records_to_delete(PGconn *primary_conn, int keep_history, int node_id) { PQExpBufferData query; int record_count = -1; @@ -4181,8 +4181,15 @@ get_number_of_monitoring_records_to_delete(PGconn *primary_conn, int keep_histor " WHERE pg_catalog.age(pg_catalog.now(), last_monitor_time) >= '%d days'::interval", keep_history); - res = PQexec(primary_conn, query.data); + if (node_id != UNKNOWN_NODE_ID) + { + appendPQExpBuffer(&query, + " AND standby_node_id = %i", node_id); + } + log_verbose(LOG_DEBUG, "get_number_of_monitoring_records_to_delete():\n %s", query.data); + + res = PQexec(primary_conn, query.data); if (PQresultStatus(res) != PGRES_TUPLES_OK) { @@ -4202,7 +4209,7 @@ get_number_of_monitoring_records_to_delete(PGconn *primary_conn, int keep_histor bool -delete_monitoring_records(PGconn *primary_conn, int keep_history) +delete_monitoring_records(PGconn *primary_conn, int keep_history, int node_id) { PQExpBufferData query; bool success = true; @@ -4210,12 +4217,18 @@ delete_monitoring_records(PGconn *primary_conn, int keep_history) initPQExpBuffer(&query); - if (keep_history > 0) + if (keep_history > 0 || node_id != UNKNOWN_NODE_ID) { appendPQExpBuffer(&query, "DELETE FROM repmgr.monitoring_history " " WHERE pg_catalog.age(pg_catalog.now(), last_monitor_time) >= '%d days'::INTERVAL ", keep_history); + + if (node_id != UNKNOWN_NODE_ID) + { + appendPQExpBuffer(&query, + " AND standby_node_id = %i", node_id); + } } else { diff --git a/dbutils.h b/dbutils.h index 8a56b963..da25d677 100644 --- a/dbutils.h +++ b/dbutils.h @@ -491,8 +491,8 @@ add_monitoring_record(PGconn *primary_conn, long long unsigned int apply_lag_bytes ); -int get_number_of_monitoring_records_to_delete(PGconn *primary_conn, int keep_history); -bool delete_monitoring_records(PGconn *primary_conn, int keep_history); +int get_number_of_monitoring_records_to_delete(PGconn *primary_conn, int keep_history, int node_id); +bool delete_monitoring_records(PGconn *primary_conn, int keep_history, int node_id); diff --git a/doc/appendix-release-notes.sgml b/doc/appendix-release-notes.sgml index 2875090b..a0bf21fe 100644 --- a/doc/appendix-release-notes.sgml +++ b/doc/appendix-release-notes.sgml @@ -20,6 +20,7 @@ ???, 2018 + Configuration file changes @@ -39,6 +40,23 @@ + + + repmgr enhancements + + + + + + repmgr cluster cleanup + now accepts the option to delete records for only one + node. (GitHub #493). + + + + + + diff --git a/doc/repmgr-cluster-cleanup.sgml b/doc/repmgr-cluster-cleanup.sgml index 441470b9..756ed6d3 100644 --- a/doc/repmgr-cluster-cleanup.sgml +++ b/doc/repmgr-cluster-cleanup.sgml @@ -51,6 +51,20 @@ + + Options + + + + + + + Only delete monitoring records for the specified node. + + + + + See also diff --git a/repmgr-action-cluster.c b/repmgr-action-cluster.c index 3a4aed8f..54a771d1 100644 --- a/repmgr-action-cluster.c +++ b/repmgr-action-cluster.c @@ -1372,7 +1372,9 @@ do_cluster_cleanup(void) log_debug(_("number of days of monitoring history to retain: %i"), runtime_options.keep_history); - entries_to_delete = get_number_of_monitoring_records_to_delete(primary_conn, runtime_options.keep_history); + entries_to_delete = get_number_of_monitoring_records_to_delete(primary_conn, + runtime_options.keep_history, + runtime_options.node_id); if (entries_to_delete < 0) { @@ -1392,7 +1394,7 @@ do_cluster_cleanup(void) initPQExpBuffer(&event_details); - if (delete_monitoring_records(primary_conn, runtime_options.keep_history) == false) + if (delete_monitoring_records(primary_conn, runtime_options.keep_history, runtime_options.node_id) == false) { appendPQExpBuffer(&event_details, _("unable to delete monitoring records")); @@ -1418,8 +1420,21 @@ do_cluster_cleanup(void) log_detail("%s", PQerrorMessage(primary_conn)); } - appendPQExpBuffer(&event_details, - _("monitoring records deleted")); + if (runtime_options.keep_history == 0) + { + appendPQExpBuffer(&event_details, + _("all monitoring records deleted")); + } + else + { + appendPQExpBuffer(&event_details, + _("monitoring records deleted")); + } + + if (runtime_options.node_id != UNKNOWN_NODE_ID) + appendPQExpBuffer(&event_details, + _(" for node %i"), + runtime_options.node_id); if (runtime_options.keep_history > 0) appendPQExpBuffer(&event_details, @@ -1433,18 +1448,11 @@ do_cluster_cleanup(void) true, event_details.data); + log_notice("%s", event_details.data); + termPQExpBuffer(&event_details); PQfinish(primary_conn); - if (runtime_options.keep_history > 0) - { - log_notice(_("monitoring records older than %i day(s) deleted"), - runtime_options.keep_history); - } - else - { - log_info(_("all monitoring records deleted")); - } return; } diff --git a/repmgr-client.c b/repmgr-client.c index 1453ab30..daed411a 100644 --- a/repmgr-client.c +++ b/repmgr-client.c @@ -1520,6 +1520,7 @@ check_cli_parameters(const int action) case PRIMARY_UNREGISTER: case STANDBY_UNREGISTER: case WITNESS_UNREGISTER: + case CLUSTER_CLEANUP: case CLUSTER_EVENT: case CLUSTER_MATRIX: case CLUSTER_CROSSCHECK: