From: Andre Noll Date: Fri, 12 Dec 2014 13:21:53 +0000 (+0100) Subject: Merge branch 'refs/heads/t/min-complete' X-Git-Tag: v0.1.6~16 X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=commitdiff_plain;h=15eb99dcf9a30f8c8d488d5bc3c92130cf828d60;hp=7e93c92b8896690059fff7d6b56ba149ca182294 Merge branch 'refs/heads/t/min-complete' --- diff --git a/dss.c b/dss.c index 0ad7a35..006cd27 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) diff --git a/dss.ggo b/dss.ggo index ac7f5b7..9587dd2 100644 --- a/dss.ggo +++ b/dss.ggo @@ -439,3 +439,23 @@ details=" becomes low. Use this flag if the file system containing the destination directory is used for snapshots only. " + +option "min-complete" - +#~~~~~~~~~~~~~~~~~~~~~~ +"Minimal number of complete snapshots to keep" +int typestr = "num" +default = "1" +optional +details = " + This option is only relevant if snapshots must be deleted + because disk space gets low. + + dss refuses to remove old snapshots if there are fewer complete + snapshots left than the given number. The default value of one + guarantees that at least one complete snapshot is available + at all times. + + If only complete snapshot are left, and there is not + enough disk space available for another snapshot, the program + terminates with a \"No space left on device\" error. +" diff --git a/snap.c b/snap.c index 4dbb446..7c16d2e 100644 --- a/snap.c +++ b/snap.c @@ -232,3 +232,13 @@ __malloc char *name_of_newest_complete_snapshot(struct snapshot_list *sl) return name; } +int num_complete_snapshots(struct snapshot_list *sl) +{ + struct snapshot *s; + int i, ret = 0; + + FOR_EACH_SNAPSHOT(s, i, sl) + if (s->flags & SS_COMPLETE) + ret++; + return ret; +} diff --git a/snap.h b/snap.h index 8fee138..626ecad 100644 --- a/snap.h +++ b/snap.h @@ -88,6 +88,7 @@ __malloc char *incomplete_name(int64_t start); __malloc char *being_deleted_name(struct snapshot *s); int complete_name(int64_t start, int64_t end, char **result); __malloc char *name_of_newest_complete_snapshot(struct snapshot_list *sl); +int num_complete_snapshots(struct snapshot_list *sl); /** * Get the newest snapshot in a snapshot list.