Skip to content

Commit 7ba0302

Browse files
committed
Refactor delete command and add delwal command.
1 parent ff61fcc commit 7ba0302

File tree

4 files changed

+48
-22
lines changed

4 files changed

+48
-22
lines changed

delete.c

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <unistd.h>
1414

1515
static int pgBackupDeleteFiles(pgBackup *backup);
16+
int do_deletewal(time_t backup_id, bool strict);
1617

1718
int
1819
do_delete(time_t backup_id)
@@ -21,8 +22,6 @@ do_delete(time_t backup_id)
2122
int b_index;
2223
int ret;
2324
parray *backup_list;
24-
XLogRecPtr oldest_lsn = InvalidXLogRecPtr;
25-
TimeLineID oldest_tli;
2625
pgBackup *last_backup;
2726

2827
/* DATE are always required */
@@ -82,37 +81,58 @@ do_delete(time_t backup_id)
8281
/* cleanup */
8382
parray_walk(backup_list, pgBackupFree);
8483
parray_free(backup_list);
84+
85+
if (delete_wal)
86+
do_deletewal(backup_id, false);
87+
88+
return 0;
89+
}
90+
91+
int do_deletewal(time_t backup_id, bool strict)
92+
{
93+
int i;
94+
int ret;
95+
parray *backup_list;
96+
XLogRecPtr oldest_lsn = InvalidXLogRecPtr;
97+
TimeLineID oldest_tli;
98+
pgBackup *last_backup;
99+
bool backup_found = false;
100+
85101
/*
86102
* Delete in archive WAL segments that are not needed anymore. The oldest
87103
* segment to be kept is the first segment that the oldest full backup
88104
* found around needs to keep.
89105
*/
90-
if (delete_wal)
106+
/* Lock backup catalog */
107+
ret = catalog_lock();
108+
if (ret == -1)
109+
elog(ERROR, "can't lock backup catalog.");
110+
else if (ret == 1)
111+
elog(ERROR,
112+
"another pg_arman is running, stop delete.");
113+
114+
backup_list = catalog_get_backup_list(0);
115+
for (i = 0; i < parray_num(backup_list); i++)
91116
{
92-
/* Lock backup catalog */
93-
ret = catalog_lock();
94-
if (ret == -1)
95-
elog(ERROR, "can't lock backup catalog.");
96-
else if (ret == 1)
97-
elog(ERROR,
98-
"another pg_arman is running, stop delete.");
99-
100-
backup_list = catalog_get_backup_list(0);
101-
for (i = 0; i < parray_num(backup_list); i++)
117+
last_backup = (pgBackup *) parray_get(backup_list, i);
118+
if (last_backup->status == BACKUP_STATUS_OK)
102119
{
103-
last_backup = (pgBackup *) parray_get(backup_list, i);
104-
if (last_backup->status == BACKUP_STATUS_OK)
120+
oldest_lsn = last_backup->start_lsn;
121+
oldest_tli = last_backup->tli;
122+
if (strict && backup_id != 0 && backup_id >= last_backup->start_time)
105123
{
106-
oldest_lsn = last_backup->start_lsn;
107-
oldest_tli = last_backup->tli;
124+
backup_found = true;
125+
break;
108126
}
109127
}
110-
catalog_unlock();
111-
parray_walk(backup_list, pgBackupFree);
112-
parray_free(backup_list);
113128
}
129+
if (strict && backup_id != 0 && backup_found == false)
130+
elog(ERROR, "not found backup for deletwal command");
131+
catalog_unlock();
132+
parray_walk(backup_list, pgBackupFree);
133+
parray_free(backup_list);
114134

115-
if (delete_wal && !XLogRecPtrIsInvalid(oldest_lsn))
135+
if (!XLogRecPtrIsInvalid(oldest_lsn))
116136
{
117137
XLogSegNo targetSegNo;
118138
char oldestSegmentNeeded[MAXFNAMELEN];

expected/option.out

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Usage:
1010
pg_arman OPTION show [ID]
1111
pg_arman OPTION validate [ID]
1212
pg_arman OPTION delete ID
13+
pg_arman OPTION delwal [ID]
1314

1415
Common Options:
1516
-D, --pgdata=PATH location of the database storage area

pg_arman.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ main(int argc, char *argv[])
110110
if(strcmp(cmd, "show") != 0 &&
111111
strcmp(cmd, "validate") != 0 &&
112112
strcmp(cmd, "delete") != 0 &&
113-
strcmp(cmd, "restore") != 0)
113+
strcmp(cmd, "restore") != 0 &&
114+
strcmp(cmd, "delwal") != 0)
114115
break;
115116
} else if (backup_id_string == NULL)
116117
backup_id_string = argv[i];
@@ -209,6 +210,8 @@ main(int argc, char *argv[])
209210
return do_validate(backup_id);
210211
else if (pg_strcasecmp(cmd, "delete") == 0)
211212
return do_delete(backup_id);
213+
else if (pg_strcasecmp(cmd, "delwal") == 0)
214+
return do_deletewal(backup_id, true);
212215
else
213216
elog(ERROR, "invalid command \"%s\"", cmd);
214217

@@ -226,6 +229,7 @@ pgut_help(bool details)
226229
printf(_(" %s OPTION show [ID]\n"), PROGRAM_NAME);
227230
printf(_(" %s OPTION validate [ID]\n"), PROGRAM_NAME);
228231
printf(_(" %s OPTION delete ID\n"), PROGRAM_NAME);
232+
printf(_(" %s OPTION delwal [ID]\n"), PROGRAM_NAME);
229233

230234
if (!details)
231235
return;

pg_arman.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ extern int do_show(time_t backup_id, bool show_all);
230230
/* in delete.c */
231231
extern int do_delete(time_t backup_id);
232232
extern void pgBackupDelete(int keep_generations, int keep_days);
233+
extern int do_deletewal(time_t backup_id, bool strict);
233234

234235
/* in fetch.c */
235236
extern char *slurpFile(const char *datadir,

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy