The Samba-Bugzilla – Attachment 1448 Details for
Bug 3099
Please parallelize filesystem scan
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
One possible way to reorder the checksum computation.
checksum.patch (text/plain), 4.56 KB, created by
Wayne Davison
on 2005-09-15 16:23:22 UTC
(
hide
)
Description:
One possible way to reorder the checksum computation.
Filename:
MIME Type:
Creator:
Wayne Davison
Created:
2005-09-15 16:23:22 UTC
Size:
4.56 KB
patch
obsolete
>--- flist.c 9 Sep 2005 16:17:01 -0000 1.302 >+++ flist.c 15 Sep 2005 23:18:59 -0000 >@@ -36,6 +36,7 @@ extern int am_daemon; > extern int am_sender; > extern int do_progress; > extern int always_checksum; >+extern int pre_checksum; > extern int module_id; > extern int ignore_errors; > extern int numeric_ids; >@@ -708,19 +709,26 @@ static struct file_struct *receive_file_ > } > #endif > >- if (always_checksum) { >+ if (always_checksum && (sum_len || protocol_version < 28)) { > char *sum; >+ int slen = protocol_version < 21 ? 2 : MD4_SUM_LENGTH; >+ STRUCT_STAT st; > if (sum_len) { > file->u.sum = sum = bp; > /*bp += sum_len;*/ >- } else if (protocol_version < 28) { >+ } else { > /* Prior to 28, we get a useless set of nulls. */ > sum = empty_sum; >- } else >- sum = NULL; >- if (sum) { >- read_buf(f, sum, >- protocol_version < 21 ? 2 : MD4_SUM_LENGTH); >+ } >+ read_buf(f, sum, slen); >+ if (pre_checksum) { >+ char sum2[MD4_SUM_LENGTH]; >+ char *fname = f_name(file); >+ if (stat(fname, &st) == 0 && st.st_size == file_length) { >+ file_checksum(fname, sum2, st.st_size); >+ if (memcmp(sum, sum2, slen) != 0) >+ file->flags |= FLAG_SUM_DIFFERS; >+ } > } > } > >--- generator.c 6 Sep 2005 18:12:38 -0000 1.222 >+++ generator.c 15 Sep 2005 23:18:59 -0000 >@@ -67,6 +67,7 @@ extern int ignore_timeout; > extern int protocol_version; > extern int fuzzy_basis; > extern int always_checksum; >+extern int pre_checksum; > extern char *partial_dir; > extern char *basis_dir[]; > extern int compare_dest; >@@ -367,6 +368,8 @@ static int unchanged_file(char *fn, stru > of the file time to determine whether to sync */ > if (always_checksum && S_ISREG(st->st_mode)) { > char sum[MD4_SUM_LENGTH]; >+ if (pre_checksum && !fn) >+ return !(file->flags & FLAG_SUM_DIFFERS); > file_checksum(fn, sum, st->st_size); > return memcmp(sum, file->u.sum, protocol_version < 21 ? 2 > : MD4_SUM_LENGTH) == 0; >@@ -1044,7 +1047,7 @@ static void recv_generator(char *fname, > ; > else if (fnamecmp_type == FNAMECMP_FUZZY) > ; >- else if (unchanged_file(fnamecmp, file, &st)) { >+ else if (unchanged_file(fnamecmp_type == FNAMECMP_FNAME ? NULL : fnamecmp, file, &st)) { > if (fnamecmp_type == FNAMECMP_FNAME) { > if (itemizing) { > itemize(file, ndx, real_ret, &real_st, >--- main.c 22 Jul 2005 17:59:21 -0000 1.276 >+++ main.c 15 Sep 2005 23:18:59 -0000 >@@ -45,6 +45,7 @@ extern int copy_links; > extern int keep_dirlinks; > extern int preserve_hard_links; > extern int protocol_version; >+extern int always_checksum; > extern int recurse; > extern int relative_paths; > extern int rsync_port; >@@ -60,8 +61,10 @@ extern char *filesfrom_host; > extern char *rsync_path; > extern char *shell_cmd; > extern char *batch_name; >+extern char curr_dir[MAXPATHLEN]; > > int local_server = 0; >+int pre_checksum = 0; > struct file_list *the_file_list; > > /* There's probably never more than at most 2 outstanding child processes, >@@ -622,6 +625,7 @@ static void do_server_recv(int f_in, int > struct file_list *flist; > char *local_name = NULL; > char *dir = NULL; >+ char olddir[sizeof curr_dir]; > int save_verbose = verbose; > > if (filesfrom_fd >= 0) { >@@ -666,6 +670,10 @@ static void do_server_recv(int f_in, int > filesfrom_fd = -1; > } > >+ strlcpy(olddir, curr_dir, sizeof olddir); >+ if (always_checksum) >+ pre_checksum = push_dir(argv[0]); >+ > flist = recv_file_list(f_in); > verbose = save_verbose; > if (!flist) { >@@ -674,6 +682,9 @@ static void do_server_recv(int f_in, int > } > the_file_list = flist; > >+ if (pre_checksum) >+ pop_dir(olddir); >+ > if (argc > 0) { > if (strcmp(dir,".")) { > argv[0] += strlen(dir); >@@ -728,6 +739,7 @@ int client_run(int f_in, int f_out, pid_ > { > struct file_list *flist = NULL; > int status = 0, status2 = 0; >+ char olddir[sizeof curr_dir]; > char *local_name = NULL; > > cleanup_child_pid = pid; >@@ -799,11 +811,18 @@ int client_run(int f_in, int f_out, pid_ > filesfrom_fd = -1; > } > >+ strlcpy(olddir, curr_dir, sizeof olddir); >+ if (always_checksum) >+ pre_checksum = push_dir(argv[0]); >+ > if (write_batch && !am_server) > start_write_batch(f_in); > flist = recv_file_list(f_in); > the_file_list = flist; > >+ if (pre_checksum) >+ pop_dir(olddir); >+ > if (flist && flist->count > 0) { > local_name = get_local_name(flist, argv[0]); > >--- rsync.h 29 Jul 2005 18:31:03 -0000 1.265 >+++ rsync.h 15 Sep 2005 23:19:00 -0000 >@@ -64,6 +64,7 @@ > #define FLAG_DEL_HERE (1<<3) /* receiver/generator */ > #define FLAG_SENT (1<<3) /* sender */ > #define FLAG_HLINK_TOL (1<<4) /* receiver/generator */ >+#define FLAG_SUM_DIFFERS (1<<5) /* receiver/generator */ > > /* update this if you make incompatible changes */ > #define PROTOCOL_VERSION 29
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 3099
:
1448
|
1452