13
13
#include <unistd.h>
14
14
15
15
static int pgBackupDeleteFiles (pgBackup * backup );
16
+ int do_deletewal (time_t backup_id , bool strict );
16
17
17
18
int
18
19
do_delete (time_t backup_id )
@@ -21,8 +22,6 @@ do_delete(time_t backup_id)
21
22
int b_index ;
22
23
int ret ;
23
24
parray * backup_list ;
24
- XLogRecPtr oldest_lsn = InvalidXLogRecPtr ;
25
- TimeLineID oldest_tli ;
26
25
pgBackup * last_backup ;
27
26
28
27
/* DATE are always required */
@@ -82,37 +81,58 @@ do_delete(time_t backup_id)
82
81
/* cleanup */
83
82
parray_walk (backup_list , pgBackupFree );
84
83
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
+
85
101
/*
86
102
* Delete in archive WAL segments that are not needed anymore. The oldest
87
103
* segment to be kept is the first segment that the oldest full backup
88
104
* found around needs to keep.
89
105
*/
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 ++ )
91
116
{
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 )
102
119
{
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 )
105
123
{
106
- oldest_lsn = last_backup -> start_lsn ;
107
- oldest_tli = last_backup -> tli ;
124
+ backup_found = true ;
125
+ break ;
108
126
}
109
127
}
110
- catalog_unlock ();
111
- parray_walk (backup_list , pgBackupFree );
112
- parray_free (backup_list );
113
128
}
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 );
114
134
115
- if (delete_wal && !XLogRecPtrIsInvalid (oldest_lsn ))
135
+ if (!XLogRecPtrIsInvalid (oldest_lsn ))
116
136
{
117
137
XLogSegNo targetSegNo ;
118
138
char oldestSegmentNeeded [MAXFNAMELEN ];
0 commit comments