Skip to content

Commit 02ac17b

Browse files
committed
Add load balance for backup threads.
1 parent 3eb1013 commit 02ac17b

File tree

4 files changed

+40
-17
lines changed

4 files changed

+40
-17
lines changed

backup.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ typedef struct
4747
parray *files;
4848
parray *prev_files;
4949
const XLogRecPtr *lsn;
50-
unsigned int start_file_idx;
51-
unsigned int end_file_idx;
5250
} backup_files_args;
5351

5452
/*
@@ -106,6 +104,7 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
106104
pthread_t stream_thread;
107105
backup_files_args *backup_threads_args[num_threads];
108106

107+
109108
/* repack the options */
110109
bool smooth_checkpoint = bkupopt.smooth_checkpoint;
111110
pgBackup *prev_backup = NULL;
@@ -315,27 +314,35 @@ do_backup_database(parray *backup_list, pgBackupOption bkupopt)
315314
if (num_threads < 1)
316315
num_threads = 1;
317316

317+
/* sort by size for load balancing */
318+
parray_qsort(backup_files_list, pgFileCompareSize);
319+
320+
/* init thread args with own file lists */
318321
for (i = 0; i < num_threads; i++)
319322
{
320323
backup_files_args *arg = pg_malloc(sizeof(backup_files_args));
321324
arg->from_root = pgdata;
322325
arg->to_root = path;
323-
arg->files = backup_files_list;
326+
arg->files = parray_new();
324327
arg->prev_files = prev_files;
325328
arg->lsn = lsn;
326-
arg->start_file_idx = i * (parray_num(backup_files_list)/num_threads);
327-
if (i == num_threads - 1)
328-
arg->end_file_idx = parray_num(backup_files_list);
329-
else
330-
arg->end_file_idx = (i + 1) * (parray_num(backup_files_list)/num_threads);
329+
backup_threads_args[i] = arg;
330+
}
331+
332+
/* balance load between threads */
333+
for (i = 0; i < parray_num(backup_files_list); i++)
334+
{
335+
int cur_thread = i % num_threads;
336+
parray_append(backup_threads_args[cur_thread]->files,
337+
parray_get(backup_files_list, i));
338+
}
331339

340+
/* Run threads */
341+
for (i = 0; i < num_threads; i++)
342+
{
332343
if (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(backup_files_list));
337-
backup_threads_args[i] = arg;
338-
pthread_create(&backup_threads[i], NULL, (void *(*)(void *)) backup_files, arg);
344+
elog(WARNING, "Start thread num:%li", parray_num(backup_threads_args[i]->files));
345+
pthread_create(&backup_threads[i], NULL, (void *(*)(void *)) backup_files, backup_threads_args[i]);
339346
}
340347

341348
/* Wait theads */
@@ -911,7 +918,7 @@ backup_files(void *arg)
911918
gettimeofday(&tv, NULL);
912919

913920
/* backup a file or create a directory */
914-
for (i = arguments->start_file_idx; i < arguments->end_file_idx; i++)
921+
for (i = 0; i < parray_num(arguments->files); i++)
915922
{
916923
int ret;
917924
struct stat buf;

dir.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,21 @@ pgFileComparePathDesc(const void *f1, const void *f2)
193193
return -pgFileComparePath(f1, f2);
194194
}
195195

196+
/* Compare two pgFile with their size */
197+
int
198+
pgFileCompareSize(const void *f1, const void *f2)
199+
{
200+
pgFile *f1p = *(pgFile **)f1;
201+
pgFile *f2p = *(pgFile **)f2;
202+
203+
if (f1p->size > f2p->size)
204+
return 1;
205+
else if (f1p->size < f2p->size)
206+
return -1;
207+
else
208+
return 0;
209+
}
210+
196211
/* Compare two pgFile with their modify timestamp. */
197212
int
198213
pgFileCompareMtime(const void *f1, const void *f2)

pg_arman.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ main(int argc, char *argv[])
172172
elog(ERROR, "delete command needs ARCLOG_PATH (-A, --arclog-path) to be set");
173173

174174
/* setup exclusion list for file search */
175-
for (i = 0; pgdata_exclude[i]; i++) /* find first empty slot */
176-
;
175+
for (i = 0; pgdata_exclude[i]; i++); /* find first empty slot */
176+
177177
if (arclog_path)
178178
pgdata_exclude[i++] = arclog_path;
179179

pg_arman.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ extern void pgFileFree(void *file);
284284
extern pg_crc32 pgFileGetCRC(pgFile *file);
285285
extern int pgFileComparePath(const void *f1, const void *f2);
286286
extern int pgFileComparePathDesc(const void *f1, const void *f2);
287+
extern int pgFileCompareSize(const void *f1, const void *f2);
287288
extern int pgFileCompareMtime(const void *f1, const void *f2);
288289
extern int pgFileCompareMtimeDesc(const void *f1, const void *f2);
289290

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy