]> arthur.barton.de Git - netdata.git/blobdiff - src/rrd.c
Merge pull request #643 from paulfantom/master
[netdata.git] / src / rrd.c
index 28efff0a15074992287fba30a053c58eb9974da9..dd7698ab8d443cbfd526e11f2512a45e20e15e33 100644 (file)
--- a/src/rrd.c
+++ b/src/rrd.c
@@ -277,7 +277,12 @@ char *rrdset_cache_dir(const char *id)
        char *ret = NULL;
 
        static char *cache_dir = NULL;
-       if(!cache_dir) cache_dir = config_get("global", "cache directory", CACHE_DIR);
+       if(!cache_dir) {
+               cache_dir = config_get("global", "cache directory", CACHE_DIR);
+               int r = mkdir(cache_dir, 0755);
+               if(r != 0 && errno != EEXIST)
+                       error("Cannot create directory '%s'", cache_dir);
+       }
 
        char b[FILENAME_MAX + 1];
        char n[FILENAME_MAX + 1];
@@ -855,7 +860,7 @@ unsigned long long rrdset_done(RRDSET *st)
                // calculate the proper last_collected_time, using usec_since_last_update
                unsigned long long ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec + st->usec_since_last_update;
                st->last_collected_time.tv_sec = (time_t) (ut / 1000000ULL);
-               st->last_collected_time.tv_usec = (useconds_t) (ut % 1000000ULL);
+               st->last_collected_time.tv_usec = (suseconds_t) (ut % 1000000ULL);
        }
 
        // if this set has not been updated in the past
@@ -865,7 +870,7 @@ unsigned long long rrdset_done(RRDSET *st)
                // set a fake last_updated, in the past using usec_since_last_update
                unsigned long long ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec - st->usec_since_last_update;
                st->last_updated.tv_sec = (time_t) (ut / 1000000ULL);
-               st->last_updated.tv_usec = (useconds_t) (ut % 1000000ULL);
+               st->last_updated.tv_usec = (suseconds_t) (ut % 1000000ULL);
 
                // the first entry should not be stored
                store_this_entry = 0;
