X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=blobdiff_plain;f=dss.c;h=9f39324500ffa915af5e0c593ae7d56d40eb5062;hp=354bdb847095d0dd2b6a2346b9bdceaae7977d0d;hb=b76728084d7b36d55e08764c9de42ad59fd6f6fd;hpb=42263e3bce7826703a531d0113d706fe3f3536a4 diff --git a/dss.c b/dss.c index 354bdb8..9f39324 100644 --- a/dss.c +++ b/dss.c @@ -531,17 +531,25 @@ static struct snapshot *find_outdated_snapshot(struct snapshot_list *sl) static struct snapshot *find_oldest_removable_snapshot(struct snapshot_list *sl) { - int i; - struct snapshot *s; + int i, num_complete; + struct snapshot *s, *ref = NULL; + + num_complete = num_complete_snapshots(sl); + if (num_complete <= conf.min_complete_arg) + return NULL; FOR_EACH_SNAPSHOT(s, i, sl) { if (snapshot_is_being_created(s)) continue; - if (is_reference_snapshot(s)) + if (is_reference_snapshot(s)) { /* avoid this one */ + ref = s; continue; + } DSS_INFO_LOG(("oldest removable snapshot: %s\n", s->name)); return s; } - return NULL; + assert(ref); + DSS_WARNING_LOG(("removing reference snapshot %s\n", ref->name)); + return ref; } static int rename_incomplete_snapshot(int64_t start) @@ -939,8 +947,9 @@ static int check_config(void) return -E_INVALID_NUMBER; } DSS_DEBUG_LOG(("unit interval: %i day(s)\n", conf.unit_interval_arg)); - if (conf.num_intervals_arg <= 0) { - DSS_ERROR_LOG(("bad number of intervals %i\n", conf.num_intervals_arg)); + if (conf.num_intervals_arg <= 0 || conf.num_intervals_arg > 30) { + DSS_ERROR_LOG(("bad number of intervals: %i\n", + conf.num_intervals_arg)); return -E_INVALID_NUMBER; } DSS_DEBUG_LOG(("number of intervals: %i\n", conf.num_intervals_arg)); @@ -1037,6 +1046,13 @@ static int handle_sighup(void) return change_to_dest_dir(); } +static void kill_children(void) +{ + restart_create_process(); + dss_kill(create_pid, SIGTERM, NULL); + dss_kill(remove_pid, SIGTERM, NULL); +} + static int handle_signal(void) { int sig, ret = next_signal(); @@ -1047,9 +1063,7 @@ static int handle_signal(void) switch (sig) { case SIGINT: case SIGTERM: - restart_create_process(); - dss_kill(create_pid, SIGTERM, NULL); - dss_kill(remove_pid, SIGTERM, NULL); + kill_children(); ret = -E_SIGNAL; break; case SIGHUP: @@ -1147,7 +1161,7 @@ static void create_rsync_argv(char ***argv, int64_t *num) *argv = dss_malloc((15 + conf.rsync_option_given) * sizeof(char *)); (*argv)[i++] = dss_strdup("rsync"); - (*argv)[i++] = dss_strdup("-aq"); + (*argv)[i++] = dss_strdup("-a"); (*argv)[i++] = dss_strdup("--delete"); for (j = 0; j < conf.rsync_option_given; j++) (*argv)[i++] = dss_strdup(conf.rsync_option_arg[j]); @@ -1318,6 +1332,7 @@ static int com_run(void) ret = select_loop(); if (ret >= 0) /* impossible */ ret = -E_BUG; + kill_children(); exit_hook(ret); return ret; } @@ -1441,7 +1456,7 @@ static int com_ls(void) 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; }