@@ -21,8 +21,6 @@ typedef struct
2121{
2222parray * files ;
2323pgBackup * backup ;
24- unsignedint start_file_idx ;
25- unsignedint end_file_idx ;
2624}restore_files_args ;
2725
2826static void backup_online_files (bool re_recovery );
@@ -317,23 +315,22 @@ restore_database(pgBackup *backup)
317315if (num_threads < 1 )
318316num_threads = 1 ;
319317
318+ for (i = 0 ;i < parray_num (files );i ++ )
319+ {
320+ pgFile * file = (pgFile * )parray_get (files ,i );
321+
322+ __sync_lock_release (& file -> lock );
323+ }
324+
320325/* restore files into $PGDATA */
321326for (i = 0 ;i < num_threads ;i ++ )
322327{
323328restore_files_args * arg = pg_malloc (sizeof (restore_files_args ));
324329arg -> files = files ;
325330arg -> backup = backup ;
326- arg -> start_file_idx = i * (parray_num (files )/num_threads );
327- if (i == num_threads - 1 )
328- arg -> end_file_idx = parray_num (files );
329- else
330- arg -> end_file_idx = (i + 1 )* (parray_num (files )/num_threads );
331331
332332if (verbose )
333- elog (WARNING ,"Start thread for start_file_idx:%i end_file_idx:%i num:%li" ,
334- arg -> start_file_idx ,
335- arg -> end_file_idx ,
336- parray_num (files ));
333+ elog (WARNING ,"Start thread for num:%li" ,parray_num (files ));
337334
338335restore_threads_args [i ]= arg ;
339336pthread_create (& restore_threads [i ],NULL , (void * (* )(void * ))restore_files ,arg );
@@ -403,10 +400,12 @@ restore_files(void *arg)
403400restore_files_args * arguments = (restore_files_args * )arg ;
404401
405402/* restore files into $PGDATA */
406- for (i = arguments -> start_file_idx ;i < arguments -> end_file_idx ;i ++ )
403+ for (i = 0 ;i < parray_num ( arguments -> files ) ;i ++ )
407404{
408405char from_root [MAXPGPATH ];
409406pgFile * file = (pgFile * )parray_get (arguments -> files ,i );
407+ if (__sync_lock_test_and_set (& file -> lock ,1 )!= 0 )
408+ continue ;
410409
411410pgBackupGetPath (arguments -> backup ,from_root ,lengthof (from_root ),DATABASE_DIR );
412411