X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=blobdiff_plain;f=dss.c;h=c64156188bc753f7ee264f7434db1e254bbbc8f2;hp=3a2f46886c310f23b987665854c99e75334e44b0;hb=bc13db9debf825347d397c292e075cbe3f804ac0;hpb=19982b7b17a603bd4a0b47c724b4e830daaf88d9 diff --git a/dss.c b/dss.c index 3a2f468..c641561 100644 --- a/dss.c +++ b/dss.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2011 Andre Noll + * Copyright (C) 2008-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -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) @@ -1512,6 +1520,7 @@ int main(int argc, char **argv) if (ret < 0) goto out; ret = call_command_handler(); + signal_shutdown(); out: if (ret < 0) DSS_EMERG_LOG(("%s\n", dss_strerror(-ret)));