Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5bc7164

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 arealready incompatible either way, and it is a pain to maintain codeduplicated from past versions of Postgres, so rely a maximum on thecore structures.
1 parent83462de commit5bc7164

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-
#defineTIMEOUT_ARCHIVE10/* wait 10 sec until WAL archive complete */
23+
/* wait 10 sec until WAL archive complete */
24+
#defineTIMEOUT_ARCHIVE10
25+
26+
/* Server version */
27+
staticintserver_version=0;
2428

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

2833
/*
2934
* Backup routines
3035
*/
3136
staticvoidbackup_cleanup(boolfatal,void*userdata);
32-
staticvoiddelete_old_files(constchar*root,parray*files,intkeep_files,
33-
intkeep_days,intserver_version,boolis_arclog);
37+
staticvoiddelete_old_files(constchar*root,
38+
parray*files,intkeep_files,
39+
intkeep_days,boolis_arclog);
3440
staticvoidbackup_files(constchar*from_root,constchar*to_root,
3541
parray*files,parray*prev_files,constXLogRecPtr*lsn,boolcompress,constchar*prefix);
3642
staticparray*do_backup_database(parray*backup_list,pgBackupOptionbkupopt);
@@ -710,7 +716,6 @@ do_backup(pgBackupOption bkupopt)
710716
parray*files_database;
711717
parray*files_arclog;
712718
parray*files_srvlog;
713-
intserver_version;
714719
intret;
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-
staticintserver_version=0;
958962
boolmy_conn;
959963

960-
/*return cached serverversion */
964+
/*Leave if serverhas already been checked */
961965
if (server_version>0)
962-
returnserver_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,butmust be8.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-
returnserver_version;
987988
}
988989

989990
staticvoid
@@ -1013,25 +1014,15 @@ pg_start_backup(const char *label, bool smooth, pgBackup *backup)
10131014
{
10141015
PGresult*res;
10151016
constchar*params[2];
1016-
intserver_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
intkeep_files,
14211412
intkeep_days,
1422-
intserver_version,
14231413
boolis_arclog)
14241414
{
14251415
inti;
@@ -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-
#ifPG_VERSION_NUM<80300
22-
#defineXLogRecPtrIsInvalid(r)((r).xrecoff == 0)
23-
#endif
24-
2521
#ifdefHAVE_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-
#definePG_PAGE_LAYOUT_VERSION_v802/* 8.0 */
160-
#definePG_PAGE_LAYOUT_VERSION_v813/* 8.1 - 8.2 */
161-
#definePG_PAGE_LAYOUT_VERSION_v834/* 8.3 - */
162-
163155
/* 80000 <= PG_VERSION_NUM < 80300 */
164156
typedefstructPageHeaderData_v80
165157
{
@@ -201,9 +193,8 @@ typedef struct PageHeaderData_v83
201193

202194
typedefunionDataPage
203195
{
204-
PageHeaderData_v80v80;/* 8.0 - 8.2 */
205-
PageHeaderData_v83v83;/* 8.3 - */
206-
chardata[BLCKSZ];
196+
PageHeaderDatapage_data;
197+
chardata[BLCKSZ];
207198
}DataPage;
208199

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

216207
staticbool
217-
parse_page(constDataPage*page,intserver_version,
208+
parse_page(constDataPage*page,
218209
XLogRecPtr*lsn,uint16*offset,uint16*length)
219210
{
220-
uint16page_layout_version;
221-
222-
/* Determine page layout version */
223-
if (server_version<80100)
224-
page_layout_version=PG_PAGE_LAYOUT_VERSION_v80;
225-
elseif (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+
constPageHeaderData*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-
constPageHeaderData_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-
constPageHeaderData_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_tread_len;
290252
interrno_tmp;
291253
pg_crc32crc;
292-
intserver_version;
293254
#ifdefHAVE_LIBZ
294255
z_streamz;
295256
charoutbuf[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-
#ifPG_VERSION_NUM<80200
24-
#defineXLOG_BLCKSZBLCKSZ
25-
#endif
26-
27-
#ifPG_VERSION_NUM<80300
28-
#defineTXID_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
#defineTXID_CURRENT_SQL"SELECT txid_current();"
32-
#endif
3325

3426
/* Directory/File names */
3527
#defineDATABASE_DIR"database"
@@ -241,7 +233,7 @@ extern const char *pgdata_exclude[];
241233
/* in backup.c */
242234
externintdo_backup(pgBackupOptionbkupopt);
243235
externBackupModeparse_backup_mode(constchar*value,intelevel);
244-
externintget_server_version(void);
236+
externvoidcheck_server_version(void);
245237
externboolfileExists(constchar*path);
246238

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

308300
/* in xlog.c */
309-
externboolxlog_is_complete_wal(constpgFile*file,intserver_version);
301+
externboolxlog_is_complete_wal(constpgFile*file);
310302
externvoidxlog_fname(char*fname,size_tlen,TimeLineIDtli,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-
#ifPG_VERSION_NUM >=80400
1817
typedefunsigned longDatum;
1918
typedefstructMemoryContextData*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(constpgFile*file,intserver_version)
38+
xlog_is_complete_wal(constpgFile*file)
4139
{
4240
FILE*fp;
4341
XLogPagepage;
@@ -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)

[8]ページ先頭

©2009-2025 Movatter.jp