Skip to content

Commit 7b8c7cb

Browse files
committed
[pgmoneta#666] Add cascade option for retain/expunge
1 parent a1b1739 commit 7b8c7cb

5 files changed

Lines changed: 85 additions & 23 deletions

File tree

src/cli.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ static int details(SSL* ssl, int socket, uint8_t compression, uint8_t encryption
125125
static int ping(SSL* ssl, int socket, uint8_t compression, uint8_t encryption, int32_t output_format);
126126
static int reset(SSL* ssl, int socket, uint8_t compression, uint8_t encryption, int32_t output_format);
127127
static int reload(SSL* ssl, int socket, uint8_t compression, uint8_t encryption, int32_t output_format);
128-
static int retain(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, int32_t output_format);
129-
static int expunge(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, int32_t output_format);
128+
static int retain(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, bool cascade, int32_t output_format);
129+
static int expunge(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, bool cascade, int32_t output_format);
130130
static int decrypt_data_client(char* from);
131131
static int encrypt_data_client(char* from);
132132
static int decompress_data_client(char* from);
@@ -199,6 +199,7 @@ usage(void)
199199
printf(" -C, --compress none|gz|zstd|lz4|bz2 Compress the wire protocol\n");
200200
printf(" -E, --encrypt none|aes|aes256|aes192|aes128 Encrypt the wire protocol\n");
201201
printf(" -s, --sort asc|desc Sort result (for list-backup)\n");
202+
printf(" --cascade Cascadingly retain/expunge backups until the root base backup\n");
202203
printf(" -?, --help Display help\n");
203204
printf("\n");
204205
printf("Commands:\n");
@@ -459,6 +460,7 @@ main(int argc, char** argv)
459460
int optind = 0;
460461
int num_options = 0;
461462
int num_results = 0;
463+
bool cascade = false;
462464
char* sort_option = NULL;
463465

464466
cli_option options[] = {
@@ -474,6 +476,7 @@ main(int argc, char** argv)
474476
{"C", "compress", true},
475477
{"E", "encrypt", true},
476478
{"s", "sort", true},
479+
{"", "cascade", false},
477480
{"?", "help", false}
478481
};
479482

@@ -621,6 +624,10 @@ main(int argc, char** argv)
621624
exit(1);
622625
}
623626
}
627+
else if (!strcmp(optname, "cascade"))
628+
{
629+
cascade = true;
630+
}
624631
else if (!strcmp(optname, "?") || !strcmp(optname, "help"))
625632
{
626633
usage();
@@ -912,11 +919,11 @@ main(int argc, char** argv)
912919
}
913920
else if (parsed.cmd->action == MANAGEMENT_RETAIN)
914921
{
915-
exit_code = retain(s_ssl, socket, parsed.args[0], parsed.args[1], compression, encryption, output_format);
922+
exit_code = retain(s_ssl, socket, parsed.args[0], parsed.args[1], compression, encryption, cascade, output_format);
916923
}
917924
else if (parsed.cmd->action == MANAGEMENT_EXPUNGE)
918925
{
919-
exit_code = expunge(s_ssl, socket, parsed.args[0], parsed.args[1], compression, encryption, output_format);
926+
exit_code = expunge(s_ssl, socket, parsed.args[0], parsed.args[1], compression, encryption, cascade, output_format);
920927
}
921928
else if (parsed.cmd->action == MANAGEMENT_DECRYPT)
922929
{
@@ -1080,14 +1087,14 @@ static void
10801087
help_retain(void)
10811088
{
10821089
printf("Retain a backup for a server\n");
1083-
printf(" pgmoneta-cli retain <server> <timestamp|oldest|newest>\n");
1090+
printf(" pgmoneta-cli [--cascade] retain <server> <timestamp|oldest|newest>\n");
10841091
}
10851092

10861093
static void
10871094
help_expunge(void)
10881095
{
10891096
printf("Expunge a backup for a server\n");
1090-
printf(" pgmoneta-cli expunge <server> <timestamp|oldest|newest>\n");
1097+
printf(" pgmoneta-cli [--cascade] expunge <server> <timestamp|oldest|newest>\n");
10911098
}
10921099

10931100
static void
@@ -1507,9 +1514,9 @@ reload(SSL* ssl, int socket, uint8_t compression, uint8_t encryption, int32_t ou
15071514
}
15081515

15091516
static int
1510-
retain(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, int32_t output_format)
1517+
retain(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, bool cascade, int32_t output_format)
15111518
{
1512-
if (pgmoneta_management_request_retain(ssl, socket, server, backup_id, compression, encryption, output_format))
1519+
if (pgmoneta_management_request_retain(ssl, socket, server, backup_id, compression, encryption, cascade, output_format))
15131520
{
15141521
goto error;
15151522
}
@@ -1527,9 +1534,9 @@ retain(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression,
15271534
}
15281535

15291536
static int
1530-
expunge(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, int32_t output_format)
1537+
expunge(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, bool cascade, int32_t output_format)
15311538
{
1532-
if (pgmoneta_management_request_expunge(ssl, socket, server, backup_id, compression, encryption, output_format))
1539+
if (pgmoneta_management_request_expunge(ssl, socket, server, backup_id, compression, encryption, cascade, output_format))
15331540
{
15341541
goto error;
15351542
}

src/include/management.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ extern "C" {
178178
#define MANAGEMENT_ARGUMENT_WORKERS "Workers"
179179
#define MANAGEMENT_ARGUMENT_WORKFLOW "Workflow"
180180
#define MANAGEMENT_ARGUMENT_WORKSPACE_FREE_SPACE "WorkspaceFreeSpace"
181+
#define MANAGEMENT_ARGUMENT_CASCADE "Cascade"
181182

182183
/**
183184
* Management error
@@ -620,11 +621,12 @@ pgmoneta_management_request_conf_set(SSL* ssl, int socket, char* config_key, cha
620621
* @param backup_id The backup
621622
* @param compression The compress method for wire protocol
622623
* @param encryption The encrypt method for wire protocol
624+
* @param cascade Whether to retain cascadingly
623625
* @param output_format The output format
624626
* @return 0 upon success, otherwise 1
625627
*/
626628
int
627-
pgmoneta_management_request_retain(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, int32_t output_format);
629+
pgmoneta_management_request_retain(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, bool cascade, int32_t output_format);
628630

629631
/**
630632
* Create an expunge request
@@ -634,11 +636,12 @@ pgmoneta_management_request_retain(SSL* ssl, int socket, char* server, char* bac
634636
* @param backup_id The backup
635637
* @param compression The compress method for wire protocol
636638
* @param encryption The encrypt method for wire protocol
639+
* @param cascade Whether to expunge cascadingly
637640
* @param output_format The output format
638641
* @return 0 upon success, otherwise 1
639642
*/
640643
int
641-
pgmoneta_management_request_expunge(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, int32_t output_format);
644+
pgmoneta_management_request_expunge(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, bool cascade, int32_t output_format);
642645

643646
/**
644647
* Create a decrypt request

src/libpgmoneta/keep.c

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@
3838
/* system */
3939
#include <stdatomic.h>
4040
#include <stdlib.h>
41+
#include <string.h>
4142

4243
#define NAME "keep"
4344

4445
static void keep(char* prefix, SSL* ssl, int client_fd, int srv, bool k, uint8_t compression, uint8_t encryption, struct json* payload);
46+
static void keep_backup(int srv, char* label, bool k);
4547

4648
void
4749
pgmoneta_retain_backup(SSL* ssl, int client_fd, int server, uint8_t compression, uint8_t encryption, struct json* payload)
@@ -69,7 +71,10 @@ keep(char* prefix, SSL* ssl, int client_fd, int srv, bool k, uint8_t compression
6971
int backup_index = -1;
7072
int number_of_backups = 0;
7173
bool kr = false;
74+
bool cascade = false;
7275
struct backup** backups = NULL;
76+
struct backup* bck = NULL;
77+
struct json* bcks = NULL;
7378
struct json* req = NULL;
7479
struct json* response = NULL;
7580
struct main_configuration* config;
@@ -99,6 +104,7 @@ keep(char* prefix, SSL* ssl, int client_fd, int srv, bool k, uint8_t compression
99104

100105
req = (struct json*)pgmoneta_json_get(payload, MANAGEMENT_CATEGORY_REQUEST);
101106
backup_id = (char*)pgmoneta_json_get(req, MANAGEMENT_ARGUMENT_BACKUP);
107+
cascade = (bool)pgmoneta_json_get(req, MANAGEMENT_ARGUMENT_CASCADE);
102108

103109
if (!strcmp(backup_id, "oldest"))
104110
{
@@ -149,23 +155,51 @@ keep(char* prefix, SSL* ssl, int client_fd, int srv, bool k, uint8_t compression
149155
goto error;
150156
}
151157

152-
if (pgmoneta_is_backup_struct_valid(srv, backups[backup_index]) && backups[backup_index]->type == TYPE_FULL)
158+
if (backups[backup_index]->valid == VALID_TRUE)
153159
{
154-
d = pgmoneta_get_server_backup_identifier(srv, backups[backup_index]->label);
160+
keep_backup(srv, backups[backup_index]->label, k);
161+
kr = k;
162+
}
163+
164+
if (cascade)
165+
{
166+
struct backup* temp_bck = NULL;
167+
pgmoneta_json_create(&bcks);
168+
pgmoneta_json_append(bcks, (uintptr_t)backups[backup_index]->label, ValueString);
155169

156-
pgmoneta_update_info_bool(d, INFO_KEEP, k);
157-
pgmoneta_update_sha512(d, "backup.info");
170+
if (backups[backup_index]->type != TYPE_FULL)
171+
{
172+
bck = (struct backup*) malloc(sizeof(struct backup));
173+
memcpy(bck, backups[backup_index], sizeof(struct backup));
158174

159-
kr = k;
175+
while (!pgmoneta_get_backup_parent(srv, bck, &temp_bck))
176+
{
177+
free(bck);
178+
bck = temp_bck;
179+
temp_bck = NULL;
180+
181+
keep_backup(srv, bck->label, k);
182+
pgmoneta_json_append(bcks, (uintptr_t)bck->label, ValueString);
183+
}
160184

161-
free(d);
162-
d = NULL;
185+
free(bck);
186+
bck = NULL;
187+
}
188+
}
189+
190+
if (!cascade)
191+
{
192+
pgmoneta_json_put(response, MANAGEMENT_ARGUMENT_BACKUP, (uintptr_t)backups[backup_index]->label, ValueString);
193+
}
194+
else
195+
{
196+
pgmoneta_json_put(response, MANAGEMENT_ARGUMENT_BACKUPS, (uintptr_t)bcks, ValueJSON);
163197
}
164198

165-
pgmoneta_json_put(response, MANAGEMENT_ARGUMENT_BACKUP, (uintptr_t)backups[backup_index]->label, ValueString);
166199
pgmoneta_json_put(response, MANAGEMENT_ARGUMENT_VALID, (uintptr_t)backups[backup_index]->valid, ValueInt8);
167200
pgmoneta_json_put(response, MANAGEMENT_ARGUMENT_COMMENTS, (uintptr_t)backups[backup_index]->comments, ValueString);
168201
pgmoneta_json_put(response, MANAGEMENT_ARGUMENT_KEEP, (uintptr_t)kr, ValueBool);
202+
pgmoneta_json_put(response, MANAGEMENT_ARGUMENT_CASCADE, (uintptr_t)cascade, ValueBool);
169203

170204
#ifdef HAVE_FREEBSD
171205
clock_gettime(CLOCK_MONOTONIC_FAST, &end_t);
@@ -198,6 +232,8 @@ keep(char* prefix, SSL* ssl, int client_fd, int srv, bool k, uint8_t compression
198232
free(backups[i]);
199233
}
200234
free(backups);
235+
free(bck);
236+
pgmoneta_json_destroy(bcks);
201237

202238
free(d);
203239
free(elapsed);
@@ -224,9 +260,23 @@ keep(char* prefix, SSL* ssl, int client_fd, int srv, bool k, uint8_t compression
224260
free(backups[i]);
225261
}
226262
free(backups);
263+
free(bck);
264+
pgmoneta_json_destroy(bcks);
227265

228266
free(d);
229267
free(elapsed);
230268

231269
exit(1);
232270
}
271+
272+
static void
273+
keep_backup(int srv, char* label, bool k)
274+
{
275+
char* d = NULL;
276+
d = pgmoneta_get_server_backup_identifier(srv, label);
277+
278+
pgmoneta_update_info_bool(d, INFO_KEEP, k);
279+
pgmoneta_update_sha512(d, "backup.info");
280+
281+
free(d);
282+
}

src/libpgmoneta/management.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,7 @@ pgmoneta_management_request_conf_set(SSL* ssl, int socket, char* config_key, cha
561561
}
562562

563563
int
564-
pgmoneta_management_request_retain(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, int32_t output_format)
564+
pgmoneta_management_request_retain(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, bool cascade, int32_t output_format)
565565
{
566566
struct json* j = NULL;
567567
struct json* request = NULL;
@@ -578,6 +578,7 @@ pgmoneta_management_request_retain(SSL* ssl, int socket, char* server, char* bac
578578

579579
pgmoneta_json_put(request, MANAGEMENT_ARGUMENT_SERVER, (uintptr_t)server, ValueString);
580580
pgmoneta_json_put(request, MANAGEMENT_ARGUMENT_BACKUP, (uintptr_t)backup_id, ValueString);
581+
pgmoneta_json_put(request, MANAGEMENT_ARGUMENT_CASCADE, (uintptr_t)cascade, ValueBool);
581582

582583
if (pgmoneta_management_write_json(ssl, socket, compression, encryption, j))
583584
{
@@ -596,7 +597,7 @@ pgmoneta_management_request_retain(SSL* ssl, int socket, char* server, char* bac
596597
}
597598

598599
int
599-
pgmoneta_management_request_expunge(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, int32_t output_format)
600+
pgmoneta_management_request_expunge(SSL* ssl, int socket, char* server, char* backup_id, uint8_t compression, uint8_t encryption, bool cascade, int32_t output_format)
600601
{
601602
struct json* j = NULL;
602603
struct json* request = NULL;
@@ -613,6 +614,7 @@ pgmoneta_management_request_expunge(SSL* ssl, int socket, char* server, char* ba
613614

614615
pgmoneta_json_put(request, MANAGEMENT_ARGUMENT_SERVER, (uintptr_t)server, ValueString);
615616
pgmoneta_json_put(request, MANAGEMENT_ARGUMENT_BACKUP, (uintptr_t)backup_id, ValueString);
617+
pgmoneta_json_put(request, MANAGEMENT_ARGUMENT_CASCADE, (uintptr_t)cascade, ValueBool);
616618

617619
if (pgmoneta_management_write_json(ssl, socket, compression, encryption, j))
618620
{

src/libpgmoneta/prometheus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2347,7 +2347,7 @@ backup_information(SSL* client_ssl, int client_fd)
23472347
bool valid;
23482348
int valid_count = 0;
23492349
int invalid_count = 0;
2350-
char *data = NULL;
2350+
char* data = NULL;
23512351
struct main_configuration* config;
23522352

23532353
config = (struct main_configuration*)shmem;

0 commit comments

Comments
 (0)