]> arthur.barton.de Git - netdata.git/blobdiff - src/rrddim.c
Merge pull request #1998 from ktsaou/master
[netdata.git] / src / rrddim.c
index d2159372be0f44825920eea6451dc74f5f990f78..54a17522fda29a006d312368a485f08562ae20b8 100644 (file)
@@ -43,7 +43,7 @@ inline void rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name) {
 
     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);
@@ -55,7 +55,7 @@ inline void rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name) {
 
 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;
     }
@@ -71,20 +71,18 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_numbe
     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);
@@ -124,13 +122,17 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_numbe
                 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;
@@ -143,25 +145,27 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_numbe
     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;
@@ -175,7 +179,7 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_numbe
     rd->rrdset = st;
 
     // append this dimension
-    pthread_rwlock_wrlock(&st->rwlock);
+    rrdset_wrlock(st);
     if(!st->dimensions)
         st->dimensions = rd;
     else {
@@ -190,7 +194,7 @@ RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, collected_numbe
         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);
@@ -227,7 +231,7 @@ void rrddim_free(RRDSET *st, RRDDIM *rd)
 
     // 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);
@@ -240,6 +244,7 @@ void rrddim_free(RRDSET *st, RRDDIM *rd)
             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);
@@ -288,8 +293,9 @@ inline collected_number rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_
 
     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));