From be9dae3bf82cdb7cef30648ac45211a5ab751c04 Mon Sep 17 00:00:00 2001 From: "Costa Tsaousis (ktsaou)" Date: Thu, 22 Jun 2017 14:09:40 +0300 Subject: [PATCH] attempt to avoid resetting database files loaded from disk and be more descriptive when a reset is required --- src/common.c | 2 ++ src/rrddim.c | 44 +++++++++++++++++++++++--------------------- src/rrdset.c | 6 ------ 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/common.c b/src/common.c index f954923a5f3126..aa75c198d27ef3 100644 --- a/src/common.c +++ b/src/common.c @@ -1070,6 +1070,8 @@ void *mymmap(const char *filename, size_t size, int flags, int ksm) { mem = memory_file_mmap_ksm(filename, size, flags); if(mem == MAP_FAILED) return NULL; + + errno = 0; return mem; } diff --git a/src/rrddim.c b/src/rrddim.c index d834b5158f76f1..8fd99c1df7c0f1 100644 --- a/src/rrddim.c +++ b/src/rrddim.c @@ -134,41 +134,43 @@ RRDDIM *rrddim_add_custom(RRDSET *st, const char *id, const char *name, collecte memset(rd, 0, size); } else { + int reset = 0; + if(strcmp(rd->magic, RRDDIMENSION_MAGIC) != 0) { - errno = 0; info("Initializing file %s.", fullfilename); memset(rd, 0, size); + reset = 1; } else if(rd->memsize != size) { - errno = 0; - error("File %s does not have the desired size. Clearing it.", fullfilename); - memset(rd, 0, size); - } - else if(rd->multiplier != multiplier) { - errno = 0; - error("File %s does not have the same multiplier. Clearing it.", fullfilename); - memset(rd, 0, size); - } - else if(rd->divisor != divisor) { - errno = 0; - error("File %s does not have the same divisor. Clearing it.", fullfilename); + error("File %s does not have the desired size, expected %lu but found %lu. Clearing it.", fullfilename, size, rd->memsize); memset(rd, 0, size); + reset = 1; } else if(rd->update_every != st->update_every) { - errno = 0; - error("File %s does not have the same refresh frequency. Clearing it.", fullfilename); + error("File %s does not have the same update frequency, expected %d but found %d. Clearing it.", fullfilename, st->update_every, rd->update_every); memset(rd, 0, size); + reset = 1; } else if(dt_usec(&now, &rd->last_collected_time) > (rd->entries * rd->update_every * USEC_PER_SEC)) { - errno = 0; - error("File %s is too old. Clearing it.", fullfilename); + error("File %s is too old (last collected %llu seconds ago, but the database is %ld seconds). Clearing it.", fullfilename, dt_usec(&now, &rd->last_collected_time) / USEC_PER_SEC, rd->entries * rd->update_every); memset(rd, 0, size); + reset = 1; } - if(rd->algorithm && rd->algorithm != algorithm) - error("File %s does not have the expected algorithm (expected %u '%s', found %u '%s'). Previous values may be wrong." - , fullfilename, algorithm, rrd_algorithm_name(algorithm), rd->algorithm, rrd_algorithm_name( - rd->algorithm)); + if(!reset) { + if(rd->algorithm != algorithm) { + info("File %s does not have the expected algorithm (expected %u '%s', found %u '%s'). Previous values may be wrong.", + fullfilename, algorithm, rrd_algorithm_name(algorithm), rd->algorithm, rrd_algorithm_name(rd->algorithm)); + } + + if(rd->multiplier != multiplier) { + info("File %s does not have the expected multiplier (expected " COLLECTED_NUMBER_FORMAT ", found " COLLECTED_NUMBER_FORMAT ". Previous values may be wrong.", fullfilename, multiplier, rd->multiplier); + } + + if(rd->divisor != divisor) { + info("File %s does not have the expected divisor (expected " COLLECTED_NUMBER_FORMAT ", found " COLLECTED_NUMBER_FORMAT ". Previous values may be wrong.", fullfilename, divisor, rd->divisor); + } + } } // make sure we have the right memory mode diff --git a/src/rrdset.c b/src/rrdset.c index 6cb7fa0f045e64..41b642ff909cb0 100644 --- a/src/rrdset.c +++ b/src/rrdset.c @@ -464,34 +464,28 @@ RRDSET *rrdset_create_custom( } else { if(strcmp(st->magic, RRDSET_MAGIC) != 0) { - errno = 0; info("Initializing file %s.", fullfilename); memset(st, 0, size); } else if(strcmp(st->id, fullid) != 0) { - errno = 0; error("File %s contents are not for chart %s. Clearing it.", fullfilename, fullid); // munmap(st, size); // st = NULL; memset(st, 0, size); } else if(st->memsize != size || st->entries != entries) { - errno = 0; error("File %s does not have the desired size. Clearing it.", fullfilename); memset(st, 0, size); } else if(st->update_every != update_every) { - errno = 0; error("File %s does not have the desired update frequency. Clearing it.", fullfilename); memset(st, 0, size); } else if((now - st->last_updated.tv_sec) > update_every * entries) { - errno = 0; error("File %s is too old. Clearing it.", fullfilename); memset(st, 0, size); } else if(st->last_updated.tv_sec > now + update_every) { - errno = 0; error("File %s refers to the future. Clearing it.", fullfilename); memset(st, 0, size); }