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)