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

Commite3b0f44

Browse files
committed
Add support get ptrack from SQL for atomic.
1 parent091fe0a commite3b0f44

File tree

3 files changed

+99
-26
lines changed

3 files changed

+99
-26
lines changed

‎backup.c

Lines changed: 64 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ static bool pg_is_standby(void);
5959
staticvoidget_lsn(PGresult*res,XLogRecPtr*lsn);
6060
staticvoidget_xid(PGresult*res,uint32*xid);
6161
staticvoidpg_ptrack_clear(void);
62-
62+
staticchar*pg_ptrack_get_and_clear(Oidtablespace_oid,
63+
Oiddb_oid,
64+
Oidrel_oid,
65+
size_t*result_size);
6366
staticvoidadd_files(parray*files,constchar*root,booladd_root,boolis_pgdata);
6467
staticvoidcreate_file_list(parray*files,
6568
constchar*root,
@@ -315,9 +318,6 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
315318
pg_free(backup_threads_args[i]);
316319
}
317320

318-
/* Clear ptrack files after backup */
319-
if (current.backup_mode==BACKUP_MODE_DIFF_PTRACK)
320-
pg_ptrack_clear();
321321
/* Notify end of backup */
322322
pg_stop_backup(&current);
323323

@@ -568,6 +568,38 @@ pg_ptrack_clear(void)
568568
dbname=old_dbname;
569569
}
570570

571+
staticchar*
572+
pg_ptrack_get_and_clear(Oidtablespace_oid,Oiddb_oid,Oidrel_oid,size_t*result_size)
573+
{
574+
PGresult*res_db,*res;
575+
constchar*old_dbname=dbname;
576+
char*params[2];
577+
char*result;
578+
579+
reconnect();
580+
params[0]=palloc(64);
581+
params[1]=palloc(64);
582+
sprintf(params[0],"%i",db_oid);
583+
sprintf(params[1],"%i",rel_oid);
584+
res_db=execute("SELECT datname FROM pg_database WHERE oid=$1",1, (constchar**)params);
585+
disconnect();
586+
dbname=pstrdup(PQgetvalue(res_db,0,0));
587+
PQclear(res_db);
588+
589+
reconnect();
590+
sprintf(params[0],"%i",tablespace_oid);
591+
res=execute("SELECT pg_ptrack_get_and_clear($1, $2)",2, (constchar**)params);
592+
result= (char*)PQunescapeBytea((unsignedchar*)PQgetvalue(res,0,0),result_size);
593+
PQclear(res);
594+
pfree(params[0]);
595+
pfree(params[1]);
596+
597+
pfree((char*)dbname);
598+
dbname=old_dbname;
599+
600+
returnresult;
601+
}
602+
571603
staticvoid
572604
wait_for_archive(pgBackup*backup,constchar*sql)
573605
{
@@ -907,7 +939,7 @@ add_files(parray *files, const char *root, bool add_root, bool is_pgdata)
907939
relative=file->path+strlen(root)+1;
908940
if (is_pgdata&&
909941
!path_is_prefix_of_path("base",relative)&&
910-
!path_is_prefix_of_path("global",relative)&&
942+
/*!path_is_prefix_of_path("global", relative) &&*/
911943
!path_is_prefix_of_path("pg_tblspc",relative))
912944
continue;
913945

@@ -1062,35 +1094,45 @@ void make_pagemap_from_ptrack(parray *files)
10621094
pgFile*p= (pgFile*)parray_get(files,i);
10631095
if (p->ptrack_path!=NULL)
10641096
{
1065-
DataPagepage;
1066-
char*flat_memory,*flat_mamory_cur;
1097+
char*flat_memory;
1098+
char*tmp_path=p->ptrack_path;
1099+
char*tablespace;
1100+
size_tpath_length=strlen(p->ptrack_path);
10671101
size_tflat_size=0;
10681102
size_tstart_addr;
1069-
structstatst;
1103+
Oiddb_oid,rel_oid,tablespace_oid=0;
1104+
intsep_iter,sep_count=0;
1105+
tablespace=palloc0(64);
10701106

1071-
FILE*ptrack_file=fopen(p->ptrack_path,"r");
1072-
if (ptrack_file==NULL)
1107+
/* Find target path*/
1108+
for(sep_iter= (int)path_length;sep_iter >=0;sep_iter--)
10731109
{
1074-
elog(ERROR,"cannot open ptrack file \"%s\": %s",p->ptrack_path,
1075-
strerror(errno));
1110+
if (IS_DIR_SEP(tmp_path[sep_iter]))
1111+
{
1112+
sep_count++;
1113+
}
1114+
if (sep_count==3)
1115+
{
1116+
tmp_path+=sep_iter+1;
1117+
break;
1118+
}
10761119
}
1120+
/* For unix only now */
1121+
sscanf(tmp_path,"%[^/]/%u/%u_ptrack",tablespace,&db_oid,&rel_oid);
1122+
if (strcmp(tablespace,"base")!=0&&strcmp(tablespace,"global")!=0)
1123+
sscanf(tablespace,"%i",&tablespace_oid);
10771124

1078-
fstat(fileno(ptrack_file),&st);
1079-
flat_size=st.st_size-(st.st_size/BLCKSZ)*MAXALIGN(SizeOfPageHeaderData);
1080-
flat_mamory_cur=flat_memory=pg_malloc(flat_size);
1125+
flat_memory=pg_ptrack_get_and_clear(tablespace_oid,
1126+
db_oid,
1127+
rel_oid,
1128+
&flat_size);
10811129

1082-
while(fread(page.data,BLCKSZ,1,ptrack_file)==1)
1083-
{
1084-
char*map=PageGetContents(page.data);
1085-
memcpy(flat_memory,map,MAPSIZE);
1086-
flat_mamory_cur+=MAPSIZE;
1087-
}
1088-
fclose(ptrack_file);
10891130
start_addr= (RELSEG_SIZE/8)*p->segno;
10901131
p->pagemap.bitmapsize=start_addr+RELSEG_SIZE/8>flat_size ?flat_size-start_addr :RELSEG_SIZE/8;
10911132
p->pagemap.bitmap=pg_malloc(p->pagemap.bitmapsize);
10921133
memcpy(p->pagemap.bitmap,flat_memory+start_addr,p->pagemap.bitmapsize);
10931134
pg_free(flat_memory);
1135+
pg_free(tablespace);
10941136
}
10951137
}
10961138
}

