char varname[CONFIG_MAX_NAME + 1];
snprintfz(varname, CONFIG_MAX_NAME, "dim %s name", rd->id);
- rd->name = config_set_default(st->id, varname, name);
+ rd->name = config_set_default(st->config_section, varname, name);
rd->hash_name = simple_hash(rd->name);
rrddimvar_rename_all(rd);
RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_number multiplier, collected_number divisor, RRD_ALGORITHM algorithm) {
RRDDIM *rd = rrddim_find(st, id);
- if(rd) {
+ if(unlikely(rd)) {
debug(D_RRD_CALLS, "Cannot create rrd dimension '%s/%s', it already exists.", st->id, name?name:"<NONAME>");
return rd;
}
rrdset_strncpyz_name(filename, id, FILENAME_MAX);
snprintfz(fullfilename, FILENAME_MAX, "%s/%s.db", st->cache_dir, filename);
- if(st->rrdhost->rrd_memory_mode != RRD_MEMORY_MODE_RAM) {
- rd = (RRDDIM *)mymmap(fullfilename, size, ((st->rrdhost->rrd_memory_mode == RRD_MEMORY_MODE_MAP) ? MAP_SHARED : MAP_PRIVATE), 1);
+ if(st->rrd_memory_mode == RRD_MEMORY_MODE_SAVE || st->rrd_memory_mode == RRD_MEMORY_MODE_MAP) {
+ rd = (RRDDIM *)mymmap(fullfilename, size, ((st->rrd_memory_mode == RRD_MEMORY_MODE_MAP) ? MAP_SHARED : MAP_PRIVATE), 1);
if(likely(rd)) {
// we have a file mapped for rd
+ memset(&rd->avl, 0, sizeof(avl));
rd->id = NULL;
rd->name = NULL;
rd->cache_filename = NULL;
- rd->memory_mode = st->rrdhost->rrd_memory_mode;
- rd->flags = 0x00000000;
rd->variables = NULL;
rd->next = NULL;
rd->rrdset = NULL;
- memset(&rd->avl, 0, sizeof(avl));
struct timeval now;
now_realtime_timeval(&now);
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));
+
+ // make sure we have the right memory mode
+ // even if we cleared the memory
+ rd->rrd_memory_mode = st->rrd_memory_mode;
}
}
if(unlikely(!rd)) {
// if we didn't manage to get a mmap'd dimension, just create one
rd = callocz(1, size);
- rd->memory_mode = RRD_MEMORY_MODE_RAM;
+ rd->rrd_memory_mode = (st->rrd_memory_mode == RRD_MEMORY_MODE_NONE) ? RRD_MEMORY_MODE_NONE : RRD_MEMORY_MODE_RAM;
}
rd->memsize = size;
rd->cache_filename = strdupz(fullfilename);
snprintfz(varname, CONFIG_MAX_NAME, "dim %s name", rd->id);
- rd->name = config_get(st->id, varname, (name && *name)?name:rd->id);
+ rd->name = config_get(st->config_section, varname, (name && *name)?name:rd->id);
rd->hash_name = simple_hash(rd->name);
snprintfz(varname, CONFIG_MAX_NAME, "dim %s algorithm", rd->id);
- rd->algorithm = rrd_algorithm_id(config_get(st->id, varname, rrd_algorithm_name(algorithm)));
+ rd->algorithm = rrd_algorithm_id(config_get(st->config_section, varname, rrd_algorithm_name(algorithm)));
snprintfz(varname, CONFIG_MAX_NAME, "dim %s multiplier", rd->id);
- rd->multiplier = config_get_number(st->id, varname, multiplier);
+ rd->multiplier = config_get_number(st->config_section, varname, multiplier);
snprintfz(varname, CONFIG_MAX_NAME, "dim %s divisor", rd->id);
- rd->divisor = config_get_number(st->id, varname, divisor);
+ rd->divisor = config_get_number(st->config_section, varname, divisor);
if(!rd->divisor) rd->divisor = 1;
rd->entries = st->entries;
rd->update_every = st->update_every;
// prevent incremental calculation spikes
- rd->counter = 0;
- rrddim_flag_clear(rd, RRDDIM_FLAG_UPDATED);
+ rd->collections_counter = 0;
+ rd->updated = 0;
+ rd->flags = 0x00000000;
+
rd->calculated_value = 0;
rd->last_calculated_value = 0;
rd->collected_value = 0;
rd->rrdset = st;
// append this dimension
- pthread_rwlock_wrlock(&st->rwlock);
+ rrdset_wrlock(st);
if(!st->dimensions)
st->dimensions = rd;
else {
rrddimvar_create(rd, RRDVAR_TYPE_TIME_T, NULL, "_last_collected_t", &rd->last_collected_time.tv_sec, 0);
}
- pthread_rwlock_unlock(&st->rwlock);
+ rrdset_unlock(st);
if(unlikely(rrddim_index_add(st, rd) != rd))
error("RRDDIM: INTERNAL ERROR: attempt to index duplicate dimension '%s' on chart '%s'", rd->id, st->id);
// free(rd->annotations);
- switch(rd->memory_mode) {
+ switch(rd->rrd_memory_mode) {
case RRD_MEMORY_MODE_SAVE:
debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_filename);
savememory(rd->cache_filename, rd, rd->memsize);
munmap(rd, rd->memsize);
break;
+ case RRD_MEMORY_MODE_NONE:
case RRD_MEMORY_MODE_RAM:
debug(D_RRD_CALLS, "Removing dimension '%s'.", rd->name);
freez((void *)rd->id);
now_realtime_timeval(&rd->last_collected_time);
rd->collected_value = value;
- rrddim_flag_set(rd, RRDDIM_FLAG_UPDATED);
- rd->counter++;
+ rd->updated = 1;
+
+ rd->collections_counter++;
// fprintf(stderr, "%s.%s %llu " COLLECTED_NUMBER_FORMAT " dt %0.6f" " rate " CALCULATED_NUMBER_FORMAT "\n", st->name, rd->name, st->usec_since_last_update, value, (float)((double)st->usec_since_last_update / (double)1000000), (calculated_number)((value - rd->last_collected_value) * (calculated_number)rd->multiplier / (calculated_number)rd->divisor * 1000000.0 / (calculated_number)st->usec_since_last_update));