X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/1b1fef20b3c200069314aaa40d61b6a819b93c31..3221f451a0d8deffcfe677a9d39ca2f6d7b43cc2:/generator.c diff --git a/generator.c b/generator.c index 5bad8a55..e91a3c0a 100644 --- a/generator.c +++ b/generator.c @@ -52,6 +52,7 @@ extern int ignore_times; extern int size_only; extern OFF_T max_size; extern int io_timeout; +extern int ignore_timeout; extern int protocol_version; extern int fuzzy_basis; extern int always_checksum; @@ -89,12 +90,14 @@ static int unchanged_attrs(struct file_struct *file, STRUCT_STAT *st) #define SID_UPDATING ITEM_UPDATING #define SID_REPORT_CHECKSUM ITEM_REPORT_CHECKSUM +#define SID_USING_ALT_BASIS ITEM_USING_ALT_BASIS +/* This flag doesn't get sent, so it must be outside 0xffff. */ #define SID_NO_DEST_AND_NO_UPDATE (1<<16) static void itemize(struct file_struct *file, int statret, STRUCT_STAT *st, int32 sflags, int f_out, int ndx) { - int iflags = sflags & (SID_UPDATING | SID_REPORT_CHECKSUM); + int iflags = sflags & 0xffff; if (statret >= 0) { if (S_ISREG(file->mode) && file->length != st->st_size) @@ -821,11 +824,12 @@ prepare_to_open: notify_others: write_int(f_out, ndx); if (itemizing) { - itemize(file, statret, &st, SID_UPDATING - | (always_checksum ? SID_REPORT_CHECKSUM : 0), - f_out, -1); - if (inplace && !read_batch) - write_byte(f_out, fnamecmp_type); + int iflags = SID_UPDATING; + if (always_checksum) + iflags |= SID_REPORT_CHECKSUM; + if (fnamecmp_type != FNAMECMP_FNAME) + iflags |= SID_USING_ALT_BASIS; + itemize(file, statret, &st, iflags, f_out, -1); } if (f_out_name >= 0) { write_byte(f_out_name, fnamecmp_type); @@ -878,6 +882,7 @@ void generate_files(int f_out, struct file_list *flist, char *local_name, int need_retouch_dir_perms = 0; int save_only_existing = only_existing; int save_opt_ignore_existing = opt_ignore_existing; + int allowed_lull = protocol_version >= 29 ? io_timeout / 2 : 0; if (verbose > 2) { rprintf(FINFO, "generator starting pid=%ld count=%d\n", @@ -891,9 +896,8 @@ void generate_files(int f_out, struct file_list *flist, char *local_name, : "enabled"); } - /* We expect to just sit around now, so don't exit on a timeout. - * If we really get a timeout then the other process should exit. */ - io_timeout = 0; + if (protocol_version < 29) + io_timeout = 0; /* kluge for older protocol versions */ for (i = 0; i < flist->count; i++) { struct file_struct *file = flist->files[i]; @@ -914,6 +918,9 @@ void generate_files(int f_out, struct file_list *flist, char *local_name, recv_generator(local_name ? local_name : f_name_to(file, fbuf), flist, file, i, f_out, f_out_name); + + if (allowed_lull && !(i % 100)) + maybe_send_keepalive(allowed_lull, flist->count); } recv_generator(NULL, NULL, NULL, 0, -1, -1); if (delete_during) @@ -925,6 +932,10 @@ void generate_files(int f_out, struct file_list *flist, char *local_name, update_only = always_checksum = size_only = 0; ignore_times = 1; + /* We expect to just sit around now, so don't exit on a timeout. + * If we really get a timeout then the other process should exit. */ + ignore_timeout = 1; + if (verbose > 2) rprintf(FINFO,"generate_files phase=%d\n",phase); @@ -936,6 +947,8 @@ void generate_files(int f_out, struct file_list *flist, char *local_name, struct file_struct *file = flist->files[i]; recv_generator(local_name ? local_name : f_name_to(file, fbuf), flist, file, i, f_out, f_out_name); + if (allowed_lull) + maybe_send_keepalive(allowed_lull, flist->count); } phase++;