‎restore.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ create_recovery_conf(const char *target_time,
476476
fprintf(fp,"recovery_target_xid = '%s'\n",target_xid);
477477
if (target_inclusive)
478478
fprintf(fp,"recovery_target_inclusive = '%s'\n",target_inclusive);
479+
/*fprintf(fp, "recovery_target = 'immediate'\n");*/
479480
fprintf(fp,"recovery_target_timeline = '%u'\n",target_tli);
480481

481482
fclose(fp);

‎sql/restore.sh

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,32 @@ psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT * FROM pgbench_branches
170170
diff${TEST_BASE}/TEST-0007-before.out${TEST_BASE}/TEST-0007-after.out
171171
echo''
172172

173+
174+
echo'###### RESTORE COMMAND TEST-0010 ######'
175+
echo'###### recovery to latest from full + page backups with loads when full backup do ######'
176+
init_backup
177+
pgbench_objs 0009
178+
pgbench -p${TEST_PGPORT} -d pgbench -c 4 -T 8> /dev/null2>&1&
179+
PGBENCH_PID=$!
180+
pg_arman backup -B${BACKUP_PATH} -b full -j 4 -p${TEST_PGPORT} -d postgres --verbose>${TEST_BASE}/TEST-0010-run.out2>&1;echo$?
181+
pg_arman validate -B${BACKUP_PATH} --verbose>>${TEST_BASE}/TEST-0010-run.out2>&1
182+
#kill $PGBENCH_PID 2> /dev/null
183+
sleep 12
184+
#psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT count(*) FROM pgbench_history;" > ${TEST_BASE}/TEST-0010-count1.out
185+
pg_arman backup -B${BACKUP_PATH} -b page -j 4 -p${TEST_PGPORT} -d postgres --verbose>>${TEST_BASE}/TEST-0010-run.out2>&1;echo$?
186+
pg_arman validate -B${BACKUP_PATH} --verbose>>${TEST_BASE}/TEST-0010-run.out2>&1
187+
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT sum(bbalance) FROM pgbench_branches;">${TEST_BASE}/TEST-0010-count1.out
188+
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT sum(delta) FROM pgbench_history;">${TEST_BASE}/TEST-0010-count2.out
189+
diff${TEST_BASE}/TEST-0010-count1.out${TEST_BASE}/TEST-0010-count2.out
190+
pg_ctl stop -m immediate> /dev/null2>&1
191+
pg_arman restore -B${BACKUP_PATH} --verbose>>${TEST_BASE}/TEST-0010-run.out2>&1;echo$?
192+
pg_ctl start -w -t 600> /dev/null2>&1
193+
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT sum(bbalance) FROM pgbench_branches;">${TEST_BASE}/TEST-0010-count1.out
194+
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT sum(delta) FROM pgbench_history;">${TEST_BASE}/TEST-0010-count2.out
195+
diff${TEST_BASE}/TEST-0010-count1.out${TEST_BASE}/TEST-0010-count2.out
196+
echo''
197+
198+
173199
echo'###### RESTORE COMMAND TEST-0009 ######'
174200
echo'###### recovery to latest from full + ptrack backups with loads when full backup do ######'
175201
init_backup
@@ -180,13 +206,17 @@ pg_arman backup -B ${BACKUP_PATH} -b full -j 4 -p ${TEST_PGPORT} -d postgres --v
180206
pg_arman validate -B${BACKUP_PATH} --verbose>>${TEST_BASE}/TEST-0009-run.out2>&1
181207
#kill $PGBENCH_PID 2> /dev/null
182208
sleep 12
183-
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT count(*) FROM pgbench_history;">${TEST_BASE}/TEST-0009-count1.out
209+
#psql --no-psqlrc -p ${TEST_PGPORT} -d pgbench -c "SELECT count(*) FROM pgbench_history;" > ${TEST_BASE}/TEST-0009-count1.out
184210
pg_arman backup -B${BACKUP_PATH} -b ptrack -j 4 -p${TEST_PGPORT} -d postgres --verbose>>${TEST_BASE}/TEST-0009-run.out2>&1;echo$?
185-
pg_arman validate -B${BACKUP_PATH} --verbose>>${TEST_BASE}/TEST-0006-run.out2>&1
211+
pg_arman validate -B${BACKUP_PATH} --verbose>>${TEST_BASE}/TEST-0009-run.out2>&1
212+
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT sum(bbalance) FROM pgbench_branches;">${TEST_BASE}/TEST-0009-count1.out
213+
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT sum(delta) FROM pgbench_history;">${TEST_BASE}/TEST-0009-count2.out
214+
diff${TEST_BASE}/TEST-0009-count1.out${TEST_BASE}/TEST-0009-count2.out
186215
pg_ctl stop -m immediate> /dev/null2>&1
187-
pg_arman restore -B${BACKUP_PATH} --verbose>>${TEST_BASE}/TEST-0006-run.out2>&1;echo$?
216+
pg_arman restore -B${BACKUP_PATH} --verbose>>${TEST_BASE}/TEST-0009-run.out2>&1;echo$?
188217
pg_ctl start -w -t 600> /dev/null2>&1
189-
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT count(*) FROM pgbench_history;">${TEST_BASE}/TEST-0009-count2.out
218+
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT sum(bbalance) FROM pgbench_branches;">${TEST_BASE}/TEST-0009-count1.out
219+
psql --no-psqlrc -p${TEST_PGPORT} -d pgbench -c"SELECT sum(delta) FROM pgbench_history;">${TEST_BASE}/TEST-0009-count2.out
190220
diff${TEST_BASE}/TEST-0009-count1.out${TEST_BASE}/TEST-0009-count2.out
191221
echo''
192222

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp