Commit a800434a authored by Andrew Tridgell's avatar Andrew Tridgell

added --stats option for verbose stats on the file transfer

parent 3b3c3d43
...@@ -21,12 +21,13 @@ ...@@ -21,12 +21,13 @@
#include "rsync.h" #include "rsync.h"
extern struct stats stats;
extern int csum_length; extern int csum_length;
extern int verbose; extern int verbose;
extern int am_server; extern int am_server;
extern int always_checksum; extern int always_checksum;
extern int64 total_size;
extern int cvs_exclude; extern int cvs_exclude;
...@@ -421,7 +422,7 @@ static struct file_struct *make_file(char *fname) ...@@ -421,7 +422,7 @@ static struct file_struct *make_file(char *fname)
} }
if (!S_ISDIR(st.st_mode)) if (!S_ISDIR(st.st_mode))
total_size += st.st_size; stats.total_size += st.st_size;
return file; return file;
} }
...@@ -525,12 +526,15 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) ...@@ -525,12 +526,15 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
char *p,*dir; char *p,*dir;
char lastpath[MAXPATHLEN]=""; char lastpath[MAXPATHLEN]="";
struct file_list *flist; struct file_list *flist;
int64 start_write;
if (verbose && recurse && !am_server && f != -1) { if (verbose && recurse && !am_server && f != -1) {
rprintf(FINFO,"building file list ... "); rprintf(FINFO,"building file list ... ");
rflush(FINFO); rflush(FINFO);
} }
start_write = stats.total_written;
flist = (struct file_list *)malloc(sizeof(flist[0])); flist = (struct file_list *)malloc(sizeof(flist[0]));
if (!flist) out_of_memory("send_file_list"); if (!flist) out_of_memory("send_file_list");
...@@ -651,6 +655,8 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) ...@@ -651,6 +655,8 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
if (f != -1) { if (f != -1) {
io_end_buffering(f); io_end_buffering(f);
stats.flist_size = stats.total_written - start_write;
stats.num_files = flist->count;
} }
if (verbose > 2) if (verbose > 2)
...@@ -664,12 +670,15 @@ struct file_list *recv_file_list(int f) ...@@ -664,12 +670,15 @@ struct file_list *recv_file_list(int f)
{ {
struct file_list *flist; struct file_list *flist;
unsigned char flags; unsigned char flags;
int64 start_read;
if (verbose && recurse && !am_server) { if (verbose && recurse && !am_server) {
rprintf(FINFO,"receiving file list ... "); rprintf(FINFO,"receiving file list ... ");
rflush(FINFO); rflush(FINFO);
} }
start_read = stats.total_read;
flist = (struct file_list *)malloc(sizeof(flist[0])); flist = (struct file_list *)malloc(sizeof(flist[0]));
if (!flist) if (!flist)
goto oom; goto oom;
...@@ -700,7 +709,7 @@ struct file_list *recv_file_list(int f) ...@@ -700,7 +709,7 @@ struct file_list *recv_file_list(int f)
receive_file_entry(&flist->files[i],flags,f); receive_file_entry(&flist->files[i],flags,f);
if (S_ISREG(flist->files[i]->mode)) if (S_ISREG(flist->files[i]->mode))
total_size += flist->files[i]->length; stats.total_size += flist->files[i]->length;
flist->count++; flist->count++;
...@@ -731,6 +740,9 @@ struct file_list *recv_file_list(int f) ...@@ -731,6 +740,9 @@ struct file_list *recv_file_list(int f)
if (verbose > 2) if (verbose > 2)
rprintf(FINFO,"recv_file_list done\n"); rprintf(FINFO,"recv_file_list done\n");
stats.flist_size = stats.total_read - start_read;
stats.num_files = flist->count;
return flist; return flist;
oom: oom:
......
...@@ -24,9 +24,6 @@ ...@@ -24,9 +24,6 @@
*/ */
#include "rsync.h" #include "rsync.h"
static int64 total_written;
static int64 total_read;
static int io_multiplexing_out; static int io_multiplexing_out;
static int io_multiplexing_in; static int io_multiplexing_in;
static int multiplex_in_fd; static int multiplex_in_fd;
...@@ -35,17 +32,7 @@ static time_t last_io; ...@@ -35,17 +32,7 @@ static time_t last_io;
static int eof_error=1; static int eof_error=1;
extern int verbose; extern int verbose;
extern int io_timeout; extern int io_timeout;
extern struct stats stats;
int64 write_total(void)
{
return total_written;
}
int64 read_total(void)
{
return total_read;
}
static int buffer_f_in = -1; static int buffer_f_in = -1;
...@@ -108,6 +95,7 @@ static int read_timeout(int fd, char *buf, int len) ...@@ -108,6 +95,7 @@ static int read_timeout(int fd, char *buf, int len)
n = read(fd, buf, len); n = read(fd, buf, len);
if (n > 0) { if (n > 0) {
stats.total_read += n;
buf += n; buf += n;
len -= n; len -= n;
ret += n; ret += n;
...@@ -267,7 +255,6 @@ int32 read_int(int f) ...@@ -267,7 +255,6 @@ int32 read_int(int f)
{ {
char b[4]; char b[4];
readfd(f,b,4); readfd(f,b,4);
total_read += 4;
return IVAL(b,0); return IVAL(b,0);
} }
...@@ -286,7 +273,6 @@ int64 read_longint(int f) ...@@ -286,7 +273,6 @@ int64 read_longint(int f)
#else #else
if (remote_version >= 16) { if (remote_version >= 16) {
readfd(f,b,8); readfd(f,b,8);
total_read += 8;
ret = IVAL(b,0) | (((int64)IVAL(b,4))<<32); ret = IVAL(b,0) | (((int64)IVAL(b,4))<<32);
} }
#endif #endif
...@@ -297,7 +283,6 @@ int64 read_longint(int f) ...@@ -297,7 +283,6 @@ int64 read_longint(int f)
void read_buf(int f,char *buf,int len) void read_buf(int f,char *buf,int len)
{ {
readfd(f,buf,len); readfd(f,buf,len);
total_read += len;
} }
void read_sbuf(int f,char *buf,int len) void read_sbuf(int f,char *buf,int len)
...@@ -368,6 +353,8 @@ static void writefd_unbuffered(int fd,char *buf,int len) ...@@ -368,6 +353,8 @@ static void writefd_unbuffered(int fd,char *buf,int len)
} }
total += ret; total += ret;
stats.total_written += ret;
if (io_timeout) if (io_timeout)
last_io = time(NULL); last_io = time(NULL);
continue; continue;
...@@ -446,7 +433,6 @@ void write_int(int f,int32 x) ...@@ -446,7 +433,6 @@ void write_int(int f,int32 x)
char b[4]; char b[4];
SIVAL(b,0,x); SIVAL(b,0,x);
writefd(f,b,4); writefd(f,b,4);
total_written += 4;
} }
void write_longint(int f, int64 x) void write_longint(int f, int64 x)
...@@ -464,13 +450,11 @@ void write_longint(int f, int64 x) ...@@ -464,13 +450,11 @@ void write_longint(int f, int64 x)
SIVAL(b,4,((x>>32)&0xFFFFFFFF)); SIVAL(b,4,((x>>32)&0xFFFFFFFF));
writefd(f,b,8); writefd(f,b,8);
total_written += 8;
} }
void write_buf(int f,char *buf,int len) void write_buf(int f,char *buf,int len)
{ {
writefd(f,buf,len); writefd(f,buf,len);
total_written += len;
} }
/* write a string to the connection */ /* write a string to the connection */
......
...@@ -20,7 +20,8 @@ ...@@ -20,7 +20,8 @@
#include "rsync.h" #include "rsync.h"
time_t starttime = 0; time_t starttime = 0;
int64 total_size = 0;
struct stats stats;
extern int csum_length; extern int csum_length;
...@@ -28,16 +29,17 @@ extern int verbose; ...@@ -28,16 +29,17 @@ extern int verbose;
static void report(int f) static void report(int f)
{ {
int64 in,out,tsize;
time_t t = time(NULL); time_t t = time(NULL);
extern int am_server; extern int am_server;
extern int am_sender; extern int am_sender;
extern int am_daemon; extern int am_daemon;
extern int do_stats;
if (am_daemon) { if (am_daemon) {
syslog(LOG_INFO,"wrote %.0f bytes read %.0f bytes total size %.0f\n", syslog(LOG_INFO,"wrote %.0f bytes read %.0f bytes total size %.0f\n",
(double)write_total(),(double)read_total(), (double)stats.total_written,
(double)total_size); (double)stats.total_read,
(double)stats.total_size);
if (f == -1 || !am_sender) return; if (f == -1 || !am_sender) return;
} }
...@@ -46,26 +48,46 @@ static void report(int f) ...@@ -46,26 +48,46 @@ static void report(int f)
if (am_server && !am_sender) return; if (am_server && !am_sender) return;
if (am_server && am_sender) { if (am_server && am_sender) {
write_longint(f,read_total()); write_longint(f,stats.total_read);
write_longint(f,write_total()); write_longint(f,stats.total_written);
write_longint(f,total_size); write_longint(f,stats.total_size);
return; return;
} }
if (am_sender) { if (!am_sender) {
in = read_total(); int64 r;
out = write_total(); stats.total_written = read_longint(f);
tsize = total_size; r = read_longint(f);
} else { stats.total_size = read_longint(f);
out = read_longint(f); stats.total_read = r;
in = read_longint(f); }
tsize = read_longint(f);
if (do_stats) {
printf("\nNumber of files: %d\n", stats.num_files);
printf("Number of files transferred: %d\n",
stats.num_transferred_files);
printf("Total file size: %.0f bytes\n",
(double)stats.total_size);
printf("Total transferred file size: %.0f bytes\n",
(double)stats.total_transferred_size);
printf("Literal data: %.0f bytes\n",
(double)stats.literal_data);
printf("Matched data: %.0f bytes\n",
(double)stats.matched_data);
printf("File list size: %d\n", stats.flist_size);
printf("Total bytes written: %.0f\n",
(double)stats.total_written);
printf("Total bytes read: %.0f\n\n",
(double)stats.total_read);
} }
printf("wrote %.0f bytes read %.0f bytes %.2f bytes/sec\n", printf("wrote %.0f bytes read %.0f bytes %.2f bytes/sec\n",
(double)out,(double)in,(in+out)/(0.5 + (t-starttime))); (double)stats.total_written,
(double)stats.total_read,
(stats.total_written+stats.total_read)/(0.5 + (t-starttime)));
printf("total size is %.0f speedup is %.2f\n", printf("total size is %.0f speedup is %.2f\n",
(double)tsize,(1.0*tsize)/(in+out)); (double)stats.total_size,
(1.0*stats.total_size)/(stats.total_written+stats.total_read));
} }
...@@ -498,6 +520,8 @@ int main(int argc,char *argv[]) ...@@ -498,6 +520,8 @@ int main(int argc,char *argv[])
starttime = time(NULL); starttime = time(NULL);
am_root = (getuid() == 0); am_root = (getuid() == 0);
memset(&stats, 0, sizeof(stats));
if (argc < 2) { if (argc < 2) {
usage(FERROR); usage(FERROR);
exit_cleanup(1); exit_cleanup(1);
......
...@@ -34,13 +34,13 @@ typedef unsigned short tag; ...@@ -34,13 +34,13 @@ typedef unsigned short tag;
static int false_alarms; static int false_alarms;
static int tag_hits; static int tag_hits;
static int matches; static int matches;
static int data_transfer; static int64 data_transfer;
static int total_false_alarms; static int total_false_alarms;
static int total_tag_hits; static int total_tag_hits;
static int total_matches; static int total_matches;
static int64 total_data_transfer;
extern struct stats stats;
struct target { struct target {
tag t; tag t;
...@@ -103,8 +103,10 @@ static void matched(int f,struct sum_struct *s,struct map_struct *buf, ...@@ -103,8 +103,10 @@ static void matched(int f,struct sum_struct *s,struct map_struct *buf,
send_token(f,i,buf,last_match,n,i<0?0:s->sums[i].len); send_token(f,i,buf,last_match,n,i<0?0:s->sums[i].len);
data_transfer += n; data_transfer += n;
if (i >= 0) if (i >= 0) {
stats.matched_data += s->sums[i].len;
n += s->sums[i].len; n += s->sums[i].len;
}
for (j=0;j<n;j+=CHUNK_SIZE) { for (j=0;j<n;j+=CHUNK_SIZE) {
int n1 = MIN(CHUNK_SIZE,n-j); int n1 = MIN(CHUNK_SIZE,n-j);
...@@ -273,7 +275,7 @@ void match_sums(int f,struct sum_struct *s,struct map_struct *buf,OFF_T len) ...@@ -273,7 +275,7 @@ void match_sums(int f,struct sum_struct *s,struct map_struct *buf,OFF_T len)
total_tag_hits += tag_hits; total_tag_hits += tag_hits;
total_false_alarms += false_alarms; total_false_alarms += false_alarms;
total_matches += matches; total_matches += matches;
total_data_transfer += data_transfer; stats.literal_data += data_transfer;
} }
void match_report(void) void match_report(void)
...@@ -282,7 +284,8 @@ void match_report(void) ...@@ -282,7 +284,8 @@ void match_report(void)
return; return;
rprintf(FINFO, rprintf(FINFO,
"total: matches=%d tag_hits=%d false_alarms=%d data=%ld\n", "total: matches=%d tag_hits=%d false_alarms=%d data=%.0f\n",
total_matches,total_tag_hits, total_matches,total_tag_hits,
total_false_alarms,(long)total_data_transfer); total_false_alarms,
(double)stats.literal_data);
} }
...@@ -55,6 +55,7 @@ int am_sender=0; ...@@ -55,6 +55,7 @@ int am_sender=0;
int recurse = 0; int recurse = 0;
int am_daemon=0; int am_daemon=0;
int am_client=0; int am_client=0;
int do_stats=0;
int block_size=BLOCK_SIZE; int block_size=BLOCK_SIZE;
...@@ -115,7 +116,8 @@ void usage(int F) ...@@ -115,7 +116,8 @@ void usage(int F)
rprintf(F," --version print version number\n"); rprintf(F," --version print version number\n");
rprintf(F," --daemon run as a rsync daemon\n"); rprintf(F," --daemon run as a rsync daemon\n");
rprintf(F," --config FILE specify alternate rsyncd.conf file\n"); rprintf(F," --config FILE specify alternate rsyncd.conf file\n");
rprintf(F," --port PORT specify alternate rsyncd port number\n"); rprintf(F," --port PORT specify alternate rsyncd port number\n");
rprintf(F," --stats give some file transfer stats\n");
rprintf(F,"\n"); rprintf(F,"\n");
rprintf(F,"the backup suffix defaults to %s\n",BACKUP_SUFFIX); rprintf(F,"the backup suffix defaults to %s\n",BACKUP_SUFFIX);
...@@ -125,7 +127,7 @@ void usage(int F) ...@@ -125,7 +127,7 @@ void usage(int F)
enum {OPT_VERSION,OPT_SUFFIX,OPT_SENDER,OPT_SERVER,OPT_EXCLUDE, enum {OPT_VERSION,OPT_SUFFIX,OPT_SENDER,OPT_SERVER,OPT_EXCLUDE,
OPT_EXCLUDE_FROM,OPT_DELETE,OPT_NUMERIC_IDS,OPT_RSYNC_PATH, OPT_EXCLUDE_FROM,OPT_DELETE,OPT_NUMERIC_IDS,OPT_RSYNC_PATH,
OPT_FORCE,OPT_TIMEOUT,OPT_DAEMON,OPT_CONFIG,OPT_PORT, OPT_FORCE,OPT_TIMEOUT,OPT_DAEMON,OPT_CONFIG,OPT_PORT,
OPT_INCLUDE, OPT_INCLUDE_FROM}; OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_STATS};
static char *short_options = "oblLWHpguDCtcahvrRIxnSe:B:T:z"; static char *short_options = "oblLWHpguDCtcahvrRIxnSe:B:T:z";
...@@ -170,6 +172,7 @@ static struct option long_options[] = { ...@@ -170,6 +172,7 @@ static struct option long_options[] = {
{"temp-dir", 1, 0, 'T'}, {"temp-dir", 1, 0, 'T'},
{"compress", 0, 0, 'z'}, {"compress", 0, 0, 'z'},
{"daemon", 0, 0, OPT_DAEMON}, {"daemon", 0, 0, OPT_DAEMON},
{"stats", 0, 0, OPT_STATS},
{"config", 1, 0, OPT_CONFIG}, {"config", 1, 0, OPT_CONFIG},
{"port", 1, 0, OPT_PORT}, {"port", 1, 0, OPT_PORT},
{0,0,0,0}}; {0,0,0,0}};
...@@ -364,6 +367,10 @@ void parse_arguments(int argc, char *argv[]) ...@@ -364,6 +367,10 @@ void parse_arguments(int argc, char *argv[])
am_daemon = 1; am_daemon = 1;
break; break;
case OPT_STATS:
do_stats = 1;
break;
case OPT_CONFIG: case OPT_CONFIG:
config_file = optarg; config_file = optarg;
break; break;
......
This diff is collapsed.
...@@ -280,9 +280,9 @@ struct file_struct { ...@@ -280,9 +280,9 @@ struct file_struct {
}; };
struct file_list { struct file_list {
int count; int count;
int malloced; int malloced;
struct file_struct **files; struct file_struct **files;
}; };
struct sum_buf { struct sum_buf {
...@@ -316,6 +316,18 @@ struct exclude_struct { ...@@ -316,6 +316,18 @@ struct exclude_struct {
int local; int local;
}; };
struct stats {
int64 total_size;
int64 total_transferred_size;
int64 total_written;
int64 total_read;
int64 literal_data;
int64 matched_data;
int flist_size;
int num_files;
int num_transferred_files;
};
/* we need this function because of the silly way in which duplicate /* we need this function because of the silly way in which duplicate
entries are handled in the file lists - we can't change this entries are handled in the file lists - we can't change this
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment