From: Andre Noll Date: Tue, 14 Nov 2017 02:19:58 +0000 (+0100) Subject: Fix compute_next_snapshot_time(). X-Git-Tag: v1.0.0~3 X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=commitdiff_plain;h=7a6ff706b99f35a3f4f1ee116f49827dbdf15c64;hp=be3b0326d868aed97fc4224dcbf0266c303d2871 Fix compute_next_snapshot_time(). The function computes the average idle time between snapshots and adds this value to the completion time of the last snapshot to obtain the start time for the next snapshot. However, if the last snapshot happens to be incomplete, its completion time is set to -1. Hence the computed next snapshot time is going to be in the past, so we start the next snapshot immediately. Although this is incorrect, the bug is benign because the correct next snapshot time should also be in the past since we decided earlier to create the snapshot which was now found incomplete. Fix this by using the completion time of the last _complete_ snapshot instead. --- diff --git a/dss.c b/dss.c index ffbf500..9390f48 100644 --- a/dss.c +++ b/dss.c @@ -413,7 +413,8 @@ static void dss_get_snapshot_list(struct snapshot_list *sl) static int64_t compute_next_snapshot_time(void) { int64_t x = 0, now = get_current_time(), unit_interval - = 24 * 3600 * OPT_UINT32_VAL(DSS, UNIT_INTERVAL), ret; + = 24 * 3600 * OPT_UINT32_VAL(DSS, UNIT_INTERVAL), ret, + last_completion_time; unsigned wanted = desired_number_of_snapshots(0, OPT_UINT32_VAL(DSS, NUM_INTERVALS)), num_complete = 0; @@ -427,6 +428,7 @@ static int64_t compute_next_snapshot_time(void) continue; num_complete++; x += s->completion_time - s->creation_time; + last_completion_time = s->completion_time; } assert(x >= 0); @@ -436,7 +438,7 @@ static int64_t compute_next_snapshot_time(void) x /= num_complete; /* avg time to create one snapshot */ if (unit_interval < x * wanted) /* oops, no sleep at all */ goto out; - ret = s->completion_time + unit_interval / wanted - x; + ret = last_completion_time + unit_interval / wanted - x; out: free_snapshot_list(&sl); return ret;