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.
This commit is contained in:
Miroslav Lichvar 2011-08-31 18:36:10 +02:00
parent fbbb6bbc00
commit b088b70f82

View file

@ -239,10 +239,19 @@ SST_AccumulateSample(SST_Stats inst, struct timeval *sample_time,
{ {
int n, m; int n, m;
/* Make room for the new sample */
if (inst->n_samples == MAX_SAMPLES) { if (inst->n_samples == MAX_SAMPLES) {
prune_register(inst, 1); 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) % n = inst->last_sample = (inst->last_sample + 1) %
(MAX_SAMPLES * REGRESS_RUNS_RATIO); (MAX_SAMPLES * REGRESS_RUNS_RATIO);
m = n % MAX_SAMPLES; m = n % MAX_SAMPLES;