@@ -876,7 +881,7 @@ unsigned long long rrdset_done(RRDSET *st)
 
        // check if we will re-write the entire data set
        if(unlikely(usecdiff(&st->last_collected_time, &st->last_updated) > st->update_every * st->entries * 1000000ULL)) {
-               info("%s: too old data (last updated at %zu.%zu, last collected at %zu.%zu). Reseting it. Will not store the next entry.", st->name, st->last_updated.tv_sec, st->last_updated.tv_usec, st->last_collected_time.tv_sec, st->last_collected_time.tv_usec);
+               info("%s: too old data (last updated at %ld.%ld, last collected at %ld.%ld). Reseting it. Will not store the next entry.", st->name, st->last_updated.tv_sec, st->last_updated.tv_usec, st->last_collected_time.tv_sec, st->last_collected_time.tv_usec);
                rrdset_reset(st);
 
                st->usec_since_last_update = st->update_every * 1000000ULL;
@@ -885,7 +890,7 @@ unsigned long long rrdset_done(RRDSET *st)
 
                unsigned long long ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec - st->usec_since_last_update;
                st->last_updated.tv_sec = (time_t) (ut / 1000000ULL);
-               st->last_updated.tv_usec = (useconds_t) (ut % 1000000ULL);
+               st->last_updated.tv_usec = (suseconds_t) (ut % 1000000ULL);
 
                // the first entry should not be stored
                store_this_entry = 0;
@@ -920,7 +925,7 @@ unsigned long long rrdset_done(RRDSET *st)
        int dimensions;
        st->collected_total = 0;
        for( rd = st->dimensions, dimensions = 0 ; likely(rd) ; rd = rd->next, dimensions++ )
-               st->collected_total += rd->collected_value;
+               if(likely(rd->updated)) st->collected_total += rd->collected_value;
 
        uint32_t storage_flags = SN_EXISTS;
 
@@ -929,6 +934,11 @@ unsigned long long rrdset_done(RRDSET *st)
        // at this stage we do not interpolate anything
        for( rd = st->dimensions ; likely(rd) ; rd = rd->next ) {
 
+               if(unlikely(!rd->updated)) {
+                       rd->calculated_value = 0;
+                       continue;
+               }
+
                if(unlikely(st->debug)) debug(D_RRD_STATS, "%s/%s: START "
                        " last_collected_value = " COLLECTED_NUMBER_FORMAT
                        " collected_value = " COLLECTED_NUMBER_FORMAT
@@ -942,34 +952,35 @@ unsigned long long rrdset_done(RRDSET *st)
                        );
 
                switch(rd->algorithm) {
-               case RRDDIM_ABSOLUTE:
-                       rd->calculated_value = (calculated_number)rd->collected_value
-                               * (calculated_number)rd->multiplier
-                               / (calculated_number)rd->divisor;
-
-                       if(unlikely(st->debug))
-                               debug(D_RRD_STATS, "%s/%s: CALC ABS/ABS-NO-IN "
-                                       CALCULATED_NUMBER_FORMAT " = "
-                                       COLLECTED_NUMBER_FORMAT
-                                       " * " CALCULATED_NUMBER_FORMAT
-                                       " / " CALCULATED_NUMBER_FORMAT
-                                       , st->id, rd->name
-                                       , rd->calculated_value
-                                       , rd->collected_value
-                                       , (calculated_number)rd->multiplier
-                                       , (calculated_number)rd->divisor
-                                       );
-                       break;
+                       case RRDDIM_ABSOLUTE:
+                               rd->calculated_value = (calculated_number)rd->collected_value
+                                       * (calculated_number)rd->multiplier
+                                       / (calculated_number)rd->divisor;
+
+                               if(unlikely(st->debug))
+                                       debug(D_RRD_STATS, "%s/%s: CALC ABS/ABS-NO-IN "
+                                               CALCULATED_NUMBER_FORMAT " = "
+                                               COLLECTED_NUMBER_FORMAT
+                                               " * " CALCULATED_NUMBER_FORMAT
+                                               " / " CALCULATED_NUMBER_FORMAT
+                                               , st->id, rd->name
+                                               , rd->calculated_value
+                                               , rd->collected_value
+                                               , (calculated_number)rd->multiplier
+                                               , (calculated_number)rd->divisor
+                                               );
+                               break;
 
                        case RRDDIM_PCENT_OVER_ROW_TOTAL:
-                               if(unlikely(!st->collected_total)) rd->calculated_value = 0;
+                               if(unlikely(!st->collected_total))
+                                       rd->calculated_value = 0;
                                else
-                               // the percentage of the current value
-                               // over the total of all dimensions
-                               rd->calculated_value =
-                                         (calculated_number)100
-                                       * (calculated_number)rd->collected_value
-                                       / (calculated_number)st->collected_total;
+                                       // the percentage of the current value
+                                       // over the total of all dimensions
+                                       rd->calculated_value =
+                                             (calculated_number)100
+                                           * (calculated_number)rd->collected_value
+                                           / (calculated_number)st->collected_total;
 
                                if(unlikely(st->debug))
                                        debug(D_RRD_STATS, "%s/%s: CALC PCENT-ROW "
@@ -984,7 +995,7 @@ unsigned long long rrdset_done(RRDSET *st)
                                break;
 
                        case RRDDIM_INCREMENTAL:
-                               if(unlikely(!rd->updated || rd->counter <= 1)) {
+                               if(unlikely(rd->counter <= 1)) {
                                        rd->calculated_value = 0;
                                        continue;
                                }
@@ -1000,9 +1011,10 @@ unsigned long long rrdset_done(RRDSET *st)
                                        rd->last_collected_value = rd->collected_value;
                                }
 
-                               rd->calculated_value = (calculated_number)(rd->collected_value - rd->last_collected_value)
-                                       * (calculated_number)rd->multiplier
-                                       / (calculated_number)rd->divisor;
+                               rd->calculated_value =
+                                     (calculated_number)(rd->collected_value - rd->last_collected_value)
+                                   * (calculated_number)rd->multiplier
+                                   / (calculated_number)rd->divisor;
 
                                if(unlikely(st->debug))
                                        debug(D_RRD_STATS, "%s/%s: CALC INC PRE "
@@ -1020,18 +1032,20 @@ unsigned long long rrdset_done(RRDSET *st)
                                break;
 
                        case RRDDIM_PCENT_OVER_DIFF_TOTAL:
-                               if(unlikely(!rd->updated || rd->counter <= 1)) {
+                               if(unlikely(rd->counter <= 1)) {
                                        rd->calculated_value = 0;
                                        continue;
                                }
 
                                // the percentage of the current increment
                                // over the increment of all dimensions together
-                               if(unlikely(st->collected_total == st->last_collected_total)) rd->calculated_value = rd->last_calculated_value;
-                               else rd->calculated_value =
-                                         (calculated_number)100
-                                       * (calculated_number)(rd->collected_value - rd->last_collected_value)
-                                       / (calculated_number)(st->collected_total  - st->last_collected_total);
+                               if(unlikely(st->collected_total == st->last_collected_total))
+                                       rd->calculated_value = 0;
+                               else
+                                       rd->calculated_value =
+                                                 (calculated_number)100
+                                               * (calculated_number)(rd->collected_value - rd->last_collected_value)
+                                               / (calculated_number)(st->collected_total - st->last_collected_total);
 
                                if(unlikely(st->debug))
                                        debug(D_RRD_STATS, "%s/%s: CALC PCENT-DIFF "
@@ -1233,6 +1247,7 @@ unsigned long long rrdset_done(RRDSET *st)
        if(likely(stored_entries || !store_this_entry)) {
                st->last_updated.tv_sec = st->last_collected_time.tv_sec;
                st->last_updated.tv_usec = st->last_collected_time.tv_usec;
+               st->last_collected_total  = st->collected_total;
        }
 
        for( rd = st->dimensions; likely(rd) ; rd = rd->next ) {
@@ -1262,7 +1277,6 @@ unsigned long long rrdset_done(RRDSET *st)
                        , rd->calculated_value
                        );
        }
-       st->last_collected_total  = st->collected_total;
 
        // ALL DONE ABOUT THE DATA UPDATE
        // --------------------------------------------------------------------