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

Commitb127345

Browse files
committed
Add muti-thread validation.
1 parent2eb6d92 commitb127345

File tree

3 files changed

+66
-21
lines changed

3 files changed

+66
-21
lines changed

‎pg_probackup.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ main(int argc, char *argv[])
178178
if (target_time!=NULL&&target_xid!=NULL)
179179
elog(ERROR,"You can't specify recovery-target-time and recovery-target-xid at the same time");
180180

181+
if (num_threads<1)
182+
num_threads=1;
183+
181184
/* do actual operation */
182185
if (pg_strcasecmp(cmd,"init")==0)
183186
returndo_init();

‎restore.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,6 @@ restore_database(pgBackup *backup)
335335
pgFileFree(parray_remove(files,i));
336336
}
337337

338-
if (num_threads<1)
339-
num_threads=1;
340-
341338
for (i=0;i<parray_num(files);i++)
342339
{
343340
pgFile*file= (pgFile*)parray_get(files,i);

‎validate.c

Lines changed: 63 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,17 @@
1010
#include"pg_probackup.h"
1111

1212
#include<sys/stat.h>
13+
#include<pthread.h>
1314

14-
staticboolpgBackupValidateFiles(parray*files,constchar*root,boolsize_only);
15+
staticvoidpgBackupValidateFiles(void*arg);
16+
17+
typedefstruct
18+
{
19+
parray*files;
20+
constchar*root;
21+
boolsize_only;
22+
boolcorrupted;
23+
}validate_files_args;
1524

1625
/*
1726
* Validate files in the backup and update its status to OK.
@@ -85,6 +94,8 @@ pgBackupValidate(pgBackup *backup,
8594
charpath[MAXPGPATH];
8695
parray*files;
8796
boolcorrupted= false;
97+
pthread_tvalidate_threads[num_threads];
98+
validate_files_args*validate_threads_args[num_threads];
8899

89100
time2iso(timestamp,lengthof(timestamp),backup->recovery_time);
90101
if (!for_get_timeline)
@@ -102,13 +113,41 @@ pgBackupValidate(pgBackup *backup,
102113
backup->backup_mode==BACKUP_MODE_DIFF_PAGE||
103114
backup->backup_mode==BACKUP_MODE_DIFF_PTRACK)
104115
{
116+
inti;
105117
elog(LOG,"database files...");
106118
pgBackupGetPath(backup,base_path,lengthof(base_path),DATABASE_DIR);
107119
pgBackupGetPath(backup,path,lengthof(path),
108120
DATABASE_FILE_LIST);
109121
files=dir_read_file_list(base_path,path);
110-
if (!pgBackupValidateFiles(files,base_path,size_only))
111-
corrupted= true;
122+
123+
/* setup threads */
124+
for (i=0;i<parray_num(files);i++)
125+
{
126+
pgFile*file= (pgFile*)parray_get(files,i);
127+
__sync_lock_release(&file->lock);
128+
}
129+
130+
/* restore files into $PGDATA */
131+
for (i=0;i<num_threads;i++)
132+
{
133+
validate_files_args*arg=pg_malloc(sizeof(validate_files_args));
134+
arg->files=files;
135+
arg->root=base_path;
136+
arg->size_only=size_only;
137+
arg->corrupted= false;
138+
139+
validate_threads_args[i]=arg;
140+
pthread_create(&validate_threads[i],NULL, (void*(*)(void*))pgBackupValidateFiles,arg);
141+
}
142+
143+
/* Wait theads */
144+
for (i=0;i<num_threads;i++)
145+
{
146+
pthread_join(validate_threads[i],NULL);
147+
if (validate_threads_args[i]->corrupted)
148+
corrupted= true;
149+
pg_free(validate_threads_args[i]);
150+
}
112151
parray_walk(files,pgFileFree);
113152
parray_free(files);
114153
}
@@ -140,16 +179,21 @@ get_relative_path(const char *path, const char *root)
140179
/*
141180
* Validate files in the backup with size or CRC.
142181
*/
143-
staticbool
144-
pgBackupValidateFiles(parray*files,constchar*root,boolsize_only)
182+
staticvoid
183+
pgBackupValidateFiles(void*arg)
145184
{
146185
inti;
147186

148-
for (i=0;i<parray_num(files);i++)
187+
validate_files_args*arguments= (validate_files_args*)arg;
188+
189+
190+
for (i=0;i<parray_num(arguments->files);i++)
149191
{
150192
structstatst;
151193

152-
pgFile*file= (pgFile*)parray_get(files,i);
194+
pgFile*file= (pgFile*)parray_get(arguments->files,i);
195+
if (__sync_lock_test_and_set(&file->lock,1)!=0)
196+
continue;
153197

154198
if (interrupted)
155199
elog(ERROR,"interrupted during validate");
@@ -159,8 +203,8 @@ pgBackupValidateFiles(parray *files, const char *root, bool size_only)
159203
continue;
160204

161205
/* print progress */
162-
elog(LOG,"(%d/%lu) %s",i+1, (unsigned long)parray_num(files),
163-
get_relative_path(file->path,root));
206+
elog(LOG,"(%d/%lu) %s",i+1, (unsigned long)parray_num(arguments->files),
207+
get_relative_path(file->path,arguments->root));
164208

165209
/* always validate file size */
166210
if (stat(file->path,&st)==-1)
@@ -169,32 +213,33 @@ pgBackupValidateFiles(parray *files, const char *root, bool size_only)
169213
elog(WARNING,"backup file \"%s\" vanished",file->path);
170214
else
171215
elog(ERROR,"cannot stat backup file \"%s\": %s",
172-
get_relative_path(file->path,root),strerror(errno));
173-
return false;
216+
get_relative_path(file->path,arguments->root),strerror(errno));
217+
arguments->corrupted= true;
218+
return;
174219
}
175220
if (file->write_size!=st.st_size)
176221
{
177222
elog(WARNING,"size of backup file \"%s\" must be %lu but %lu",
178-
get_relative_path(file->path,root),
223+
get_relative_path(file->path,arguments->root),
179224
(unsigned long)file->write_size,
180225
(unsigned long)st.st_size);
181-
return false;
226+
arguments->corrupted= true;
227+
return;
182228
}
183229

184230
/* validate CRC too */
185-
if (!size_only)
231+
if (!arguments->size_only)
186232
{
187233
pg_crc32crc;
188234

189235
crc=pgFileGetCRC(file);
190236
if (crc!=file->crc)
191237
{
192238
elog(WARNING,"CRC of backup file \"%s\" must be %X but %X",
193-
get_relative_path(file->path,root),file->crc,crc);
194-
return false;
239+
get_relative_path(file->path,arguments->root),file->crc,crc);
240+
arguments->corrupted= true;
241+
return;
195242
}
196243
}
197244
}
198-
199-
return true;
200245
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp