Skip to content

Commit 5bc7164

Browse files
author
Michael Paquier
committed
Begin cleanup of version-related code
Due to changes in XlogRecPtr in 9.3, older version of pg_rman are already incompatible either way, and it is a pain to maintain code duplicated from past versions of Postgres, so rely a maximum on the core structures.
1 parent 83462de commit 5bc7164

File tree

4 files changed

+56
-115
lines changed

4 files changed

+56
-115
lines changed

backup.c

Lines changed: 29 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,23 @@
2020
#include "libpq/pqsignal.h"
2121
#include "pgut/pgut-port.h"
2222

23-
#define TIMEOUT_ARCHIVE 10 /* wait 10 sec until WAL archive complete */
23+
/* wait 10 sec until WAL archive complete */
24+
#define TIMEOUT_ARCHIVE 10
25+
26+
/* Server version */
27+
static int server_version = 0;
2428

2529
static bool in_backup = false; /* TODO: more robust logic */
26-
static parray *cleanup_list; /* list of command to execute at error processing for snapshot */
30+
/* List of commands to execute at error processing for snapshot */
31+
static parray *cleanup_list;
2732

2833
/*
2934
* Backup routines
3035
*/
3136
static void backup_cleanup(bool fatal, void *userdata);
32-
static void delete_old_files(const char *root, parray *files, int keep_files,
33-
int keep_days, int server_version, bool is_arclog);
37+
static void delete_old_files(const char *root,
38+
parray *files, int keep_files,
39+
int keep_days, bool is_arclog);
3440
static void backup_files(const char *from_root, const char *to_root,
3541
parray *files, parray *prev_files, const XLogRecPtr *lsn, bool compress, const char *prefix);
3642
static parray *do_backup_database(parray *backup_list, pgBackupOption bkupopt);
@@ -710,7 +716,6 @@ do_backup(pgBackupOption bkupopt)
710716
parray *files_database;
711717
parray *files_arclog;
712718
parray *files_srvlog;
713-
int server_version;
714719
int ret;
715720

716721
/* repack the necesary options */
@@ -745,7 +750,7 @@ do_backup(pgBackupOption bkupopt)
745750
#endif
746751

747752
/* confirm data block size and xlog block size are compatible */
748-
server_version = get_server_version();
753+
check_server_version();
749754

750755
/* setup cleanup callback function */
751756
in_backup = true;
@@ -837,10 +842,10 @@ do_backup(pgBackupOption bkupopt)
837842
*/
838843
if (HAVE_ARCLOG(&current))
839844
delete_old_files(arclog_path, files_arclog, keep_arclog_files,
840-
keep_arclog_days, server_version, true);
845+
keep_arclog_days, true);
841846
if (current.with_serverlog)
842847
delete_old_files(srvlog_path, files_srvlog, keep_srvlog_files,
843-
keep_srvlog_days, server_version, false);
848+
keep_srvlog_days, false);
844849

845850
/* Delete old backup files after all backup operation. */
846851
pgBackupDelete(keep_data_generations, keep_data_days);
@@ -951,15 +956,14 @@ make_backup_label(parray *backup_list)
951956
/*
952957
* get server version and confirm block sizes.
953958
*/
954-
int
955-
get_server_version(void)
959+
void
960+
check_server_version(void)
956961
{
957-
static int server_version = 0;
958962
bool my_conn;
959963

960-
/* return cached server version */
964+
/* Leave if server has already been checked */
961965
if (server_version > 0)
962-
return server_version;
966+
return;
963967

964968
my_conn = (connection == NULL);
965969

@@ -968,22 +972,19 @@ get_server_version(void)
968972

969973
/* confirm server version */
970974
server_version = PQserverVersion(connection);
971-
if (server_version < 80200)
975+
if (server_version != PG_VERSION_NUM)
972976
elog(ERROR_PG_INCOMPATIBLE,
973-
_("server version is %d.%d.%d, but must be 8.2 or higher."),
974-
server_version / 10000,
975-
(server_version / 100) % 100,
976-
server_version % 100);
977+
_("server version is %d.%d.%d, must be %s or higher."),
978+
server_version / 10000,
979+
(server_version / 100) % 100,
980+
server_version % 100, PG_MAJORVERSION);
977981

