Skip to content

Commit a40f1f5

Browse files
author
Artur Zakirov
committed
Refactor do_delete() function
1 parent a5e2c83 commit a40f1f5

File tree

2 files changed

+57
-34
lines changed

2 files changed

+57
-34
lines changed

delete.c

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ int
2222
do_delete(time_t backup_id)
2323
{
2424
int i;
25-
int last_index;
26-
parray *backup_list;
27-
pgBackup *last_backup = NULL;
25+
parray *backup_list,
26+
*delete_list;
27+
time_t parent_id = 0;
28+
bool backup_found = false;
2829

2930
/* DATE are always required */
3031
if (backup_id == 0)
@@ -38,47 +39,59 @@ do_delete(time_t backup_id)
3839
if (!backup_list)
3940
elog(ERROR, "no backup list found, can't process any more");
4041

41-
/* Find backup to be deleted */
42-
for (i = 0; i < parray_num(backup_list); i++)
42+
delete_list = parray_new();
43+
44+
/* Find backup to be deleted and make increment backups array to be deleted */
45+
for (i = (int) parray_num(backup_list) - 1; i >= 0; i--)
4346
{
44-
last_backup = (pgBackup *) parray_get(backup_list, i);
45-
if (last_backup->start_time == backup_id)
46-
goto found_backup;
47-
}
47+
pgBackup *backup = (pgBackup *) parray_get(backup_list, (size_t) i);
4848

49-
elog(ERROR, "no backup found, cannot delete.");
49+
if (backup->start_time == backup_id)
50+
{
51+
parray_append(delete_list, backup);
5052

51-
found_backup:
52-
last_index = i;
53-
/* check for interrupt */
54-
if (interrupted)
55-
elog(ERROR, "interrupted during delete backup");
53+
/*
54+
* Do not remove next backups, if target backup was finished
55+
* incorrectly.
56+
*/
57+
if (backup->status == BACKUP_STATUS_ERROR)
58+
break;
5659

57-
/* just do it */
58-
pgBackupDeleteFiles(last_backup);
60+
/* Save backup id to retreive increment backups */
61+
parent_id = backup->start_time;
62+
backup_found = true;
63+
}
64+
else if (backup_found)
65+
{
66+
if (backup->backup_mode != BACKUP_MODE_FULL &&
67+
backup->parent_backup == parent_id)
68+
{
69+
/* Append to delete list increment backup */
70+
parray_append(delete_list, backup);
71+
/* Save backup id to retreive increment backups */
72+
parent_id = backup->start_time;
73+
}
74+
else
75+
break;
76+
}
77+
}
5978

60-
/*
61-
* Do not remove next backups, if current backup is not full backup and
62-
* was finished incorrectly.
63-
*/
64-
if (last_backup->status != BACKUP_STATUS_OK &&
65-
last_backup->status != BACKUP_STATUS_CORRUPT &&
66-
last_backup->backup_mode != BACKUP_MODE_FULL)
67-
return 0;
79+
if (parray_num(delete_list) == 0)
80+
elog(ERROR, "no backup found, cannot delete");
6881

69-
/* Remove all increments after removed backup */
70-
for (i = last_index - 1; i >= 0; i--)
82+
/* Delete backups from the end of list */
83+
for (i = (int) parray_num(delete_list) - 1; i >= 0; i--)
7184
{
72-
pgBackup *backup = (pgBackup *) parray_get(backup_list, i);
85+
pgBackup *backup = (pgBackup *) parray_get(delete_list, (size_t) i);
7386

74-
/* Stop removing increments */
75-
if (backup->backup_mode >= BACKUP_MODE_FULL)
76-
break;
87+
if (interrupted)
88+
elog(ERROR, "interrupted during delete backup");
7789

7890
pgBackupDeleteFiles(backup);
7991
}
8092

8193
/* cleanup */
94+
parray_free(delete_list);
8295
parray_walk(backup_list, pgBackupFree);
8396
parray_free(backup_list);
8497

@@ -295,6 +308,7 @@ pgBackupDeleteFiles(pgBackup *backup)
295308

296309
parray_walk(files, pgFileFree);
297310
parray_free(files);
311+
backup->status = BACKUP_STATUS_DELETED;
298312

299313
return 0;
300314
}

tests/delete_test.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,21 @@ def test_delete_increment_2(self):
6868
with open(path.join(node.logs_dir, "backup_3.log"), "wb") as backup_log:
6969
backup_log.write(self.backup_pb(node, backup_type="page", options=["--verbose"]))
7070

71+
# full backup mode
72+
self.backup_pb(node)
73+
7174
show_backups = self.show_pb(node)
72-
self.assertEqual(len(show_backups), 3)
73-
self.delete_pb(node, show_backups[1].id)
75+
self.assertEqual(len(show_backups), 4)
76+
77+
# delete first page backup
78+
self.delete_pb(node, show_backups[2].id)
79+
7480
show_backups = self.show_pb(node)
75-
self.assertEqual(len(show_backups), 1)
81+
self.assertEqual(len(show_backups), 2)
82+
7683
self.assertEqual(show_backups[0].mode, six.b("FULL"))
7784
self.assertEqual(show_backups[0].status, six.b("OK"))
85+
self.assertEqual(show_backups[1].mode, six.b("FULL"))
86+
self.assertEqual(show_backups[1].status, six.b("OK"))
7887

7988
node.stop()

0 commit comments

Comments
 (0)