From b088b70f8256a135a3aec77962b72f0c68663f83 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Wed, 31 Aug 2011 18:36:10 +0200 Subject: [PATCH] Check sample ordering on accumulation If the newly accumulated sample is not newer than than the last one, discard the source history and start from scratch. This can happen after loading an invalid dump or when the system clock was stepped. --- sourcestats.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sourcestats.c b/sourcestats.c index 88e9911..c648dc9 100644 --- a/sourcestats.c +++ b/sourcestats.c @@ -239,10 +239,19 @@ SST_AccumulateSample(SST_Stats inst, struct timeval *sample_time, { int n, m; + /* Make room for the new sample */ if (inst->n_samples == MAX_SAMPLES) { prune_register(inst, 1); } + /* Make sure it's newer than the last sample */ + if (inst->n_samples && + UTI_CompareTimevals(&inst->sample_times[inst->last_sample], sample_time) >= 0) { + LOG(LOGS_WARN, LOGF_SourceStats, "Out of order sample detected, discarding history for %s", + inst->ip_addr ? UTI_IPToString(inst->ip_addr) : UTI_RefidToString(inst->refid)); + prune_register(inst, inst->n_samples); + } + n = inst->last_sample = (inst->last_sample + 1) % (MAX_SAMPLES * REGRESS_RUNS_RATIO); m = n % MAX_SAMPLES;