rrdset_strncpyz_name(filename, id, FILENAME_MAX);
snprintfz(fullfilename, FILENAME_MAX, "%s/%s.db", st->cache_dir, filename);
- if(st->rrd_memory_mode != RRD_MEMORY_MODE_RAM) {
+ 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
rd->id = NULL;
rd->name = NULL;
rd->cache_filename = NULL;
- rd->flags = 0x00000000;
rd->variables = NULL;
rd->next = NULL;
rd->rrdset = NULL;
if(unlikely(!rd)) {
// if we didn't manage to get a mmap'd dimension, just create one
rd = callocz(1, size);
- rd->rrd_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->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);
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));