Skip to content

Commit

Permalink
attempt to avoid resetting database files loaded from disk and be mor…
Browse files Browse the repository at this point in the history
…e descriptive when a reset is required
  • Loading branch information
ktsaou committed Jun 22, 2017
1 parent bd67a79 commit be9dae3
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 27 deletions.
2 changes: 2 additions & 0 deletions src/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
44 changes: 23 additions & 21 deletions src/rrddim.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 0 additions & 6 deletions src/rrdset.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down

0 comments on commit be9dae3

Please sign in to comment.