978982
/* confirm block_size (BLCKSZ) and wal_block_size (XLOG_BLCKSZ) */
979983
confirm_block_size("block_size", BLCKSZ);
980-
if (server_version >= 80400)
981-
confirm_block_size("wal_block_size", XLOG_BLCKSZ);
984+
confirm_block_size("wal_block_size", XLOG_BLCKSZ);
982985

983986
if (my_conn)
984987
disconnect();
985-
986-
return server_version;
987988
}
988989

989990
static void
@@ -1013,25 +1014,15 @@ pg_start_backup(const char *label, bool smooth, pgBackup *backup)
10131014
{
10141015
PGresult *res;
10151016
const char *params[2];
1016-
int server_version;
10171017

10181018
params[0] = label;
10191019

10201020
reconnect();
1021-
server_version = get_server_version();
1022-
if (server_version >= 80400)
1023-
{
1024-
/* 2nd argument is 'fast'*/
1025-
params[1] = smooth ? "false" : "true";
1026-
res = execute("SELECT * from pg_xlogfile_name_offset(pg_start_backup($1, $2))", 2, params);
1027-
}
1028-
else
1029-
{
1030-
/* v8.3 always uses smooth checkpoint */
1031-
if (!smooth && server_version >= 80300)
1032-
command("CHECKPOINT", 0, NULL);
1033-
res = execute("SELECT * from pg_xlogfile_name_offset(pg_start_backup($1))", 1, params);
1034-
}
1021+
1022+
/* 2nd argument is 'fast'*/
1023+
params[1] = smooth ? "false" : "true";
1024+
res = execute("SELECT * from pg_xlogfile_name_offset(pg_start_backup($1, $2))", 2, params);
1025+
10351026
if (backup != NULL)
10361027
get_lsn(res, &backup->tli, &backup->start_lsn);
10371028
PQclear(res);
@@ -1419,7 +1410,6 @@ delete_old_files(const char *root,
14191410
parray *files,
14201411
int keep_files,
14211412
int keep_days,
1422-
int server_version,
14231413
bool is_arclog)
14241414
{
14251415
int i;
@@ -1460,7 +1450,7 @@ delete_old_files(const char *root,
14601450

14611451
elog(LOG, "%s() %s", __FUNCTION__, file->path);
14621452
/* Delete completed WALs only. */
1463-
if (is_arclog && !xlog_is_complete_wal(file, server_version))
1453+
if (is_arclog && !xlog_is_complete_wal(file))
14641454
{
14651455
elog(LOG, "%s() not complete WAL", __FUNCTION__);
14661456
continue;

data.c

Lines changed: 22 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@
1818
#include "storage/block.h"
1919
#include "storage/bufpage.h"
2020

21-
#if PG_VERSION_NUM < 80300
22-
#define XLogRecPtrIsInvalid(r) ((r).xrecoff == 0)
23-
#endif
24-
2521
#ifdef HAVE_LIBZ
2622
#include <zlib.h>
2723

@@ -156,10 +152,6 @@ doInflate(z_stream *zp, size_t in_size, size_t out_size,void *inbuf,
156152
}
157153
#endif
158154

159-
#define PG_PAGE_LAYOUT_VERSION_v80 2 /* 8.0 */
160-
#define PG_PAGE_LAYOUT_VERSION_v81 3 /* 8.1 - 8.2 */
161-
#define PG_PAGE_LAYOUT_VERSION_v83 4 /* 8.3 - */
162-
163155
/* 80000 <= PG_VERSION_NUM < 80300 */
164156
typedef struct PageHeaderData_v80
165157
{
@@ -201,9 +193,8 @@ typedef struct PageHeaderData_v83
201193

202194
typedef union DataPage
203195
{
204-
PageHeaderData_v80 v80; /* 8.0 - 8.2 */
205-
PageHeaderData_v83 v83; /* 8.3 - */
206-
char data[BLCKSZ];
196+
PageHeaderData page_data;
197+
char data[BLCKSZ];
207198
} DataPage;
208199

209200
typedef struct BackupPageHeader
@@ -214,56 +205,27 @@ typedef struct BackupPageHeader
214205
} BackupPageHeader;
215206

216207
static bool
217-
parse_page(const DataPage *page, int server_version,
208+
parse_page(const DataPage *page,
218209
XLogRecPtr *lsn, uint16 *offset, uint16 *length)
219210
{
220-
uint16 page_layout_version;
221-
222-
/* Determine page layout version */
223-
if (server_version < 80100)
224-
page_layout_version = PG_PAGE_LAYOUT_VERSION_v80;
225-
else if (server_version < 80300)
226-
page_layout_version = PG_PAGE_LAYOUT_VERSION_v81;
227-
else
228-
page_layout_version = PG_PAGE_LAYOUT_VERSION_v83;
229-
230-
/* Check normal case */
231-
if (server_version < 80300)
211+
const PageHeaderData *page_data = &page->page_data;
212+
213+
/* Get lsn from page header */
214+
*lsn = PageXLogRecPtrGet(page_data->pd_lsn);
215+
216+
if (PageGetPageSize(page_data) == BLCKSZ &&
217+
PageGetPageLayoutVersion(page_data) == PG_PAGE_LAYOUT_VERSION &&
218+
(page_data->pd_flags & ~PD_VALID_FLAG_BITS) == 0 &&
219+
page_data->pd_lower >= SizeOfPageHeaderData &&
220+
page_data->pd_lower <= page_data->pd_upper &&
221+
page_data->pd_upper <= page_data->pd_special &&
222+
page_data->pd_special <= BLCKSZ &&
223+
page_data->pd_special == MAXALIGN(page_data->pd_special) &&
224+
!XLogRecPtrIsInvalid(*lsn))
232225
{
233-
const PageHeaderData_v80 *v80 = &page->v80;
234-
235-
if (PageGetPageSize_v80(v80) == BLCKSZ &&
236-
PageGetPageLayoutVersion_v80(v80) == page_layout_version &&
237-
v80->pd_lower >= SizeOfPageHeaderData_v80 &&
238-
v80->pd_lower <= v80->pd_upper &&
239-
v80->pd_upper <= v80->pd_special &&
240-
v80->pd_special <= BLCKSZ &&
241-
v80->pd_special == MAXALIGN(v80->pd_special) &&
242-
!XLogRecPtrIsInvalid(*lsn = v80->pd_lsn))
243-
{
244-
*offset = v80->pd_lower;
245-
*length = v80->pd_upper - v80->pd_lower;
246-
return true;
247-
}
248-
}
249-
else
250-
{
251-
const PageHeaderData_v83 *v83 = &page->v83;
252-
253-
if (PageGetPageSize_v83(v83) == BLCKSZ &&
254-
PageGetPageLayoutVersion_v83(v83) == page_layout_version &&
255-
(v83->pd_flags & ~PD_VALID_FLAG_BITS_v83) == 0 &&
256-
v83->pd_lower >= SizeOfPageHeaderData_v83 &&
257-
v83->pd_lower <= v83->pd_upper &&
258-
v83->pd_upper <= v83->pd_special &&
259-
v83->pd_special <= BLCKSZ &&
260-
v83->pd_special == MAXALIGN(v83->pd_special) &&
261-
!XLogRecPtrIsInvalid(*lsn = v83->pd_lsn))
262-
{
263-
*offset = v83->pd_lower;
264-
*length = v83->pd_upper - v83->pd_lower;
265-
return true;
266-
}
226+
*offset = page_data->pd_lower;
227+
*length = page_data->pd_upper - page_data->pd_lower;
228+
return true;
267229
}
268230

269231
*offset = *length = 0;
@@ -289,7 +251,6 @@ backup_data_file(const char *from_root, const char *to_root,
289251
size_t read_len;
290252
int errno_tmp;
291253
pg_crc32 crc;
292-
int server_version;
293254
#ifdef HAVE_LIBZ
294255
z_stream z;
295256
char outbuf[zlibOutSize];
@@ -351,7 +312,7 @@ backup_data_file(const char *from_root, const char *to_root,
351312
#endif
352313

353314
/* confirm server version */
354-
server_version = get_server_version();
315+
check_server_version();
355316

356317
/* read each page and write the page excluding hole */
357318
for (blknum = 0;
@@ -368,7 +329,7 @@ backup_data_file(const char *from_root, const char *to_root,
368329
* If a invalid data page was found, fallback to simple copy to ensure
369330
* all pages in the file don't have BackupPageHeader.
370331
*/
371-
if (!parse_page(&page, server_version, &page_lsn,
332+
if (!parse_page(&page, &page_lsn,
372333
&header.hole_offset, &header.hole_length))
373334
{
374335
elog(LOG, "%s fall back to simple copy", file->path);

pg_rman.h

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,8 @@
2020
#include "utils/pg_crc.h"
2121
#include "parray.h"
2222

23-
#if PG_VERSION_NUM < 80200
24-
#define XLOG_BLCKSZ BLCKSZ
25-
#endif
26-
27-
#if PG_VERSION_NUM < 80300
28-
#define TXID_CURRENT_SQL "SELECT transactionid FROM pg_locks WHERE locktype = 'transactionid' AND pid = pg_backend_pid();"
29-
#include <sys/stat.h>
30-
#else
23+
/* Query to fetch current transaction ID */
3124
#define TXID_CURRENT_SQL "SELECT txid_current();"
32-
#endif
3325

3426
/* Directory/File names */
3527
#define DATABASE_DIR "database"
@@ -241,7 +233,7 @@ extern const char *pgdata_exclude[];
241233
/* in backup.c */
242234
extern int do_backup(pgBackupOption bkupopt);
243235
extern BackupMode parse_backup_mode(const char *value, int elevel);
244-
extern int get_server_version(void);
236+
extern void check_server_version(void);
245237
extern bool fileExists(const char *path);
246238

247239
/* in restore.c */
@@ -306,7 +298,7 @@ extern int pgFileCompareMtime(const void *f1, const void *f2);
306298
extern int pgFileCompareMtimeDesc(const void *f1, const void *f2);
307299

308300
/* in xlog.c */
309-
extern bool xlog_is_complete_wal(const pgFile *file, int server_version);
301+
extern bool xlog_is_complete_wal(const pgFile *file);
310302
extern void xlog_fname(char *fname, size_t len, TimeLineID tli, XLogRecPtr *lsn);
311303

312304
/* in data.c */

xlog.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@
1414
#include <sys/stat.h>
1515
#include <unistd.h>
1616

17-
#if PG_VERSION_NUM >= 80400
1817
typedef unsigned long Datum;
1918
typedef struct MemoryContextData *MemoryContext;
20-
#endif
2119

2220
#include "access/xlog_internal.h"
2321

@@ -37,7 +35,7 @@ typedef union XLogPage
3735
* based on ValidXLOGHeader() in src/backend/access/transam/xlog.c.
3836
*/
3937
bool
40-
xlog_is_complete_wal(const pgFile *file, int server_version)
38+
xlog_is_complete_wal(const pgFile *file)
4139
{
4240
FILE *fp;
4341
XLogPage page;
@@ -61,7 +59,7 @@ xlog_is_complete_wal(const pgFile *file, int server_version)
6159
return false;
6260
if (page.lheader.xlp_seg_size != XLogSegSize)
6361
return false;
64-
if (server_version >= 80300 && page.lheader.xlp_xlog_blcksz != XLOG_BLCKSZ)
62+
if (page.lheader.xlp_xlog_blcksz != XLOG_BLCKSZ)
6563
return false;
6664

6765
/*

0 commit comments

Comments
 (0)