X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=blobdiff_plain;f=dss.c;h=c4349a84aa9dae70f4735bd25015568d37a72379;hp=af1326fd5ad4d7262814d85f3dbdb203c9736fb8;hb=a883830b42e84c58233efcf05c16e9aa4bb7597f;hpb=b8c18ccfb0dbe89c9a35d4989cd506b8461ea850 diff --git a/dss.c b/dss.c index af1326f..c4349a8 100644 --- a/dss.c +++ b/dss.c @@ -175,13 +175,13 @@ static void compute_next_snapshot_time(void) tmp.tv_sec = x; tmp.tv_usec = 0; ret = tv_diff(&unit_interval, &tmp, &diff); /* total sleep time per unit interval */ - gettimeofday(&now, NULL); - if (ret < 0 || !s) + if (ret < 0 || !s) /* unit_interval < tmp or no snapshot */ goto min_sleep; tv_divide(wanted, &diff, &tmp); /* sleep time betweeen two snapshots */ - diff.tv_sec = s->completion_time; + diff.tv_sec = s->completion_time; /* completion time of the the latest snaphot */ diff.tv_usec = 0; tv_add(&diff, &tmp, &next_snapshot_time); + gettimeofday(&now, NULL); if (tv_diff(&now, &next_snapshot_time, NULL) < 0) goto out; min_sleep: @@ -502,6 +502,8 @@ static int handle_rsync_exit(int status) DSS_WARNING_LOG("rsync process %d returned %d -- restarting\n", (int)rsync_pid, es); snapshot_creation_status = SCS_RSYNC_NEEDS_RESTART; + gettimeofday(&next_snapshot_time, NULL); + next_snapshot_time.tv_sec += 60; ret = 1; goto out; } @@ -693,6 +695,21 @@ out: return ret; } +/* + * We can not use rsync locally if the local user is different from the remote + * user or if the src dir is not on the local host (or both). + */ +static int use_rsync_locally(char *logname) +{ + char *h = conf.remote_host_arg; + + if (strcmp(h, "localhost") && strcmp(h, "127.0.0.1")) + return 0; + if (conf.remote_user_given && strcmp(conf.remote_user_arg, logname)) + return 0; + return 1; +} + static void create_rsync_argv(char ***argv, int64_t *num) { char *logname, *newest; @@ -716,7 +733,7 @@ static void create_rsync_argv(char ***argv, int64_t *num) } else DSS_INFO_LOG("no previous snapshot found\n"); logname = dss_logname(); - if (conf.remote_user_given && !strcmp(conf.remote_user_arg, logname)) + if (use_rsync_locally(logname)) (*argv)[i++] = dss_strdup(conf.source_dir_arg); else (*argv)[i++] = make_message("%s@%s:%s/", conf.remote_user_given? @@ -964,8 +981,12 @@ static int com_ls(void) struct snapshot *s; dss_get_snapshot_list(&sl); - FOR_EACH_SNAPSHOT(s, i, &sl) - dss_msg("%u\t%s\n", s->interval, s->name); + FOR_EACH_SNAPSHOT(s, i, &sl) { + int64_t d = 0; + if (s->flags & SS_COMPLETE) + d = (s->completion_time - s->creation_time) / 60; + dss_msg("%u\t%s\t%3" PRId64 ":%02" PRId64 "\n", s->interval, s->name, d/60, d%60); + }; free_snapshot_list(&sl); return 1; }