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: