]> arthur.barton.de Git - netdata.git/commitdiff
added libavl for supporting balanced binary trees - this improves search performance...
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sun, 22 Mar 2015 18:48:18 +0000 (20:48 +0200)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sun, 22 Mar 2015 18:48:18 +0000 (20:48 +0200)
33 files changed:
src/Makefile
src/avl.c [new file with mode: 0644]
src/avl.h [new file with mode: 0644]
src/common.c
src/common.h
src/config.c
src/daemon.c
src/main.c
src/plugin_checks.c
src/plugin_idlejitter.c
src/plugin_nfacct.c
src/plugin_proc.c
src/plugin_tc.c
src/plugins.d/Makefile
src/plugins.d/apps_plugin.c
src/plugins_d.c
src/proc_diskstats.c
src/proc_meminfo.c
src/proc_net_dev.c
src/proc_net_ip_vs_stats.c
src/proc_net_netstat.c
src/proc_net_rpc_nfsd.c
src/proc_net_snmp.c
src/proc_net_stat_conntrack.c
src/proc_stat.c
src/proc_vmstat.c
src/procfile.h
src/rrd.c
src/rrd.h
src/rrd2json.c
src/rrd2json.h
src/unit_test.c
src/web_server.c

index ab3d9e6cdc1153f851b295c401f6deb189540d9e..e282c529edfdcea41f082758d787d3b2d4af3757 100755 (executable)
@@ -1,5 +1,5 @@
 ifndef BIN_DIR
-BIN_DIR = "$(PWD)"
+BIN_DIR = "."
 endif
 
 ifndef CONFIG_DIR
@@ -20,19 +20,21 @@ endif
 
 COMMON_FLAGS = BIN_DIR='$(BIN_DIR)' CONFIG_DIR='$(CONFIG_DIR)' LOG_DIR='$(LOG_DIR)' PLUGINS_DIR='$(PLUGINS_DIR)'
 
+proc_sources = proc_net_dev.c proc_net_ip_vs_stats.c proc_diskstats.c proc_meminfo.c proc_net_netstat.c proc_net_snmp.c proc_net_stat_conntrack.c proc_stat.c proc_vmstat.c proc_net_rpc_nfsd.c
+sources = avl.c procfile.c common.c log.c popen.c url.c config.c web_buffer.c storage_number.c web_client.c global_statistics.c rrd.c rrd2json.c web_server.c plugins_d.c daemon.c plugin_tc.c plugin_checks.c plugin_idlejitter.c plugin_proc.c unit_test.c main.c
+libs    = -pthread -lz
+
 ifdef debug
 COMMON_FLAGS += debug=1
-CFLAGS = -Wall -Wextra -ggdb -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)'
+CFLAGS = -Wall -Wextra -O -ggdb -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fno-omit-frame-pointer
+# CFLAGS := -Wall -Wextra -O -g -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fsanitize=thread -fno-omit-frame-pointer -fPIE
+# libs += -pie -ltsan
 else
-CFLAGS = -Wall -Wextra -O3 -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)'
+CFLAGS := -Wall -Wextra -O3 -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fomit-frame-pointer
 endif
 
 CC = gcc
 
-proc_sources = proc_net_dev.c proc_net_ip_vs_stats.c proc_diskstats.c proc_meminfo.c proc_net_netstat.c proc_net_snmp.c proc_net_stat_conntrack.c proc_stat.c proc_vmstat.c proc_net_rpc_nfsd.c
-sources = procfile.c common.c log.c popen.c url.c config.c web_buffer.c storage_number.c web_client.c global_statistics.c rrd.c rrd2json.c web_server.c plugins_d.c daemon.c plugin_tc.c plugin_checks.c plugin_idlejitter.c plugin_proc.c unit_test.c main.c
-libs    = -pthread -lz
-
 ifdef STORAGE_WITH_MATH
 CFLAGS += -DSTORAGE_WITH_MATH=1
 libs += -lm
@@ -51,12 +53,10 @@ objects = $(patsubst %.c,%.o,$(sources) $(proc_sources))
 all: show_options netdata plugins
 
 %.o: %.c ${headers}
-       @echo "    $(CC) $<"
-       @$(CC) $(CFLAGS) -c $< -o $@
+       $(CC) $(CFLAGS) -c $< -o $@
 
 netdata: $(objects)
-       @echo "    $(CC) netdata"
-       @$(CC) -o netdata $(objects) $(libs)
+       $(CC) -o netdata $(objects) $(libs)
 
 show_options:
        @echo "    COMPILING WITH OPTIONS: $(CFLAGS)"
diff --git a/src/avl.c b/src/avl.c
new file mode 100644 (file)
index 0000000..7b3d942
--- /dev/null
+++ b/src/avl.c
@@ -0,0 +1,316 @@
+/*
+ * ANSI C Library for maintainance of AVL Balanced Trees
+ *
+ * ref.:
+ *  G. M. Adelson-Velskij & E. M. Landis
+ *  Doklady Akad. Nauk SSSR 146 (1962), 263-266
+ *
+ * see also:
+ *  D. E. Knuth: The Art of Computer Programming Vol.3 (Sorting and Searching)
+ *
+ * (C) 2000 Daniel Nagy, Budapest University of Technology and Economics
+ * Released under GNU General Public License (GPL) version 2
+ *
+ */
+
+#include "avl.h"
+
+/* Private methods */
+
+/* Swing to the left
+ * Warning: no balance maintainance
+ */
+void avl_swl(avl** root) {
+       avl* a = *root;
+       avl* b = a->right;
+       *root = b;
+       a->right = b->left;
+       b->left = a;
+}
+
+/* Swing to the right
+ * Warning: no balance maintainance
+ */
+void avl_swr(avl** root) {
+       avl* a = *root;
+       avl* b = a->left;
+       *root = b;
+       a->left = b->right;
+       b->right = a;
+}
+
+/* Balance maintainance after especially nasty swings
+ */
+void avl_nasty(avl* root) {
+       switch (root->balance) {
+       case -1:
+               root->left->balance = 0;
+               root->right->balance = 1;
+               break;
+       case 1:
+               root->left->balance = -1;
+               root->right->balance = 0;
+               break;
+       case 0:
+               root->left->balance = 0;
+               root->right->balance = 0;
+       }
+       root->balance = 0;
+}
+
+/* Public methods */
+
+/* Insert element a into the AVL tree t
+ * returns 1 if the depth of the tree has grown
+ * Warning: do not insert elements already present
+ */
+int avl_insert(avl_tree* t, avl* a) {
+       /* initialize */
+       a->left = 0;
+       a->right = 0;
+       a->balance = 0;
+       /* insert into an empty tree */
+       if (!t->root) {
+               t->root = a;
+               return 1;
+       }
+
+       if (t->compar(t->root, a) > 0) {
+               /* insert into the left subtree */
+               if (t->root->left) {
+                       avl_tree left_subtree;
+                       left_subtree.root = t->root->left;
+                       left_subtree.compar = t->compar;
+                       if (avl_insert(&left_subtree, a)) {
+                               switch (t->root->balance--) {
+                               case 1:
+                                       return 0;
+                               case 0:
+                                       return 1;
+                               }
+                               if (t->root->left->balance < 0) {
+                                       avl_swr(&(t->root));
+                                       t->root->balance = 0;
+                                       t->root->right->balance = 0;
+                               } else {
+                                       avl_swl(&(t->root->left));
+                                       avl_swr(&(t->root));
+                                       avl_nasty(t->root);
+                               }
+                       } else
+                               t->root->left = left_subtree.root;
+                       return 0;
+               } else {
+                       t->root->left = a;
+                       if (t->root->balance--)
+                               return 0;
+                       return 1;
+               }
+       } else {
+               /* insert into the right subtree */
+               if (t->root->right) {
+                       avl_tree right_subtree;
+                       right_subtree.root = t->root->right;
+                       right_subtree.compar = t->compar;
+                       if (avl_insert(&right_subtree, a)) {
+                               switch (t->root->balance++) {
+                               case -1:
+                                       return 0;
+                               case 0:
+                                       return 1;
+                               }
+                               if (t->root->right->balance > 0) {
+                                       avl_swl(&(t->root));
+                                       t->root->balance = 0;
+                                       t->root->left->balance = 0;
+                               } else {
+                                       avl_swr(&(t->root->right));
+                                       avl_swl(&(t->root));
+                                       avl_nasty(t->root);
+                               }
+                       } else
+                               t->root->right = right_subtree.root;
+                       return 0;
+               } else {
+                       t->root->right = a;
+                       if (t->root->balance++)
+                               return 0;
+                       return 1;
+               }
+       }
+}
+
+/* Remove an element a from the AVL tree t
+ * returns -1 if the depth of the tree has shrunk
+ * Warning: if the element is not present in the tree,
+ *          returns 0 as if it had been removed succesfully.
+ */
+int avl_remove(avl_tree* t, avl* a) {
+       int b;
+       if (t->root == a)
+               return avl_removeroot(t);
+       b = t->compar(t->root, a);
+       if (b >= 0) {
+               /* remove from the left subtree */
+               int ch;
+               avl_tree left_subtree;
+               if ((left_subtree.root = t->root->left)) {
+                       left_subtree.compar = t->compar;
+                       ch = avl_remove(&left_subtree, a);
+                       t->root->left = left_subtree.root;
+                       if (ch) {
+                               switch (t->root->balance++) {
+                               case -1:
+                                       return -1;
+                               case 0:
+                                       return 0;
+                               }
+                               switch (t->root->right->balance) {
+                               case 0:
+                                       avl_swl(&(t->root));
+                                       t->root->balance = -1;
+                                       t->root->left->balance = 1;
+                                       return 0;
+                               case 1:
+                                       avl_swl(&(t->root));
+                                       t->root->balance = 0;
+                                       t->root->left->balance = 0;
+                                       return -1;
+                               }
+                               avl_swr(&(t->root->right));
+                               avl_swl(&(t->root));
+                               avl_nasty(t->root);
+                               return -1;
+                       }
+               }
+       }
+       if (b <= 0) {
+               /* remove from the right subtree */
+               int ch;
+               avl_tree right_subtree;
+               if ((right_subtree.root = t->root->right)) {
+                       right_subtree.compar = t->compar;
+                       ch = avl_remove(&right_subtree, a);
+                       t->root->right = right_subtree.root;
+                       if (ch) {
+                               switch (t->root->balance--) {
+                               case 1:
+                                       return -1;
+                               case 0:
+                                       return 0;
+                               }
+                               switch (t->root->left->balance) {
+                               case 0:
+                                       avl_swr(&(t->root));
+                                       t->root->balance = 1;
+                                       t->root->right->balance = -1;
+                                       return 0;
+                               case -1:
+                                       avl_swr(&(t->root));
+                                       t->root->balance = 0;
+                                       t->root->right->balance = 0;
+                                       return -1;
+                               }
+                               avl_swl(&(t->root->left));
+                               avl_swr(&(t->root));
+                               avl_nasty(t->root);
+                               return -1;
+                       }
+               }
+       }
+       return 0;
+}
+
+/* Remove the root of the AVL tree t
+ * Warning: dumps core if t is empty
+ */
+int avl_removeroot(avl_tree* t) {
+       int ch;
+       avl* a;
+       if (!t->root->left) {
+               if (!t->root->right) {
+                       t->root = 0;
+                       return -1;
+               }
+               t->root = t->root->right;
+               return -1;
+       }
+       if (!t->root->right) {
+               t->root = t->root->left;
+               return -1;
+       }
+       if (t->root->balance < 0) {
+               /* remove from the left subtree */
+               a = t->root->left;
+               while (a->right)
+                       a = a->right;
+       } else {
+               /* remove from the right subtree */
+               a = t->root->right;
+               while (a->left)
+                       a = a->left;
+       }
+       ch = avl_remove(t, a);
+       a->left = t->root->left;
+       a->right = t->root->right;
+       a->balance = t->root->balance;
+       t->root = a;
+       if (a->balance == 0)
+               return ch;
+       return 0;
+}
+
+/* Iterate through elements in t from a range between a and b (inclusive)
+ * for each element calls iter(a) until it returns 0
+ * returns the last value returned by iterator or 0 if there were no calls
+ * Warning: a<=b must hold
+ */
+int avl_range(avl_tree* t, avl* a, avl* b, int (*iter)(avl* a), avl** ret) {
+       int x, c = 0;
+       if (!t->root)
+               return 0;
+       x = t->compar(t->root, a);
+       if (a != b) {
+               if (x < 0) {
+                       x = t->compar(t->root, b);
+                       if (x > 0)
+                               x = 0;
+               }
+       }
+       if (x >= 0) {
+               /* search in the left subtree */
+               avl_tree left_subtree;
+               if ((left_subtree.root = t->root->left)) {
+                       left_subtree.compar = t->compar;
+                       if (!(c = avl_range(&left_subtree, a, b, iter, ret)))
+                               if (x > 0)
+                                       return 0;
+               }
+       }
+       if (x == 0) {
+               if (!(c = iter(t->root))) {
+                       if (ret)
+                               *ret = t->root;
+                       return 0;
+               }
+       }
+       if (x <= 0) {
+               /* search in the right subtree */
+               avl_tree right_subtree;
+               if ((right_subtree.root = t->root->right)) {
+                       right_subtree.compar = t->compar;
+                       if (!(c = avl_range(&right_subtree, a, b, iter, ret)))
+                               if (x < 0)
+                                       return 0;
+               }
+       }
+       return c;
+}
+
+/* Iterate through elements in t equal to a
+ * for each element calls iter(a) until it returns 0
+ * returns the last value returned by iterator or 0 if there were no calls
+ */
+int avl_search(avl_tree* t, avl* a, int (*iter)(avl* a), avl** ret) {
+       return avl_range(t, a, a, iter, ret);
+}
diff --git a/src/avl.h b/src/avl.h
new file mode 100644 (file)
index 0000000..35823c4
--- /dev/null
+++ b/src/avl.h
@@ -0,0 +1,67 @@
+/*
+ * ANSI C Library for maintainance of AVL Balanced Trees
+ *
+ * ref.:
+ *  G. M. Adelson-Velskij & E. M. Landis
+ *  Doklady Akad. Nauk SSSR 146 (1962), 263-266
+ *
+ * see also:
+ *  D. E. Knuth: The Art of Computer Programming Vol.3 (Sorting and Searching)
+ *
+ * (C) 2000 Daniel Nagy, Budapest University of Technology and Economics
+ * Released under GNU General Public License (GPL) version 2
+ *
+ */
+
+#ifndef _AVL_H
+#define _AVL_H 1
+
+/* Data structures */
+
+/* One element of the AVL tree */
+typedef struct avl {
+       struct avl* left;
+       struct avl* right;
+       signed char balance;
+} avl;
+
+/* An AVL tree */
+typedef struct avl_tree {
+       avl* root;
+       int (*compar)(void* a, void* b);
+} avl_tree;
+
+/* Public methods */
+
+/* Insert element a into the AVL tree t
+ * returns 1 if the depth of the tree has grown
+ * Warning: do not insert elements already present
+ */
+int avl_insert(avl_tree* t, avl* a);
+
+/* Remove an element a from the AVL tree t
+ * returns -1 if the depth of the tree has shrunk
+ * Warning: if the element is not present in the tree, 
+ *          returns 0 as if it had been removed succesfully.
+ */
+int avl_remove(avl_tree* t, avl* a);
+
+/* Remove the root of the AVL tree t
+ * Warning: dumps core if t is empty
+ */
+int avl_removeroot(avl_tree* t);
+
+/* Iterate through elements in t from a range between a and b (inclusive)
+ * for each element calls iter(a) until it returns 0
+ * returns the last value returned by iterator or 0 if there were no calls
+ * Warning: a<=b must hold
+ */
+int avl_range(avl_tree* t, avl* a, avl* b, int (*iter)(avl* a), avl** ret);
+
+/* Iterate through elements in t equal to a
+ * for each element calls iter(a) until it returns 0
+ * returns the last value returned by iterator or 0 if there were no calls
+ */
+int avl_search(avl_tree* t, avl* a, int (*iter)(avl* a), avl** ret);
+
+#endif /* avl.h */
index 6747382070cb2258ba24910efcaaff3326661ada..df85ee8fa8dc23eacb0b510e8d5ebfcaa058ae35 100755 (executable)
@@ -9,12 +9,10 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <sys/mman.h>
-#include <malloc.h>
 
 
 #include "log.h"
 #include "common.h"
-#include "web_client.h"
 
 // http://stackoverflow.com/questions/7666509/hash-function-for-string
 unsigned long simple_hash(const char *name)
@@ -159,23 +157,6 @@ int savememory(const char *filename, void *mem, unsigned long size)
        return ret;
 }
 
-void log_allocations(void)
-{
-       static int mem = 0;
-
-       struct mallinfo mi;
-
-       mi = mallinfo();
-       if(mi.uordblks > mem) {
-               int clients = 0;
-               struct web_client *w;
-               for(w = web_clients; w ; w = w->next) clients++;
-
-               info("Allocated memory increased from %d to %d (increased by %d bytes). There are %d web clients connected.", mem, mi.uordblks, mi.uordblks - mem, clients);
-               mem = mi.uordblks;
-       }
-}
-
 int fd_is_valid(int fd) {
     return fcntl(fd, F_GETFD) != -1 || errno != EBADF;
 }
index 2d720e9e716d9ea575a1440369ea8e2343ef60d9..2340c01568182f3e6e14c167aa124718fe29c82c 100755 (executable)
@@ -13,8 +13,6 @@ extern char *trim(char *s);
 extern void *mymmap(const char *filename, unsigned long size, int flags);
 extern int savememory(const char *filename, void *mem, unsigned long size);
 
-extern void log_allocations(void);
-
 extern int fd_is_valid(int fd);
 
 #endif /* NETDATA_COMMON_H */
index c2fdb426a72da2f77c2fa6224f30745d20509a7f..1afc0b8d26d98b63429cdd73cb6ba6c8795444e1 100755 (executable)
@@ -1,7 +1,9 @@
 #include <pthread.h>
 #include <stdlib.h>
 #include <string.h>
+#include <inttypes.h>
 
+#include "avl.h"
 #include "common.h"
 #include "config.h"
 #include "log.h"
 
 pthread_rwlock_t config_rwlock = PTHREAD_RWLOCK_INITIALIZER;
 
+// ----------------------------------------------------------------------------
+// definitions
+
+#define CONFIG_VALUE_LOADED  0x01 // has been loaded from the config
+#define CONFIG_VALUE_USED    0x02 // has been accessed from the program
+#define CONFIG_VALUE_CHANGED 0x04 // has been changed from the loaded value
+#define CONFIG_VALUE_CHECKED 0x08 // has been checked if the value is different from the default
+
 struct config_value {
-       char name[CONFIG_MAX_NAME + 1];
-       char value[CONFIG_MAX_VALUE + 1];
+       avl avl;
 
        unsigned long hash;             // a simple hash to speed up searching
                                                        // we first compare hashes, and only if the hashes are equal we do string comparisons
 
-       int loaded;                             // loaded from the user config
-       int used;                               // has been accessed from the program
-       int changed;                    // changed from the internal default
+       char name[CONFIG_MAX_NAME + 1];
+       char value[CONFIG_MAX_VALUE + 1];
+
+       uint8_t flags;
 
        struct config_value *next;
 };
 
 struct config {
-       char name[CONFIG_MAX_NAME + 1];
+       avl avl;
 
        unsigned long hash;             // a simple hash to speed up searching
                                                        // we first compare hashes, and only if the hashes are equal we do string comparisons
 
+       char name[CONFIG_MAX_NAME + 1];
+
        struct config_value *values;
+       avl_tree values_index;
 
        struct config *next;
 } *config_root = NULL;
 
+
+// ----------------------------------------------------------------------------
+// config value
+
+static int config_value_iterator(avl *a) { if(a) {}; return 0; }
+
+static int config_value_compare(void* a, void* b) {
+       if(((struct config_value *)a)->hash < ((struct config_value *)b)->hash) return -1;
+       else if(((struct config_value *)a)->hash > ((struct config_value *)b)->hash) return 1;
+       else return strcmp(((struct config_value *)a)->name, ((struct config_value *)b)->name);
+}
+
+#define config_value_index_add(co, cv) avl_insert(&((co)->values_index), (avl *)(cv))
+#define config_value_index_del(co, cv) avl_remove(&((co)->values_index), (avl *)(cv))
+
+static struct config_value *config_value_index_find(struct config *co, const char *name, unsigned long hash) {
+       struct config_value *result = NULL, tmp;
+       tmp.hash = (hash)?hash:simple_hash(name);
+       strncpy(tmp.name, name, CONFIG_MAX_NAME);
+       tmp.name[CONFIG_MAX_NAME] = '\0';
+
+       avl_search(&(co->values_index), (avl *)&tmp, config_value_iterator, (avl **)&result);
+       return result;
+}
+
+// ----------------------------------------------------------------------------
+// config
+
+static int config_iterator(avl *a) { if(a) {}; return 0; }
+
+static int config_compare(void* a, void* b) {
+       if(((struct config *)a)->hash < ((struct config *)b)->hash) return -1;
+       else if(((struct config *)a)->hash > ((struct config *)b)->hash) return 1;
+       else return strcmp(((struct config *)a)->name, ((struct config *)b)->name);
+}
+
+avl_tree config_root_index = {
+               NULL,
+               config_compare
+};
+
+#define config_index_add(cfg) avl_insert(&config_root_index, (avl *)(cfg))
+#define config_index_del(cfg) avl_remove(&config_root_index, (avl *)(cfg))
+
+static struct config *config_index_find(const char *name, unsigned long hash) {
+       struct config *result = NULL, tmp;
+       tmp.hash = (hash)?hash:simple_hash(name);
+       strncpy(tmp.name, name, CONFIG_MAX_NAME);
+       tmp.name[CONFIG_MAX_NAME] = '\0';
+
+       avl_search(&config_root_index, (avl *)&tmp, config_iterator, (avl **)&result);
+       return result;
+}
+
 struct config_value *config_value_create(struct config *co, const char *name, const char *value)
 {
        debug(D_CONFIG, "Creating config entry for name '%s', value '%s', in section '%s'.", name, value, co->name);
@@ -46,6 +113,8 @@ struct config_value *config_value_create(struct config *co, const char *name, co
        strncpy(cv->value, value, CONFIG_MAX_VALUE);
        cv->hash = simple_hash(cv->name);
 
+       config_value_index_add(co, cv);
+
        // no need for string termination, due to calloc()
 
        struct config_value *cv2 = co->values;
@@ -67,6 +136,9 @@ struct config *config_create(const char *section)
 
        strncpy(co->name, section, CONFIG_MAX_NAME);
        co->hash = simple_hash(co->name);
+       co->values_index.compar = config_value_compare;
+
+       config_index_add(co);
 
        // no need for string termination, due to calloc()
 
@@ -82,15 +154,7 @@ struct config *config_create(const char *section)
 
 struct config *config_find_section(const char *section)
 {
-       struct config *co;
-       unsigned long hash = simple_hash(section);
-
-       for(co = config_root; co ; co = co->next)
-               if(hash == co->hash)
-                       if(strcmp(co->name, section) == 0)
-                               break;
-
-       return co;
+       return config_index_find(section, 0);
 }
 
 int load_config(char *filename, int overwrite_used)
@@ -159,13 +223,11 @@ int load_config(char *filename, int overwrite_used)
                        continue;
                }
 
-               struct config_value *cv;
-               for(cv = co->values; cv ; cv = cv->next)
-                       if(strcmp(cv->name, name) == 0) break;
+               struct config_value *cv = config_value_index_find(co, name, 0);
 
                if(!cv) cv = config_value_create(co, name, value);
                else {
-                       if((cv->used && overwrite_used) || !cv->used) {
+                       if((cv->flags & CONFIG_VALUE_USED && overwrite_used) || !(cv->flags & CONFIG_VALUE_USED)) {
                                debug(D_CONFIG, "Overwriting '%s/%s'.", line, co->name, cv->name);
                                strncpy(cv->value, value, CONFIG_MAX_VALUE);
                                // termination is already there
@@ -173,7 +235,7 @@ int load_config(char *filename, int overwrite_used)
                        else
                                debug(D_CONFIG, "Ignoring line %d, '%s/%s' is already present and used.", line, co->name, cv->name);
                }
-               cv->loaded = 1;
+               cv->flags |= CONFIG_VALUE_LOADED;
        }
 
        fclose(fp);
@@ -193,19 +255,17 @@ char *config_get(const char *section, const char *name, const char *default_valu
        struct config *co = config_find_section(section);
        if(!co) co = config_create(section);
 
-       unsigned long hash = simple_hash(name);
-       for(cv = co->values; cv ; cv = cv->next)
-               if(hash == cv->hash)
-                       if(strcmp(cv->name, name) == 0)
-                               break;
-
+       cv = config_value_index_find(co, name, 0);
        if(!cv) cv = config_value_create(co, name, default_value);
-       cv->used = 1;
+       cv->flags |= CONFIG_VALUE_USED;
 
-       if(cv->loaded || cv->changed) {
+       if(cv->flags & CONFIG_VALUE_LOADED || cv->flags & CONFIG_VALUE_CHANGED) {
                // this is a loaded value from the config file
                // if it is different that the default, mark it
-               if(strcmp(cv->value, default_value) != 0) cv->changed = 1;
+               if(!(cv->flags & CONFIG_VALUE_CHECKED)) {
+                       if(strcmp(cv->value, default_value) != 0) cv->flags |= CONFIG_VALUE_CHANGED;
+                       cv->flags |= CONFIG_VALUE_CHECKED;
+               }
        }
        else {
                // this is not loaded from the config
@@ -255,16 +315,11 @@ const char *config_set(const char *section, const char *name, const char *value)
        struct config *co = config_find_section(section);
        if(!co) co = config_create(section);
 
-       unsigned long hash = simple_hash(name);
-       for(cv = co->values; cv ; cv = cv->next)
-               if(hash == cv->hash)
-                       if(strcmp(cv->name, name) == 0)
-                               break;
-
+       cv = config_value_index_find(co, name, 0);
        if(!cv) cv = config_value_create(co, name, value);
-       cv->used = 1;
+       cv->flags |= CONFIG_VALUE_USED;
 
-       if(strcmp(cv->value, value) != 0) cv->changed = 1;
+       if(strcmp(cv->value, value) != 0) cv->flags |= CONFIG_VALUE_CHANGED;
 
        strncpy(cv->value, value, CONFIG_MAX_VALUE);
        // termination is already there
@@ -331,8 +386,8 @@ void generate_config(struct web_buffer *wb, int only_changed)
                                int changed = 0;
                                int count = 0;
                                for(cv = co->values; cv ; cv = cv->next) {
-                                       used += cv->used;
-                                       changed += cv->changed;
+                                       used += (cv->flags && CONFIG_VALUE_USED)?1:0;
+                                       changed += (cv->flags & CONFIG_VALUE_CHANGED)?1:0;
                                        count++;
                                }
 
@@ -349,12 +404,12 @@ void generate_config(struct web_buffer *wb, int only_changed)
 
                                for(cv = co->values; cv ; cv = cv->next) {
 
-                                       if(used && !cv->used) {
+                                       if(used && !(cv->flags & CONFIG_VALUE_USED)) {
                                                web_buffer_increase(wb, CONFIG_MAX_NAME + 200);
                                                web_buffer_printf(wb, "\n\t# option '%s' is not used.\n", cv->name);
                                        }
                                        web_buffer_increase(wb, CONFIG_MAX_NAME + CONFIG_MAX_VALUE + 5);
-                                       web_buffer_printf(wb, "\t%s%s = %s\n", (!cv->changed && cv->used)?"# ":"", cv->name, cv->value);
+                                       web_buffer_printf(wb, "\t%s%s = %s\n", ((!(cv->flags & CONFIG_VALUE_CHANGED)) && (cv->flags & CONFIG_VALUE_USED))?"# ":"", cv->name, cv->value);
                                }
                        }
                }
index cb40a670923ce5735aa4d5298f89e67c0044c81c..7728cf449bb3fbfdd77cf6c4c5de64385e685fef 100755 (executable)
@@ -39,7 +39,7 @@ void sig_handler(int signo)
                        signal(SIGINT,  SIG_IGN);
                        kill_childs();
                        process_childs(0);
-                       rrd_stats_free_all();
+                       rrdset_free_all();
                        //unlink("/var/run/netdata.pid");
                        info("NetData exiting. Bye bye...");
                        exit(1);
index 3ac88171c1d1e41c21fc857583f2640e4e47c6bb..9979b3e597c5768ab15459599728e32f91de7286 100755 (executable)
@@ -131,7 +131,7 @@ int main(int argc, char **argv)
                else if(strcmp(argv[i], "--unittest")  == 0) {
                        if(unit_test_storage()) exit(1);
                        exit(0);
-                       update_every = 1;
+                       rrd_update_every = 1;
                        if(unit_test(1000000, 0)) exit(1);
                        if(unit_test(1000000, 500000)) exit(1);
                        if(unit_test(1000000, 100000)) exit(1);
@@ -151,7 +151,7 @@ int main(int argc, char **argv)
                        fprintf(stderr, "Cannot understand option '%s'.\n", argv[i]);
                        fprintf(stderr, "\nUSAGE: %s [-d] [-l LINES_TO_SAVE] [-u UPDATE_TIMER] [-p LISTEN_PORT] [-dl debug log file] [-df debug flags].\n\n", argv[0]);
                        fprintf(stderr, "  -c CONFIG FILE the configuration file to load. Default: %s.\n", CONFIG_DIR "/" CONFIG_FILENAME);
-                       fprintf(stderr, "  -l LINES_TO_SAVE can be from 5 to %d lines in JSON data. Default: %d.\n", HISTORY_MAX, HISTORY);
+                       fprintf(stderr, "  -l LINES_TO_SAVE can be from 5 to %d lines in JSON data. Default: %d.\n", RRD_HISTORY_ENTRIES_MAX, RRD_DEFAULT_HISTORY_ENTRIES);
                        fprintf(stderr, "  -t UPDATE_TIMER can be from 1 to %d seconds. Default: %d.\n", UPDATE_EVERY_MAX, UPDATE_EVERY);
                        fprintf(stderr, "  -p LISTEN_PORT can be from 1 to %d. Default: %d.\n", 65535, LISTEN_PORT);
                        fprintf(stderr, "  -u USERNAME can be any system username to run as. Default: none.\n");
@@ -219,7 +219,7 @@ int main(int argc, char **argv)
 
                // --------------------------------------------------------------------
 
-               memory_mode = memory_mode_id(config_get("global", "memory mode", memory_mode_name(memory_mode)));
+               rrd_memory_mode = rrd_memory_mode_id(config_get("global", "memory mode", rrd_memory_mode_name(rrd_memory_mode)));
 
                // --------------------------------------------------------------------
 
@@ -230,23 +230,23 @@ int main(int argc, char **argv)
 
                // --------------------------------------------------------------------
 
-               save_history = config_get_number("global", "history", HISTORY);
-               if(save_history < 5 || save_history > HISTORY_MAX) {
-                       fprintf(stderr, "Invalid save lines %d given. Defaulting to %d.\n", save_history, HISTORY);
-                       save_history = HISTORY;
+               rrd_default_history_entries = config_get_number("global", "history", RRD_DEFAULT_HISTORY_ENTRIES);
+               if(rrd_default_history_entries < 5 || rrd_default_history_entries > RRD_HISTORY_ENTRIES_MAX) {
+                       fprintf(stderr, "Invalid save lines %d given. Defaulting to %d.\n", rrd_default_history_entries, RRD_DEFAULT_HISTORY_ENTRIES);
+                       rrd_default_history_entries = RRD_DEFAULT_HISTORY_ENTRIES;
                }
                else {
-                       debug(D_OPTIONS, "save lines set to %d.", save_history);
+                       debug(D_OPTIONS, "save lines set to %d.", rrd_default_history_entries);
                }
 
                // --------------------------------------------------------------------
 
-               update_every = config_get_number("global", "update every", UPDATE_EVERY);
-               if(update_every < 1 || update_every > 600) {
-                       fprintf(stderr, "Invalid update timer %d given. Defaulting to %d.\n", update_every, UPDATE_EVERY_MAX);
-                       update_every = UPDATE_EVERY;
+               rrd_update_every = config_get_number("global", "update every", UPDATE_EVERY);
+               if(rrd_update_every < 1 || rrd_update_every > 600) {
+                       fprintf(stderr, "Invalid update timer %d given. Defaulting to %d.\n", rrd_update_every, UPDATE_EVERY_MAX);
+                       rrd_update_every = UPDATE_EVERY;
                }
-               else debug(D_OPTIONS, "update timer set to %d.", update_every);
+               else debug(D_OPTIONS, "update timer set to %d.", rrd_update_every);
 
                // --------------------------------------------------------------------
                
index 0177f2071fb2db06b22782406d1cc9d2038cc771..6e987e4e3fd648e2f968917e8004f33839a80908 100755 (executable)
@@ -20,23 +20,23 @@ void *checks_main(void *ptr)
        if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0)
                error("Cannot set pthread cancel state to ENABLE.");
 
-       unsigned long long usec = 0, susec = update_every * 1000000ULL, loop_usec = 0, total_susec = 0;
+       unsigned long long usec = 0, susec = rrd_update_every * 1000000ULL, loop_usec = 0, total_susec = 0;
        struct timeval now, last, loop;
 
-       RRD_STATS *check1, *check2, *check3, *apps_cpu = NULL;
+       RRDSET *check1, *check2, *check3, *apps_cpu = NULL;
 
-       check1 = rrd_stats_create("netdata", "check1", NULL, "netdata", "Caller gives microseconds", "a million !", 99999, update_every, CHART_TYPE_LINE);
-       rrd_stats_dimension_add(check1, "absolute", NULL, -1, 1, RRD_DIMENSION_ABSOLUTE);
-       rrd_stats_dimension_add(check1, "incremental", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+       check1 = rrdset_create("netdata", "check1", NULL, "netdata", "Caller gives microseconds", "a million !", 99999, rrd_update_every, RRDSET_TYPE_LINE);
+       rrddim_add(check1, "absolute", NULL, -1, 1, RRDDIM_ABSOLUTE);
+       rrddim_add(check1, "incremental", NULL, 1, 1 * rrd_update_every, RRDDIM_INCREMENTAL);
 
-       check2 = rrd_stats_create("netdata", "check2", NULL, "netdata", "Netdata calcs microseconds", "a million !", 99999, update_every, CHART_TYPE_LINE);
-       rrd_stats_dimension_add(check2, "absolute", NULL, -1, 1, RRD_DIMENSION_ABSOLUTE);
-       rrd_stats_dimension_add(check2, "incremental", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+       check2 = rrdset_create("netdata", "check2", NULL, "netdata", "Netdata calcs microseconds", "a million !", 99999, rrd_update_every, RRDSET_TYPE_LINE);
+       rrddim_add(check2, "absolute", NULL, -1, 1, RRDDIM_ABSOLUTE);
+       rrddim_add(check2, "incremental", NULL, 1, 1 * rrd_update_every, RRDDIM_INCREMENTAL);
 
-       check3 = rrd_stats_create("netdata", "checkdt", NULL, "netdata", "Clock difference", "microseconds diff", 99999, update_every, CHART_TYPE_LINE);
-       rrd_stats_dimension_add(check3, "caller", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
-       rrd_stats_dimension_add(check3, "netdata", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
-       rrd_stats_dimension_add(check3, "apps.plugin", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
+       check3 = rrdset_create("netdata", "checkdt", NULL, "netdata", "Clock difference", "microseconds diff", 99999, rrd_update_every, RRDSET_TYPE_LINE);
+       rrddim_add(check3, "caller", NULL, 1, 1, RRDDIM_ABSOLUTE);
+       rrddim_add(check3, "netdata", NULL, 1, 1, RRDDIM_ABSOLUTE);
+       rrddim_add(check3, "apps.plugin", NULL, 1, 1, RRDDIM_ABSOLUTE);
 
        gettimeofday(&last, NULL);
        while(1) {
@@ -48,8 +48,8 @@ void *checks_main(void *ptr)
                usec = loop_usec - susec;
                debug(D_PROCNETDEV_LOOP, "CHECK: last loop took %llu usec (worked for %llu, sleeped for %llu).", loop_usec, usec, susec);
                
-               if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec;
-               else susec = update_every * 1000000ULL / 2ULL;
+               if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec;
+               else susec = rrd_update_every * 1000000ULL / 2ULL;
 
                // --------------------------------------------------------------------
                // Calculate loop time
@@ -61,29 +61,29 @@ void *checks_main(void *ptr)
                // --------------------------------------------------------------------
                // check chart 1
 
-               if(check1->counter_done) rrd_stats_next_usec(check1, loop_usec);
-               rrd_stats_dimension_set(check1, "absolute", 1000000);
-               rrd_stats_dimension_set(check1, "incremental", total_susec);
-               rrd_stats_done(check1);
+               if(check1->counter_done) rrdset_next_usec(check1, loop_usec);
+               rrddim_set(check1, "absolute", 1000000);
+               rrddim_set(check1, "incremental", total_susec);
+               rrdset_done(check1);
 
                // --------------------------------------------------------------------
                // check chart 2
 
-               if(check2->counter_done) rrd_stats_next(check2);
-               rrd_stats_dimension_set(check2, "absolute", 1000000);
-               rrd_stats_dimension_set(check2, "incremental", total_susec);
-               rrd_stats_done(check2);
+               if(check2->counter_done) rrdset_next(check2);
+               rrddim_set(check2, "absolute", 1000000);
+               rrddim_set(check2, "incremental", total_susec);
+               rrdset_done(check2);
 
                // --------------------------------------------------------------------
                // check chart 3
 
-               if(!apps_cpu) apps_cpu = rrd_stats_find("apps.cpu");
-               if(check3->counter_done) rrd_stats_next_usec(check3, loop_usec);
+               if(!apps_cpu) apps_cpu = rrdset_find("apps.cpu");
+               if(check3->counter_done) rrdset_next_usec(check3, loop_usec);
                gettimeofday(&loop, NULL);
-               rrd_stats_dimension_set(check3, "caller", (long long)usecdiff(&loop, &check1->last_collected_time));
-               rrd_stats_dimension_set(check3, "netdata", (long long)usecdiff(&loop, &check2->last_collected_time));
-               if(apps_cpu) rrd_stats_dimension_set(check3, "apps.plugin", (long long)usecdiff(&loop, &apps_cpu->last_collected_time));
-               rrd_stats_done(check3);
+               rrddim_set(check3, "caller", (long long)usecdiff(&loop, &check1->last_collected_time));
+               rrddim_set(check3, "netdata", (long long)usecdiff(&loop, &check2->last_collected_time));
+               if(apps_cpu) rrddim_set(check3, "apps.plugin", (long long)usecdiff(&loop, &apps_cpu->last_collected_time));
+               rrdset_done(check3);
        }
 
        return NULL;
index 1ec84e8edd8aec753524b9e52f1730b71d9aece7..f18ebb310388fc50a09a79091e1b677097d41e58 100755 (executable)
@@ -29,10 +29,10 @@ void *cpuidlejitter_main(void *ptr)
                sleep_ms = CPU_IDLEJITTER_SLEEP_TIME_MS;
        }
 
-       RRD_STATS *st = rrd_stats_find("system.idlejitter");
+       RRDSET *st = rrdset_find("system.idlejitter");
        if(!st) {
-               st = rrd_stats_create("system", "idlejitter", NULL, "cpu", "CPU Idle Jitter", "microseconds lost/s", 9999, update_every, CHART_TYPE_LINE);
-               rrd_stats_dimension_add(st, "jitter", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
+               st = rrdset_create("system", "idlejitter", NULL, "cpu", "CPU Idle Jitter", "microseconds lost/s", 9999, rrd_update_every, RRDSET_TYPE_LINE);
+               rrddim_add(st, "jitter", NULL, 1, 1, RRDDIM_ABSOLUTE);
        }
 
        struct timeval before, after;
@@ -40,7 +40,7 @@ void *cpuidlejitter_main(void *ptr)
        for(counter = 0; 1 ;counter++) {
                unsigned long long usec = 0, susec = 0;
 
-               while(susec < (update_every * 1000000ULL)) {
+               while(susec < (rrd_update_every * 1000000ULL)) {
 
                        gettimeofday(&before, NULL);
                        usleep(sleep_ms * 1000);
@@ -52,9 +52,9 @@ void *cpuidlejitter_main(void *ptr)
                }
                usec -= (sleep_ms * 1000);
 
-               if(counter) rrd_stats_next_usec(st, susec);
-               rrd_stats_dimension_set(st, "jitter", usec);
-               rrd_stats_done(st);
+               if(counter) rrdset_next_usec(st, susec);
+               rrddim_set(st, "jitter", usec);
+               rrdset_done(st);
        }
 
        return NULL;
index 4329424d9b5d057d35c46f6066af49023f7992cb..ba368f2dc9ee044aeadab7f0ff5b18b6751bda17 100644 (file)
@@ -106,7 +106,7 @@ void *nfacct_main(void *ptr) {
 
        struct timeval last, now;
        unsigned long long usec = 0, susec = 0;
-       RRD_STATS *st = NULL;
+       RRDSET *st = NULL;
 
        gettimeofday(&last, NULL);
 
@@ -145,8 +145,8 @@ void *nfacct_main(void *ptr) {
                usec = usecdiff(&now, &last) - susec;
                debug(D_NFACCT_LOOP, "nfacct.plugin: last loop took %llu usec (worked for %llu, sleeped for %llu).", usec + susec, usec, susec);
                
-               if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec;
-               else susec = update_every * 1000000ULL / 2ULL;
+               if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec;
+               else susec = rrd_update_every * 1000000ULL / 2ULL;
 
 
                // --------------------------------------------------------------------
@@ -154,43 +154,43 @@ void *nfacct_main(void *ptr) {
                if(nfacct_list && nfacct_list->len) {
                        int i;
 
-                       st = rrd_stats_find_bytype("nfacct", "packets");
+                       st = rrdset_find_bytype("nfacct", "packets");
                        if(!st) {
-                               st = rrd_stats_create("nfacct", "packets", NULL, "netfilter", "Netfilter Accounting Packets", "packets/s", 1006, update_every, CHART_TYPE_STACKED);
+                               st = rrdset_create("nfacct", "packets", NULL, "netfilter", "Netfilter Accounting Packets", "packets/s", 1006, rrd_update_every, RRDSET_TYPE_STACKED);
 
                                for(i = 0; i < nfacct_list->len ; i++)
-                                       rrd_stats_dimension_add(st, nfacct_list->data[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, nfacct_list->data[i].name, NULL, 1, rrd_update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
                        for(i = 0; i < nfacct_list->len ; i++) {
-                               RRD_DIMENSION *rd = rrd_stats_dimension_find(st, nfacct_list->data[i].name);
+                               RRDDIM *rd = rrddim_find(st, nfacct_list->data[i].name);
 
-                               if(!rd) rd = rrd_stats_dimension_add(st, nfacct_list->data[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
-                               if(rd) rrd_stats_dimension_set_by_pointer(st, rd, nfacct_list->data[i].pkts);
+                               if(!rd) rd = rrddim_add(st, nfacct_list->data[i].name, NULL, 1, rrd_update_every, RRDDIM_INCREMENTAL);
+                               if(rd) rrddim_set_by_pointer(st, rd, nfacct_list->data[i].pkts);
                        }
                        
-                       rrd_stats_done(st);
+                       rrdset_done(st);
 
                        // ----------------------------------------------------------------
 
-                       st = rrd_stats_find_bytype("nfacct", "bytes");
+                       st = rrdset_find_bytype("nfacct", "bytes");
                        if(!st) {
-                               st = rrd_stats_create("nfacct", "bytes", NULL, "netfilter", "Netfilter Accounting Bandwidth", "kilobytes/s", 1007, update_every, CHART_TYPE_STACKED);
+                               st = rrdset_create("nfacct", "bytes", NULL, "netfilter", "Netfilter Accounting Bandwidth", "kilobytes/s", 1007, rrd_update_every, RRDSET_TYPE_STACKED);
 
                                for(i = 0; i < nfacct_list->len ; i++)
-                                       rrd_stats_dimension_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
                        for(i = 0; i < nfacct_list->len ; i++) {
-                               RRD_DIMENSION *rd = rrd_stats_dimension_find(st, nfacct_list->data[i].name);
+                               RRDDIM *rd = rrddim_find(st, nfacct_list->data[i].name);
 
-                               if(!rd) rd = rrd_stats_dimension_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               if(rd) rrd_stats_dimension_set_by_pointer(st, rd, nfacct_list->data[i].bytes);
+                               if(!rd) rd = rrddim_add(st, nfacct_list->data[i].name, NULL, 1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL);
+                               if(rd) rrddim_set_by_pointer(st, rd, nfacct_list->data[i].bytes);
                        }
                        
-                       rrd_stats_done(st);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
index 8911d81bd24d2d6875c6d0de963ce142e51a4e20..294188b3b8e4382f27d4dee588dfdc84f2e52cb1 100755 (executable)
@@ -25,7 +25,7 @@ void *proc_main(void *ptr)
        struct timeval last, now;
 
        gettimeofday(&last, NULL);
-       last.tv_sec -= update_every;
+       last.tv_sec -= rrd_update_every;
        
        // disable (by default) various interface that are not needed
        config_get_boolean("plugin:proc:/proc/net/dev", "interface lo", 0);
@@ -44,7 +44,7 @@ void *proc_main(void *ptr)
        int vdo_proc_net_rpc_nfsd               = !config_get_boolean("plugin:proc", "/proc/net/rpc/nfsd", 1);
        int vdo_cpu_netdata                     = !config_get_boolean("plugin:proc", "netdata server resources", 1);
 
-       RRD_STATS *stcpu = NULL, *stclients = NULL, *streqs = NULL, *stbytes = NULL;
+       RRDSET *stcpu = NULL, *stclients = NULL, *streqs = NULL, *stbytes = NULL;
 
        gettimeofday(&last, NULL);
        getrusage(RUSAGE_SELF, &me_last);
@@ -56,50 +56,50 @@ void *proc_main(void *ptr)
                
                if(!vdo_proc_net_dev) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_dev().");
-                       vdo_proc_net_dev = do_proc_net_dev(update_every, usec+susec);
+                       vdo_proc_net_dev = do_proc_net_dev(rrd_update_every, usec+susec);
                }
                if(!vdo_proc_diskstats) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_diskstats().");
-                       vdo_proc_diskstats = do_proc_diskstats(update_every, usec+susec);
+                       vdo_proc_diskstats = do_proc_diskstats(rrd_update_every, usec+susec);
                }
                if(!vdo_proc_net_snmp) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp().");
-                       vdo_proc_net_snmp = do_proc_net_snmp(update_every, usec+susec);
+                       vdo_proc_net_snmp = do_proc_net_snmp(rrd_update_every, usec+susec);
                }
 
                if(!vdo_proc_net_netstat) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_netstat().");
-                       vdo_proc_net_netstat = do_proc_net_netstat(update_every, usec+susec);
+                       vdo_proc_net_netstat = do_proc_net_netstat(rrd_update_every, usec+susec);
                }
 
                if(!vdo_proc_net_stat_conntrack) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_stat_conntrack().");
-                       vdo_proc_net_stat_conntrack     = do_proc_net_stat_conntrack(update_every, usec+susec);
+                       vdo_proc_net_stat_conntrack     = do_proc_net_stat_conntrack(rrd_update_every, usec+susec);
                }
 
                if(!vdo_proc_net_ip_vs_stats) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_ip_vs_stats().");
-                       vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(update_every, usec+susec);
+                       vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(rrd_update_every, usec+susec);
                }
 
                if(!vdo_proc_stat) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_stat().");
-                       vdo_proc_stat = do_proc_stat(update_every, usec+susec);
+                       vdo_proc_stat = do_proc_stat(rrd_update_every, usec+susec);
                }
 
                if(!vdo_proc_meminfo) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_meminfo().");
-                       vdo_proc_meminfo = do_proc_meminfo(update_every, usec+susec);
+                       vdo_proc_meminfo = do_proc_meminfo(rrd_update_every, usec+susec);
                }
 
                if(!vdo_proc_vmstat) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_vmstat().");
-                       vdo_proc_vmstat = do_proc_vmstat(update_every, usec+susec);
+                       vdo_proc_vmstat = do_proc_vmstat(rrd_update_every, usec+susec);
                }
 
                if(!vdo_proc_net_rpc_nfsd) {
                        debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfsd().");
-                       vdo_proc_net_rpc_nfsd = do_proc_net_rpc_nfsd(update_every, usec+susec);
+                       vdo_proc_net_rpc_nfsd = do_proc_net_rpc_nfsd(rrd_update_every, usec+susec);
                }
 
                // END -- the job is done
@@ -109,8 +109,8 @@ void *proc_main(void *ptr)
                usec = usecdiff(&now, &last) - susec;
                debug(D_PROCNETDEV_LOOP, "PROCNETDEV: last loop took %llu usec (worked for %llu, sleeped for %llu).", usec + susec, usec, susec);
                
-               if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec;
-               else susec = update_every * 1000000ULL / 2ULL;
+               if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec;
+               else susec = rrd_update_every * 1000000ULL / 2ULL;
                
                // --------------------------------------------------------------------
 
@@ -119,61 +119,61 @@ void *proc_main(void *ptr)
                        unsigned long long cpuuser = me.ru_utime.tv_sec * 1000000ULL + me.ru_utime.tv_usec;
                        unsigned long long cpusyst = me.ru_stime.tv_sec * 1000000ULL + me.ru_stime.tv_usec;
 
-                       if(!stcpu) stcpu = rrd_stats_find("netdata.server_cpu");
+                       if(!stcpu) stcpu = rrdset_find("netdata.server_cpu");
                        if(!stcpu) {
-                               stcpu = rrd_stats_create("netdata", "server_cpu", NULL, "netdata", "NetData CPU usage", "milliseconds/s", 9999, update_every, CHART_TYPE_STACKED);
+                               stcpu = rrdset_create("netdata", "server_cpu", NULL, "netdata", "NetData CPU usage", "milliseconds/s", 9999, rrd_update_every, RRDSET_TYPE_STACKED);
 
-                               rrd_stats_dimension_add(stcpu, "user",  NULL,  1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(stcpu, "system", NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(stcpu, "user",  NULL,  1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(stcpu, "system", NULL, 1, 1000 * rrd_update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(stcpu);
+                       else rrdset_next(stcpu);
 
-                       rrd_stats_dimension_set(stcpu, "user", cpuuser);
-                       rrd_stats_dimension_set(stcpu, "system", cpusyst);
-                       rrd_stats_done(stcpu);
+                       rrddim_set(stcpu, "user", cpuuser);
+                       rrddim_set(stcpu, "system", cpusyst);
+                       rrdset_done(stcpu);
                        
                        bcopy(&me, &me_last, sizeof(struct rusage));
 
                        // ----------------------------------------------------------------
 
-                       if(!stclients) stclients = rrd_stats_find("netdata.clients");
+                       if(!stclients) stclients = rrdset_find("netdata.clients");
                        if(!stclients) {
-                               stclients = rrd_stats_create("netdata", "clients", NULL, "netdata", "NetData Web Clients", "connected clients", 11000, update_every, CHART_TYPE_LINE);
+                               stclients = rrdset_create("netdata", "clients", NULL, "netdata", "NetData Web Clients", "connected clients", 11000, rrd_update_every, RRDSET_TYPE_LINE);
 
-                               rrd_stats_dimension_add(stclients, "clients",  NULL,  1, 1, RRD_DIMENSION_ABSOLUTE);
+                               rrddim_add(stclients, "clients",  NULL,  1, 1, RRDDIM_ABSOLUTE);
                        }
-                       else rrd_stats_next(stclients);
+                       else rrdset_next(stclients);
 
-                       rrd_stats_dimension_set(stclients, "clients", global_statistics.connected_clients);
-                       rrd_stats_done(stclients);
+                       rrddim_set(stclients, "clients", global_statistics.connected_clients);
+                       rrdset_done(stclients);
 
                        // ----------------------------------------------------------------
 
-                       if(!streqs) streqs = rrd_stats_find("netdata.requests");
+                       if(!streqs) streqs = rrdset_find("netdata.requests");
                        if(!streqs) {
-                               streqs = rrd_stats_create("netdata", "requests", NULL, "netdata", "NetData Web Requests", "requests/s", 12000, update_every, CHART_TYPE_LINE);
+                               streqs = rrdset_create("netdata", "requests", NULL, "netdata", "NetData Web Requests", "requests/s", 12000, rrd_update_every, RRDSET_TYPE_LINE);
 
-                               rrd_stats_dimension_add(streqs, "requests",  NULL,  1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(streqs, "requests",  NULL,  1, 1 * rrd_update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(streqs);
+                       else rrdset_next(streqs);
 
-                       rrd_stats_dimension_set(streqs, "requests", global_statistics.web_requests);
-                       rrd_stats_done(streqs);
+                       rrddim_set(streqs, "requests", global_statistics.web_requests);
+                       rrdset_done(streqs);
 
                        // ----------------------------------------------------------------
 
-                       if(!stbytes) stbytes = rrd_stats_find("netdata.net");
+                       if(!stbytes) stbytes = rrdset_find("netdata.net");
                        if(!stbytes) {
-                               stbytes = rrd_stats_create("netdata", "net", NULL, "netdata", "NetData Network Traffic", "kilobits/s", 13000, update_every, CHART_TYPE_AREA);
+                               stbytes = rrdset_create("netdata", "net", NULL, "netdata", "NetData Network Traffic", "kilobits/s", 13000, rrd_update_every, RRDSET_TYPE_AREA);
 
-                               rrd_stats_dimension_add(stbytes, "in",  NULL,  8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(stbytes, "out",  NULL,  -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(stbytes, "in",  NULL,  8, 1024 * rrd_update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(stbytes, "out",  NULL,  -8, 1024 * rrd_update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(stbytes);
+                       else rrdset_next(stbytes);
 
-                       rrd_stats_dimension_set(stbytes, "in", global_statistics.bytes_received);
-                       rrd_stats_dimension_set(stbytes, "out", global_statistics.bytes_sent);
-                       rrd_stats_done(stbytes);
+                       rrddim_set(stbytes, "in", global_statistics.bytes_received);
+                       rrddim_set(stbytes, "out", global_statistics.bytes_sent);
+                       rrdset_done(stbytes);
                }
 
                usleep(susec);
index 627104954b9498f4f320ad63b440a90f6e061f12..018ad967bee9fb021c242b1f2029716ce5b3a4f6 100755 (executable)
 #define TC_LINE_MAX 1024
 
 struct tc_class {
-       char id[RRD_STATS_NAME_MAX + 1];
-       char name[RRD_STATS_NAME_MAX + 1];
+       char id[RRD_ID_LENGTH_MAX + 1];
+       char name[RRD_ID_LENGTH_MAX + 1];
 
-       char leafid[RRD_STATS_NAME_MAX + 1];
-       char parentid[RRD_STATS_NAME_MAX + 1];
+       char leafid[RRD_ID_LENGTH_MAX + 1];
+       char parentid[RRD_ID_LENGTH_MAX + 1];
 
        int hasparent;
        int isleaf;
@@ -33,9 +33,9 @@ struct tc_class {
 };
 
 struct tc_device {
-       char id[RRD_STATS_NAME_MAX + 1];
-       char name[RRD_STATS_NAME_MAX + 1];
-       char family[RRD_STATS_NAME_MAX + 1];
+       char id[RRD_ID_LENGTH_MAX + 1];
+       char name[RRD_ID_LENGTH_MAX + 1];
+       char family[RRD_ID_LENGTH_MAX + 1];
 
        struct tc_class *classes;
 };
@@ -81,43 +81,43 @@ void tc_device_commit(struct tc_device *d)
        char var_name[4096 + 1];
        snprintf(var_name, 4096, "qos for %s", d->id);
        if(config_get_boolean("plugin:tc", var_name, enable_new_interfaces)) {
-               RRD_STATS *st = rrd_stats_find_bytype(RRD_TYPE_TC, d->id);
+               RRDSET *st = rrdset_find_bytype(RRD_TYPE_TC, d->id);
                if(!st) {
                        debug(D_TC_LOOP, "TC: Committing new TC device '%s'", d->name);
 
-                       st = rrd_stats_create(RRD_TYPE_TC, d->id, d->name, d->family, "Class Usage", "kilobits/s", 1000, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create(RRD_TYPE_TC, d->id, d->name, d->family, "Class Usage", "kilobits/s", 1000, rrd_update_every, RRDSET_TYPE_STACKED);
 
                        for ( c = d->classes ; c ; c = c->next) {
                                if(c->isleaf && c->hasparent)
-                                       rrd_stats_dimension_add(st, c->id, c->name, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, c->id, c->name, 8, 1024 * rrd_update_every, RRDDIM_INCREMENTAL);
                        }
                }
                else {
-                       rrd_stats_next_plugins(st);
+                       rrdset_next_plugins(st);
 
-                       if(strcmp(d->id, d->name) != 0) rrd_stats_set_name(st, d->name);
+                       if(strcmp(d->id, d->name) != 0) rrdset_set_name(st, d->name);
                }
 
                for ( c = d->classes ; c ; c = c->next) {
                        if(c->isleaf && c->hasparent) {
-                               if(rrd_stats_dimension_set(st, c->id, c->bytes) != 0) {
+                               if(rrddim_set(st, c->id, c->bytes) != 0) {
                                        
                                        // new class, we have to add it
-                                       rrd_stats_dimension_add(st, c->id, c->name, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_set(st, c->id, c->bytes);
+                                       rrddim_add(st, c->id, c->name, 8, 1024 * rrd_update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_set(st, c->id, c->bytes);
                                }
 
                                // if it has a name, different to the id
                                if(strcmp(c->id, c->name) != 0) {
                                        // update the rrd dimension with the new name
-                                       RRD_DIMENSION *rd;
+                                       RRDDIM *rd;
                                        for(rd = st->dimensions ; rd ; rd = rd->next) {
-                                               if(strcmp(rd->id, c->id) == 0) { rrd_stats_dimension_set_name(st, rd, c->name); break; }
+                                               if(strcmp(rd->id, c->id) == 0) { rrddim_set_name(st, rd, c->name); break; }
                                        }
                                }
                        }
                }
-               rrd_stats_done(st);
+               rrdset_done(st);
        }
 }
 
@@ -126,7 +126,7 @@ void tc_device_set_class_name(struct tc_device *d, char *id, char *name)
        struct tc_class *c;
        for ( c = d->classes ; c ; c = c->next) {
                if(strcmp(c->id, id) == 0) {
-                       strncpy(c->name, name, RRD_STATS_NAME_MAX);
+                       strncpy(c->name, name, RRD_ID_LENGTH_MAX);
                        // no need for null termination - it is already null
                        break;
                }
@@ -135,13 +135,13 @@ void tc_device_set_class_name(struct tc_device *d, char *id, char *name)
 
 void tc_device_set_device_name(struct tc_device *d, char *name)
 {
-       strncpy(d->name, name, RRD_STATS_NAME_MAX);
+       strncpy(d->name, name, RRD_ID_LENGTH_MAX);
        // no need for null termination - it is already null
 }
 
 void tc_device_set_device_family(struct tc_device *d, char *name)
 {
-       strncpy(d->family, name, RRD_STATS_NAME_MAX);
+       strncpy(d->family, name, RRD_ID_LENGTH_MAX);
        // no need for null termination - it is already null
 }
 
@@ -155,7 +155,7 @@ struct tc_device *tc_device_create(char *name)
                return NULL;
        }
 
-       strncpy(d->id, name, RRD_STATS_NAME_MAX);
+       strncpy(d->id, name, RRD_ID_LENGTH_MAX);
        strcpy(d->name, d->id);
        strcpy(d->family, d->id);
 
@@ -177,10 +177,10 @@ struct tc_class *tc_class_add(struct tc_device *n, char *id, char *parentid, cha
        c->next = n->classes;
        n->classes = c;
 
-       strncpy(c->id, id, RRD_STATS_NAME_MAX);
+       strncpy(c->id, id, RRD_ID_LENGTH_MAX);
        strcpy(c->name, c->id);
-       if(parentid) strncpy(c->parentid, parentid, RRD_STATS_NAME_MAX);
-       if(leafid) strncpy(c->leafid, leafid, RRD_STATS_NAME_MAX);
+       if(parentid) strncpy(c->parentid, parentid, RRD_ID_LENGTH_MAX);
+       if(leafid) strncpy(c->leafid, leafid, RRD_ID_LENGTH_MAX);
 
        // no need for null termination on the strings, because of calloc()
 
@@ -217,7 +217,7 @@ void *tc_main(void *ptr)
                struct tc_device *device = NULL;
                struct tc_class *class = NULL;
 
-               snprintf(buffer, TC_LINE_MAX, "exec %s %d", config_get("plugin:tc", "script to run to get tc values", PLUGINS_DIR "/tc-qos-helper.sh"), update_every);
+               snprintf(buffer, TC_LINE_MAX, "exec %s %d", config_get("plugin:tc", "script to run to get tc values", PLUGINS_DIR "/tc-qos-helper.sh"), rrd_update_every);
                debug(D_TC_LOOP, "executing '%s'", buffer);
                // fp = popen(buffer, "r");
                fp = mypopen(buffer, &tc_child_pid);
@@ -331,7 +331,7 @@ void *tc_main(void *ptr)
                        class = NULL;
                }
 
-               sleep(update_every);
+               sleep(rrd_update_every);
        }
 
        return NULL;
index 20a924f7e5306c438415a7f2050d5ff965adaa95..bdfa3ff109823350a707752309c1031f0dc62835 100755 (executable)
@@ -1,5 +1,5 @@
 ifndef BIN_DIR\r
-BIN_DIR = "$(PWD)"\r
+BIN_DIR = "."\r
 endif\r
 \r
 ifndef CONFIG_DIR\r
@@ -16,13 +16,16 @@ endif
 \r
 COMMON_FLAGS = BIN_DIR='$(BIN_DIR)' CONFIG_DIR='$(CONFIG_DIR)' LOG_DIR='$(LOG_DIR)' PLUGINS_DIR='$(PLUGINS_DIR)'\r
 \r
-CC = gcc\r
+CC := gcc\r
+libs :=\r
 \r
 ifdef debug\r
 COMMON_FLAGS += debug=1\r
-CFLAGS = -Wall -Wextra -ggdb -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)'\r
+# CFLAGS = -Wall -Wextra -ggdb -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fsanitize=address -fno-omit-frame-pointer\r
+CFLAGS := -Wall -Wextra -O -g -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fsanitize=address -fno-omit-frame-pointer\r
+#libs += -ltsan -lpie\r
 else\r
-CFLAGS = -Wall -Wextra -O3 -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)'\r
+CFLAGS := -Wall -Wextra -O3 -DBIN_DIR='$(BIN_DIR)' -DCONFIG_DIR='$(CONFIG_DIR)' -DLOG_DIR='$(LOG_DIR)' -DPLUGINS_DIR='$(PLUGINS_DIR)' -fomit-frame-pointer\r
 endif\r
 \r
 all: options plugins\r
@@ -33,8 +36,7 @@ options:
 plugins: apps.plugin\r
 \r
 apps.plugin: apps_plugin.c\r
-       @echo "    $(CC) $@"\r
-       @$(CC) $(CFLAGS) -o $@ apps_plugin.c\r
+       $(CC) $(CFLAGS) -o $@ apps_plugin.c ../avl.o ../common.o ../log.o ../procfile.o $(libs)\r
 \r
 clean:\r
        -rm -f *.o apps.plugin core\r
index 868168e2acd9a8ec8ce0f5962d8501e87b9d2445..e30e8b3b2827a82489aebc88f0b505f7989cba55 100755 (executable)
 #include <dirent.h>
 #include <arpa/inet.h>
 
+#include "../common.h"
+#include "../log.h"
+#include "../avl.h"
+#include "../procfile.h"
+
 #define MAX_COMPARE_NAME 15
 #define MAX_NAME 100
 
@@ -42,66 +47,47 @@ unsigned long long file_counter = 0;
 // ----------------------------------------------------------------------------
 // helper functions
 
-unsigned long long usecdiff(struct timeval *now, struct timeval *last) {
-               return ((((now->tv_sec * 1000000ULL) + now->tv_usec) - ((last->tv_sec * 1000000ULL) + last->tv_usec)));
-}
-
-char *trim(char *s)
-{
-       // skip leading spaces
-       while(*s && isspace(*s)) s++;
-       if(!*s) return NULL;
-
-       // skip tailing spaces
-       int c = strlen(s) - 1;
-       while(c >= 0 && isspace(s[c])) {
-               s[c] = '\0';
-               c--;
-       }
-       if(c < 0) return NULL;
-       if(!*s) return NULL;
-       return s;
-}
-
-unsigned long simple_hash(const char *name)
-{
-       int i, len = strlen(name);
-       unsigned long hash = 0;
-
-       for(i = 0; i < len ;i++) hash += (i * name[i]) + i + name[i];
+long get_processors(void) {
+       int processors = 0;
 
-       return hash;
-}
+       procfile *ff = procfile_open("/proc/stat", O_RDONLY);
+       if(!ff) return 1;
 
-long get_processors(void)
-{
-       char buffer[1025], *s;
-       int processors = 0;
+       ff = procfile_readall(ff);
+       if(!ff) {
+               procfile_close(ff);
+               return 1;
+       }
 
-       FILE *fp = fopen("/proc/stat", "r");
-       if(!fp) return 1;
+       unsigned int i;
+       for(i = 0; i < procfile_lines(ff); i++) {
+               if(!procfile_linewords(ff, i)) continue;
 
-       while((s = fgets(buffer, 1024, fp))) {
-               if(strncmp(buffer, "cpu", 3) == 0) processors++;
+               if(strncmp(procfile_lineword(ff, i, 0), "cpu", 3) == 0) processors++;
        }
-       fclose(fp);
        processors--;
        if(processors < 1) processors = 1;
+
+       procfile_close(ff);
        return processors;
 }
 
-long get_pid_max(void)
-{
-       char buffer[1025], *s;
+long get_pid_max(void) {
        long mpid = 32768;
 
-       FILE *fp = fopen("/proc/sys/kernel/pid_max", "r");
-       if(!fp) return 1;
+       procfile *ff = procfile_open("/proc/sys/kernel/pid_max", O_RDONLY);
+       if(!ff) return mpid;
 
-       s = fgets(buffer, 1024, fp);
-       if(s) mpid = atol(buffer);
-       fclose(fp);
-       if(mpid < 32768) mpid = 32768;
+       ff = procfile_readall(ff);
+       if(!ff) {
+               procfile_close(ff);
+               return mpid;
+       }
+
+       mpid = atol(procfile_lineword(ff, 0, 0));
+       if(mpid) mpid = 32768;
+
+       procfile_close(ff);
        return mpid;
 }
 
@@ -122,7 +108,7 @@ unsigned long long get_hertz(void)
        hz = (sizeof(long)==sizeof(int) || htons(999)==999) ? 100UL : 1024UL;
 #endif
 
-       fprintf(stderr, "apps.plugin: ERROR: unknown HZ value. Assuming %llu.\n", hz);
+       error("apps.plugin: ERROR: unknown HZ value. Assuming %llu.", hz);
        return hz;
 }
 
@@ -215,7 +201,7 @@ struct target *get_target(const char *id, struct target *target)
        
        w = calloc(sizeof(struct target), 1);
        if(!w) {
-               fprintf(stderr, "apps.plugin: cannot allocate %lu bytes of memory\n", (unsigned long)sizeof(struct target));
+               error("apps.plugin: cannot allocate %lu bytes of memory", (unsigned long)sizeof(struct target));
                return NULL;
        }
 
@@ -245,7 +231,7 @@ int read_process_groups(const char *name)
        if(debug) fprintf(stderr, "apps.plugin: process groups file: '%s'\n", filename);
        FILE *fp = fopen(filename, "r");
        if(!fp) {
-               fprintf(stderr, "apps.plugin: ERROR: cannot open file '%s' (%s)\n", filename, strerror(errno));
+               error("apps.plugin: ERROR: cannot open file '%s' (%s)", filename, strerror(errno));
                return 1;
        }
 
@@ -306,7 +292,7 @@ int read_process_groups(const char *name)
                }
 
                if(w) strncpy(w->name, t, MAX_NAME);
-               if(!count) fprintf(stderr, "apps.plugin: ERROR: the line %ld on file '%s', for group '%s' does not state any process names.\n", line, filename, t);
+               if(!count) error("apps.plugin: ERROR: the line %ld on file '%s', for group '%s' does not state any process names.", line, filename, t);
        }
        fclose(fp);
 
@@ -429,13 +415,13 @@ struct pid_stat *get_entry(pid_t pid)
 
        all_pids[pid] = calloc(sizeof(struct pid_stat), 1);
        if(!all_pids[pid]) {
-               fprintf(stderr, "apps.plugin: ERROR: Cannot allocate %lu bytes of memory", (unsigned long)sizeof(struct pid_stat));
+               error("apps.plugin: ERROR: Cannot allocate %lu bytes of memory", (unsigned long)sizeof(struct pid_stat));
                return NULL;
        }
 
        all_pids[pid]->fds = calloc(sizeof(int), 100);
        if(!all_pids[pid]->fds)
-               fprintf(stderr, "apps.plugin: ERROR: Cannot allocate %ld bytes of memory\n", (unsigned long)(sizeof(int) * 100));
+               error("apps.plugin: ERROR: Cannot allocate %ld bytes of memory", (unsigned long)(sizeof(int) * 100));
        else all_pids[pid]->fds_size = 100;
 
        if(root) root->prev = all_pids[pid];
@@ -506,16 +492,53 @@ int walk_down(pid_t pid, int level) {
 // this is used to keep a global list of all open files of the system
 // it is needed in order to figure out the unique files a process tree has open
 
+#define FILE_DESCRIPTORS_INCREASE_STEP 100
+
 struct file_descriptor {
+       avl avl;
+       unsigned long magic;
        unsigned long hash;
-       char *name;
+       const char *name;
        int type;
        long count;
+       long pos;
 } *all_files = NULL;
 
 int all_files_len = 0;
 int all_files_size = 0;
 
+int file_descriptor_compare(void* a, void* b) {
+       if(((struct file_descriptor *)a)->magic != 0x0BADCAFE || ((struct file_descriptor *)b)->magic != 0x0BADCAFE)
+               error("Corrupted index data detected. Please report this.");
+
+       if(((struct file_descriptor *)a)->hash < ((struct file_descriptor *)b)->hash)
+               return -1;
+       else if(((struct file_descriptor *)a)->hash > ((struct file_descriptor *)b)->hash)
+               return 1;
+       else return strcmp(((struct file_descriptor *)a)->name, ((struct file_descriptor *)b)->name);
+}
+int file_descriptor_iterator(avl *a) { if(a) {}; return 0; }
+
+avl_tree all_files_index = {
+               NULL,
+               file_descriptor_compare
+};
+
+static struct file_descriptor *file_descriptor_find(const char *name, unsigned long hash) {
+       struct file_descriptor *result = NULL, tmp;
+       tmp.hash = (hash)?hash:simple_hash(name);
+       tmp.name = name;
+       tmp.count = 0;
+       tmp.pos = 0;
+       tmp.magic = 0x0BADCAFE;
+
+       avl_search(&all_files_index, (avl *)&tmp, file_descriptor_iterator, (avl **)&result);
+       return result;
+}
+
+#define file_descriptor_add(fd) avl_insert(&all_files_index, (avl *)(fd))
+#define file_descriptor_remove(fd) avl_remove(&all_files_index, (avl *)(fd))
+
 #define FILETYPE_OTHER 0
 #define FILETYPE_FILE 1
 #define FILETYPE_PIPE 2
@@ -528,19 +551,91 @@ int all_files_size = 0;
 
 void file_descriptor_not_used(int id)
 {
-       if(id > 0 && id < all_files_len) {
-               if(all_files[id].count > 0)
+       if(id > 0 && id < all_files_size) {
+               if(all_files[id].magic != 0x0BADCAFE) {
+                       error("Ignoring request to remove empty file id %d.", id);
+                       return;
+               }
+
+               if(all_files[id].count > 0) {
                        all_files[id].count--;
+
+                       if(!all_files[id].count) {
+                               file_descriptor_remove(&all_files[id]);
+                               all_files[id].magic = 0x00000000;
+                               all_files_len--;
+                       }
+               }
                else
-                       fprintf(stderr, "apps.plugin: ERROR: request to decrease counter of fd %d (%s), while the use counter is 0\n", id, all_files[id].name);
+                       error("apps.plugin: ERROR: request to decrease counter of fd %d (%s), while the use counter is 0", id, all_files[id].name);
        }
-       else    fprintf(stderr, "apps.plugin: ERROR: request to decrease counter of fd %d, which is outside the array size (1 to %d)\n", id, all_files_len);
+       else    error("apps.plugin: ERROR: request to decrease counter of fd %d, which is outside the array size (1 to %d)", id, all_files_size);
 }
 
 unsigned long file_descriptor_find_or_add(const char *name)
 {
-       int type = FILETYPE_OTHER;
+       static int last_pos = 0;
+       unsigned long hash = simple_hash(name);
 
+       if(debug) fprintf(stderr, "apps.plugin: adding or finding name '%s' with hash %lu\n", name, hash);
+
+       struct file_descriptor *fd = file_descriptor_find(name, hash);
+       if(fd) {
+               // found
+               fd->count++;
+               return fd->pos;
+       }
+       // not found
+
+       // check we have enough memory to add it
+       if(!all_files || all_files_len == all_files_size) {
+               void *old = all_files;
+
+               // there is no empty slot
+               if(debug) fprintf(stderr, "apps.plugin: extending fd array to %d entries\n", all_files_size + FILE_DESCRIPTORS_INCREASE_STEP);
+               all_files = realloc(all_files, (all_files_size + FILE_DESCRIPTORS_INCREASE_STEP) * sizeof(struct file_descriptor));
+
+               // if the address changed, we have to rebuild the index
+               // since all pointers are now invalid
+               if(old && old != (void *)all_files) {
+                       if(debug) fprintf(stderr, "apps.plugin: re-indexing.\n");
+                       all_files_index.root = NULL;
+                       int i;
+                       for(i = 0; i < all_files_size; i++) {
+                               if(!all_files[i].count) continue;
+                               file_descriptor_add(&all_files[i]);
+                       }
+               }
+
+               if(!all_files_size) all_files_len = 1;
+               all_files_size += FILE_DESCRIPTORS_INCREASE_STEP;
+       }
+
+       // search for an empty slot
+       int i, c;
+       for(i = 0, c = last_pos ; i < all_files_size ; i++, c++) {
+               if(c >= all_files_size) c = 0;
+               if(c == 0) continue;
+
+               if(!all_files[c].count) {
+                       if(all_files[c].magic == 0x0BADCAFE && all_files[c].name && file_descriptor_find(all_files[c].name, all_files[c].hash))
+                               error("apps.plugin: fd on position %d is not cleared properly. It still has %s in it.\n", c, all_files[c].name);
+
+                       if(debug) fprintf(stderr, "apps.plugin: re-using fd position %d for %s (last name: %s)\n", c, name, all_files[c].name);
+                       if(all_files[c].name) free((void *)all_files[c].name);
+                       all_files[c].name = NULL;
+                       break;
+               }
+       }
+       if(i == all_files_size) {
+               error("We should find an empty slot, but there isn't any");
+               return 0;
+       }
+       all_files_len++;
+
+       // else we have an empty slot in 'c'
+
+       int type = FILETYPE_OTHER;
        if(name[0] == '/') type = FILETYPE_FILE;
        else if(strncmp(name, "pipe:", 5) == 0) type = FILETYPE_PIPE;
        else if(strncmp(name, "socket:", 7) == 0) type = FILETYPE_SOCKET;
@@ -558,55 +653,14 @@ unsigned long file_descriptor_find_or_add(const char *name)
                type = FILETYPE_OTHER;
        }
 
-       // init
-       if(!all_files) {
-               all_files = malloc(1024 * sizeof(struct file_descriptor));
-               if(!all_files) return 0;
-
-               all_files_size = 1024;
-               all_files_len = 1; // start from 1, skip 0
-               if(debug) fprintf(stderr, "apps.plugin: initialized fd array to %d entries\n", all_files_size);
-       }
-
-       // try to find it
-       unsigned long hash = simple_hash(name);
-       int c;
-       for( c = 0 ; c < all_files_len ; c++) {
-               if(all_files[c].hash == hash && strcmp(all_files[c].name, name) == 0) break;
-       }
-
-       // found it
-       if(c < all_files_len) {
-               all_files[c].count++;
-               return c;
-       }
-
-       // not found, search for an empty slot
-       for(c = 0 ; c < all_files_len ; c++) {
-               if(!all_files[c].count) {
-                       if(debug) fprintf(stderr, "apps.plugin: re-using fd position %d (last name: %s)\n", c, all_files[c].name);
-                       if(all_files[c].name) free(all_files[c].name);
-                       break;
-               }
-       }
-
-       if(c == all_files_len) {
-               // not found any emtpty slot
-               all_files_len++;
-
-               if(c >= all_files_size) {
-                       // not enough memory - extend it
-                       if(debug) fprintf(stderr, "apps.plugin: extending fd array to %d entries\n", all_files_size + 1024);
-                       all_files = realloc(all_files, (all_files_size + 1024) * sizeof(struct file_descriptor));
-                       all_files_size += 1024;
-               }
-       }
-       // else we have the slot in 'c'
-
        all_files[c].name = strdup(name);
        all_files[c].hash = hash;
        all_files[c].type = type;
-       all_files[c].count++;
+       all_files[c].pos  = c;
+       all_files[c].count = 1;
+       all_files[c].magic = 0x0BADCAFE;
+
+       file_descriptor_add(&all_files[c]);
 
        if(debug) fprintf(stderr, "apps.plugin: using fd position %d (name: %s)\n", c, all_files[c].name);
 
@@ -671,7 +725,7 @@ int update_from_proc(void)
                if(fd == -1) {
                        if(errno != ENOENT && errno != ESRCH) {
                                if(!count_errors++ || debug)
-                                       fprintf(stderr, "apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).\n", filename, errno, strerror(errno));
+                                       error("apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).", filename, errno, strerror(errno));
                        }
                        continue;
                }
@@ -682,7 +736,7 @@ int update_from_proc(void)
 
                if(bytes == -1) {
                        if(!count_errors++ || debug)
-                               fprintf(stderr, "apps.plugin: ERROR: cannot read from file '%s' (%s).\n", filename, strerror(errno));
+                               error("apps.plugin: ERROR: cannot read from file '%s' (%s).", filename, strerror(errno));
                        continue;
                }
 
@@ -734,7 +788,7 @@ int update_from_proc(void)
 
                if(parsed < 39) {
                        if(!count_errors++ || debug || (p->target && p->target->debug))
-                               fprintf(stderr, "apps.plugin: ERROR: file %s gave %d results (expected 44)\n", filename, parsed);
+                               error("apps.plugin: ERROR: file %s gave %d results (expected 44)\n", filename, parsed);
                }
 
                // check if it is target
@@ -767,7 +821,7 @@ int update_from_proc(void)
                if(fd == -1) {
                        if(errno != ENOENT && errno != ESRCH) {
                                if(!count_errors++ || debug || (p->target && p->target->debug))
-                                       fprintf(stderr, "apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).\n", filename, errno, strerror(errno));
+                                       error("apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).", filename, errno, strerror(errno));
                        }
                }
                else {
@@ -777,7 +831,7 @@ int update_from_proc(void)
 
                        if(bytes == -1) {
                                if(!count_errors++ || debug || (p->target && p->target->debug))
-                                       fprintf(stderr, "apps.plugin: ERROR: cannot read from file '%s' (%s).\n", filename, strerror(errno));
+                                       error("apps.plugin: ERROR: cannot read from file '%s' (%s).", filename, strerror(errno));
                        }
                        else if(bytes > 10) {
                                buffer[bytes] = '\0';
@@ -797,7 +851,7 @@ int update_from_proc(void)
 
                                if(parsed < 7) {
                                        if(!count_errors++ || debug || (p->target && p->target->debug))
-                                               fprintf(stderr, "apps.plugin: ERROR: file %s gave %d results (expected 7)\n", filename, parsed);
+                                               error("apps.plugin: ERROR: file %s gave %d results (expected 7)", filename, parsed);
                                }
                        }
                }
@@ -810,7 +864,7 @@ int update_from_proc(void)
                if(fd == -1) {
                        if(errno != ENOENT && errno != ESRCH) {
                                if(!count_errors++ || debug || (p->target && p->target->debug))
-                                       fprintf(stderr, "apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).\n", filename, errno, strerror(errno));
+                                       error("apps.plugin: ERROR: cannot open file '%s' for reading (%d, %s).", filename, errno, strerror(errno));
                        }
                }
                else {
@@ -820,7 +874,7 @@ int update_from_proc(void)
 
                        if(bytes == -1) {
                                if(!count_errors++ || debug || (p->target && p->target->debug))
-                                       fprintf(stderr, "apps.plugin: ERROR: cannot read from file '%s' (%s).\n", filename, strerror(errno));
+                                       error("apps.plugin: ERROR: cannot read from file '%s' (%s).", filename, strerror(errno));
                        }
                        else if(bytes > 10) {
                                buffer[bytes] = '\0';
@@ -839,7 +893,7 @@ int update_from_proc(void)
 
                                if(parsed < 7) {
                                        if(!count_errors++ || debug || (p->target && p->target->debug))
-                                               fprintf(stderr, "apps.plugin: ERROR: file %s gave %d results (expected 7)\n", filename, parsed);
+                                               error("apps.plugin: ERROR: file %s gave %d results (expected 7)", filename, parsed);
                                }
                        }
                }
@@ -869,7 +923,7 @@ int update_from_proc(void)
                                        if(debug) fprintf(stderr, "apps.plugin: extending fd memory slots for %s from %d to %d\n", p->comm, p->fds_size, fdid + 100);
                                        p->fds = realloc(p->fds, (fdid + 100) * sizeof(int));
                                        if(!p->fds) {
-                                               fprintf(stderr, "apps.plugin: ERROR: cannot re-allocate fds for %s\n", p->comm);
+                                               error("apps.plugin: ERROR: cannot re-allocate fds for %s", p->comm);
                                                break;
                                        }
 
@@ -886,7 +940,7 @@ int update_from_proc(void)
                                        if(l == -1) {
                                                if(debug || (p->target && p->target->debug)) {
                                                        if(!count_errors++ || debug || (p->target && p->target->debug))
-                                                               fprintf(stderr, "apps.plugin: ERROR: cannot read link %s\n", fdname);
+                                                               error("apps.plugin: ERROR: cannot read link %s", fdname);
                                                }
                                                continue;
                                        }
@@ -919,7 +973,7 @@ int update_from_proc(void)
                p->updated = 1;
        }
        if(count_errors > 1000) {
-               fprintf(stderr, "apps.plugin: ERROR: %ld more errors encountered\n", count_errors - 1);
+               error("apps.plugin: ERROR: %ld more errors encountered\n", count_errors - 1);
                count_errors = 0;
        }
 
@@ -957,7 +1011,7 @@ void update_statistics(void)
                        p->parent = all_pids[p->ppid];
                        p->parent->childs++;
                }
-               else if(p->ppid != 0) fprintf(stderr, "apps.plugin: \t\tWRONG! pid %d %s states parent %d, but the later does not exist.\n", p->pid, p->comm, p->ppid);
+               else if(p->ppid != 0) error("apps.plugin: \t\tWRONG! pid %d %s states parent %d, but the later does not exist.", p->pid, p->comm, p->ppid);
        }
 
        // find all the procs with 0 childs and merge them to their parents
@@ -1025,7 +1079,7 @@ void update_statistics(void)
        for(p = root; p ; p = p->next) {
                if(p->updated) continue;
 
-               fprintf(stderr, "apps.plugin: UNMERGING %d %s\n", p->pid, p->comm);
+               if(debug) fprintf(stderr, "apps.plugin: UNMERGING %d %s\n", p->pid, p->comm);
 
                unsigned long long diff_utime = p->utime + p->cutime + p->fix_cutime;
                unsigned long long diff_stime = p->stime + p->cstime + p->fix_cstime;
@@ -1042,35 +1096,35 @@ void update_statistics(void)
                                diff_utime -= x;
                                t->diff_cutime -= x;
                                t->fix_cutime += x;
-                               fprintf(stderr, "apps.plugin: \t cutime %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name);
+                               if(debug) fprintf(stderr, "apps.plugin: \t cutime %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name);
                        }
                        if(diff_stime && t->diff_cstime) {
                                x = (t->diff_cstime < diff_stime)?t->diff_cstime:diff_stime;
                                diff_stime -= x;
                                t->diff_cstime -= x;
                                t->fix_cstime += x;
-                               fprintf(stderr, "apps.plugin: \t cstime %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name);
+                               if(debug) fprintf(stderr, "apps.plugin: \t cstime %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name);
                        }
                        if(diff_minflt && t->diff_cminflt) {
                                x = (t->diff_cminflt < diff_minflt)?t->diff_cminflt:diff_minflt;
                                diff_minflt -= x;
                                t->diff_cminflt -= x;
                                t->fix_cminflt += x;
-                               fprintf(stderr, "apps.plugin: \t cminflt %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name);
+                               if(debug) fprintf(stderr, "apps.plugin: \t cminflt %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name);
                        }
                        if(diff_majflt && t->diff_cmajflt) {
                                x = (t->diff_cmajflt < diff_majflt)?t->diff_cmajflt:diff_majflt;
                                diff_majflt -= x;
                                t->diff_cmajflt -= x;
                                t->fix_cmajflt += x;
-                               fprintf(stderr, "apps.plugin: \t cmajflt %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name);
+                               if(debug) fprintf(stderr, "apps.plugin: \t cmajflt %llu from %d %s %s\n", x, t->pid, t->comm, t->target->name);
                        }
                }
 
-               if(diff_utime) fprintf(stderr, "apps.plugin: \t cannot fix up utime %llu\n", diff_utime);
-               if(diff_stime) fprintf(stderr, "apps.plugin: \t cannot fix up stime %llu\n", diff_stime);
-               if(diff_minflt) fprintf(stderr, "apps.plugin: \t cannot fix up minflt %llu\n", diff_minflt);
-               if(diff_majflt) fprintf(stderr, "apps.plugin: \t cannot fix up majflt %llu\n", diff_majflt);
+               if(diff_utime) error("apps.plugin: \t cannot fix up utime %llu", diff_utime);
+               if(diff_stime) error("apps.plugin: \t cannot fix up stime %llu", diff_stime);
+               if(diff_minflt) error("apps.plugin: \t cannot fix up minflt %llu", diff_minflt);
+               if(diff_majflt) error("apps.plugin: \t cannot fix up majflt %llu", diff_majflt);
        }
 #endif
 
@@ -1080,9 +1134,9 @@ void update_statistics(void)
        for (w = target_root; w ; w = w->next) {
                targets++;
 
-               w->fds = calloc(sizeof(int), all_files_len);
+               w->fds = calloc(sizeof(int), all_files_size);
                if(!w->fds)
-                       fprintf(stderr, "apps.plugin: ERROR: cannot allocate memory for fds in %s\n", w->name);
+                       error("apps.plugin: ERROR: cannot allocate memory for fds in %s", w->name);
        
                w->minflt = 0;
                w->majflt = 0;
@@ -1120,7 +1174,7 @@ void update_statistics(void)
        // concentrate everything on the targets
        for(p = root; p ; p = p->next) {
                if(!p->target) {
-                       fprintf(stderr, "apps.plugin: ERROR: pid %d %s was left without a target!\n", p->pid, p->comm);
+                       error("apps.plugin: ERROR: pid %d %s was left without a target!", p->pid, p->comm);
                        continue;
                }
 
@@ -1158,11 +1212,11 @@ void update_statistics(void)
 
                        for(c = 0; c < p->fds_size ;c++) {
                                if(p->fds[c] == 0) continue;
-                               if(p->fds[c] > 0 && p->fds[c] < all_files_len) {
+                               if(p->fds[c] < all_files_size) {
                                        if(p->target->fds) p->target->fds[p->fds[c]]++;
                                }
                                else
-                                       fprintf(stderr, "apps.plugin: ERROR: invalid fd number %d\n", p->fds[c]);
+                                       error("apps.plugin: ERROR: invalid fd number %d", p->fds[c]);
                        }
 
                        if(debug || p->target->debug) fprintf(stderr, "apps.plugin: \tAgregating %s pid %d on %s utime=%llu, stime=%llu, cutime=%llu, cstime=%llu, minflt=%llu, majflt=%llu, cminflt=%llu, cmajflt=%llu\n", p->comm, p->pid, p->target->name, p->utime, p->stime, p->cutime, p->cstime, p->minflt, p->majflt, p->cminflt, p->cmajflt);
@@ -1242,7 +1296,7 @@ void update_statistics(void)
                w->openeventpolls = 0;
                w->openother = 0;
 
-               for(c = 1; c < all_files_len ;c++) {
+               for(c = 1; c < all_files_size ;c++) {
                        if(w->fds && w->fds[c] > 0) switch(all_files[c].type) {
                                case FILETYPE_FILE:
                                        w->openfiles++;
@@ -1627,7 +1681,7 @@ void parse_args(int argc, char **argv)
                        continue;
                }
 
-               fprintf(stderr, "apps.plugin: ERROR: cannot understand option %s\n", argv[i]);
+               error("apps.plugin: ERROR: cannot understand option %s", argv[i]);
                exit(1);
        }
 
@@ -1635,13 +1689,15 @@ void parse_args(int argc, char **argv)
        if(!name) name = "groups";
 
        if(read_process_groups(name)) {
-               fprintf(stderr, "apps.plugin: ERROR: cannot read process groups %s\n", name);
+               error("apps.plugin: ERROR: cannot read process groups %s", name);
                exit(1);
        }
 }
 
 int main(int argc, char **argv)
 {
+       // debug_flags = D_PROCFILE;
+
        unsigned long started_t = time(NULL), current_t;
        Hertz = get_hertz();
        pid_max = get_pid_max();
@@ -1651,7 +1707,7 @@ int main(int argc, char **argv)
 
        all_pids = calloc(sizeof(struct pid_stat *), pid_max);
        if(!all_pids) {
-               fprintf(stderr, "apps.plugin: ERROR: cannot allocate %lu bytes of memory.\n", sizeof(struct pid_stat *) * pid_max);
+               error("apps.plugin: ERROR: cannot allocate %lu bytes of memory.", sizeof(struct pid_stat *) * pid_max);
                printf("DISABLE\n");
                exit(1);
        }
@@ -1663,7 +1719,7 @@ int main(int argc, char **argv)
 
        for(;1; counter++) {
                if(!update_from_proc()) {
-                       fprintf(stderr, "apps.plugin: ERROR: cannot allocate %lu bytes of memory.\n", sizeof(struct pid_stat *) * pid_max);
+                       error("apps.plugin: ERROR: cannot allocate %lu bytes of memory.", sizeof(struct pid_stat *) * pid_max);
                        printf("DISABLE\n");
                        exit(1);
                }
index 21430984a69d4595c5d64ab79541f9e2e7afa97d..4c9f8e8505b4aeb19f7b7969fe44ee4657fec33f 100755 (executable)
@@ -32,7 +32,7 @@ void *pluginsd_worker_thread(void *arg)
                        break;
                }
 
-               RRD_STATS *st = NULL;
+               RRDSET *st = NULL;
 
                unsigned long long count = 0;
                while(fgets(line, PLUGINSD_LINE_MAX, fp) != NULL) {
@@ -64,7 +64,7 @@ void *pluginsd_worker_thread(void *arg)
                                }
 
                                if(st->debug) debug(D_PLUGINSD, "PLUGINSD: '%s' is setting dimension %s/%s to %s", cd->fullfilename, st->id, dimension, value);
-                               rrd_stats_dimension_set(st, dimension, atoll(value));
+                               rrddim_set(st, dimension, atoll(value));
 
                                count++;
                        }
@@ -79,7 +79,7 @@ void *pluginsd_worker_thread(void *arg)
                                        break;
                                }
 
-                               st = rrd_stats_find(id);
+                               st = rrdset_find(id);
                                if(!st) {
                                        error("PLUGINSD: '%s' is requesting a BEGIN on chart '%s', which does not exist. Disabling it.", cd->fullfilename, id);
                                        cd->enabled = 0;
@@ -90,8 +90,8 @@ void *pluginsd_worker_thread(void *arg)
                                if(st->counter_done) {
                                        unsigned long long microseconds = 0;
                                        if(microseconds_txt && *microseconds_txt) microseconds = strtoull(microseconds_txt, NULL, 10);
-                                       if(microseconds) rrd_stats_next_usec(st, microseconds);
-                                       else rrd_stats_next_plugins(st);
+                                       if(microseconds) rrdset_next_usec(st, microseconds);
+                                       else rrdset_next_plugins(st);
                                }
                        }
                        else if(!strcmp(s, "END")) {
@@ -104,7 +104,7 @@ void *pluginsd_worker_thread(void *arg)
 
                                if(st->debug) debug(D_PLUGINSD, "PLUGINSD: '%s' is requesting a END on chart %s", cd->fullfilename, st->id);
 
-                               rrd_stats_done(st);
+                               rrdset_done(st);
                                st = NULL;
                        }
                        else if(!strcmp(s, "FLUSH")) {
@@ -143,26 +143,26 @@ void *pluginsd_worker_thread(void *arg)
                                if(update_every_s) update_every = atoi(update_every_s);
                                if(!update_every) update_every = cd->update_every;
 
-                               int chart_type = CHART_TYPE_LINE;
-                               if(chart) chart_type = chart_type_id(chart);
+                               int chart_type = RRDSET_TYPE_LINE;
+                               if(chart) chart_type = rrdset_type_id(chart);
 
                                if(!name || !*name) name = NULL;
                                if(!family || !*family) family = id;
                                if(!category || !*category) category = type;
 
-                               st = rrd_stats_find_bytype(type, id);
+                               st = rrdset_find_bytype(type, id);
                                if(!st) {
                                        debug(D_PLUGINSD, "PLUGINSD: Creating chart type='%s', id='%s', name='%s', family='%s', category='%s', chart='%s', priority=%d, update_every=%d"
                                                , type, id
                                                , name?name:""
                                                , family?family:""
                                                , category?category:""
-                                               , chart_type_name(chart_type)
+                                               , rrdset_type_name(chart_type)
                                                , priority
                                                , update_every
                                                );
 
-                                       st = rrd_stats_create(type, id, name, family, title, units, priority, update_every, chart_type);
+                                       st = rrdset_create(type, id, name, family, title, units, priority, update_every, chart_type);
                                        cd->update_every = update_every;
 
                                        if(strcmp(category, "none") == 0) st->isdetail = 1;
@@ -205,15 +205,15 @@ void *pluginsd_worker_thread(void *arg)
                                        , st->id
                                        , id
                                        , name?name:""
-                                       , algorithm_name(algorithm_id(algorithm))
+                                       , rrddim_algorithm_name(rrddim_algorithm_id(algorithm))
                                        , multiplier
                                        , divisor
                                        , hidden?hidden:""
                                        );
 
-                               RRD_DIMENSION *rd = rrd_stats_dimension_find(st, id);
+                               RRDDIM *rd = rrddim_find(st, id);
                                if(!rd) {
-                                       rd = rrd_stats_dimension_add(st, id, name, multiplier, divisor, algorithm_id(algorithm));
+                                       rd = rrddim_add(st, id, name, multiplier, divisor, rrddim_algorithm_id(algorithm));
                                        if(hidden && strcmp(hidden, "hidden") == 0) rd->hidden = 1;
                                }
                                else if(st->debug) debug(D_PLUGINSD, "PLUGINSD: dimension %s/%s already exists. Not adding it again.", st->id, id);
@@ -238,14 +238,14 @@ void *pluginsd_worker_thread(void *arg)
                                gettimeofday(&now, NULL);
                                if(!usec && !susec) {
                                        // our first run
-                                       susec = cd->update_every * 1000000ULL;
+                                       susec = cd->rrd_update_every * 1000000ULL;
                                }
                                else {
                                        // second+ run
                                        usec = usecdiff(&now, &last) - susec;
                                        error("PLUGINSD: %s last loop took %llu usec (worked for %llu, sleeped for %llu).\n", cd->fullfilename, usec + susec, usec, susec);
-                                       if(usec < (update_every * 1000000ULL / 2ULL)) susec = (update_every * 1000000ULL) - usec;
-                                       else susec = update_every * 1000000ULL / 2ULL;
+                                       if(usec < (rrd_update_every * 1000000ULL / 2ULL)) susec = (rrd_update_every * 1000000ULL) - usec;
+                                       else susec = rrd_update_every * 1000000ULL / 2ULL;
                                }
 
                                error("PLUGINSD: %s sleeping for %llu. Will kill with SIGCONT pid %d to wake it up.\n", cd->fullfilename, susec, cd->pid);
@@ -351,7 +351,7 @@ void *pluginsd_main(void *ptr)
                                snprintf(cd->fullfilename, FILENAME_MAX, "%s/%s", dir_name, cd->filename);
 
                                cd->enabled = enabled;
-                               cd->update_every = config_get_number(cd->id, "update every", update_every);
+                               cd->update_every = config_get_number(cd->id, "update every", rrd_update_every);
                                cd->started_t = time(NULL);
 
                                char *def = "";
index 62b66fada0bf1c24c4f08fbc865b9cf36bbc46c1..d8aa6affa00e7f4cd956460b4857950bd14d9f3c 100755 (executable)
@@ -186,12 +186,12 @@ int do_proc_diskstats(int update_every, unsigned long long dt) {
                        if(!config_get_boolean("plugin:proc:/proc/diskstats", var_name, def_enabled)) continue;
                }
 
-               RRD_STATS *st;
+               RRDSET *st;
 
                // --------------------------------------------------------------------
 
                if(do_io) {
-                       st = rrd_stats_find_bytype(RRD_TYPE_DISK, disk);
+                       st = rrdset_find_bytype(RRD_TYPE_DISK, disk);
                        if(!st) {
                                char tf[FILENAME_MAX + 1], *t;
                                char ssfilename[FILENAME_MAX + 1];
@@ -222,90 +222,90 @@ int do_proc_diskstats(int update_every, unsigned long long dt) {
                                }
                                else error("Cannot read sector size for device %s from %s. Assuming 512.", disk, ssfilename);
 
-                               st = rrd_stats_create(RRD_TYPE_DISK, disk, NULL, disk, "Disk I/O", "kilobytes/s", 2000, update_every, CHART_TYPE_AREA);
+                               st = rrdset_create(RRD_TYPE_DISK, disk, NULL, disk, "Disk I/O", "kilobytes/s", 2000, update_every, RRDSET_TYPE_AREA);
 
-                               rrd_stats_dimension_add(st, "reads", NULL, sector_size, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "writes", NULL, sector_size * -1, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "reads", NULL, sector_size, 1024 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "writes", NULL, sector_size * -1, 1024 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "reads", readsectors);
-                       rrd_stats_dimension_set(st, "writes", writesectors);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "reads", readsectors);
+                       rrddim_set(st, "writes", writesectors);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                if(do_ops) {
-                       st = rrd_stats_find_bytype("disk_ops", disk);
+                       st = rrdset_find_bytype("disk_ops", disk);
                        if(!st) {
-                               st = rrd_stats_create("disk_ops", disk, NULL, disk, "Disk Operations", "operations/s", 2001, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("disk_ops", disk, NULL, disk, "Disk Operations", "operations/s", 2001, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "reads", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "writes", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "reads", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "writes", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "reads", reads);
-                       rrd_stats_dimension_set(st, "writes", writes);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "reads", reads);
+                       rrddim_set(st, "writes", writes);
+                       rrdset_done(st);
                }
                
                // --------------------------------------------------------------------
 
                if(do_merged_ops) {
-                       st = rrd_stats_find_bytype("disk_merged_ops", disk);
+                       st = rrdset_find_bytype("disk_merged_ops", disk);
                        if(!st) {
-                               st = rrd_stats_create("disk_merged_ops", disk, NULL, disk, "Merged Disk Operations", "operations/s", 2010, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("disk_merged_ops", disk, NULL, disk, "Merged Disk Operations", "operations/s", 2010, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "reads", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "writes", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "reads", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "writes", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "reads", reads_merged);
-                       rrd_stats_dimension_set(st, "writes", writes_merged);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "reads", reads_merged);
+                       rrddim_set(st, "writes", writes_merged);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                if(do_iotime) {
-                       st = rrd_stats_find_bytype("disk_iotime", disk);
+                       st = rrdset_find_bytype("disk_iotime", disk);
                        if(!st) {
-                               st = rrd_stats_create("disk_iotime", disk, NULL, disk, "Disk I/O Time", "milliseconds/s", 2005, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("disk_iotime", disk, NULL, disk, "Disk I/O Time", "milliseconds/s", 2005, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "reads", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "writes", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "latency", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "weighted", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "reads", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "writes", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "latency", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "weighted", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "reads", readms);
-                       rrd_stats_dimension_set(st, "writes", writems);
-                       rrd_stats_dimension_set(st, "latency", iosms);
-                       rrd_stats_dimension_set(st, "weighted", wiosms);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "reads", readms);
+                       rrddim_set(st, "writes", writems);
+                       rrddim_set(st, "latency", iosms);
+                       rrddim_set(st, "weighted", wiosms);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                if(do_cur_ops) {
-                       st = rrd_stats_find_bytype("disk_cur_ops", disk);
+                       st = rrdset_find_bytype("disk_cur_ops", disk);
                        if(!st) {
-                               st = rrd_stats_create("disk_cur_ops", disk, NULL, disk, "Current Disk I/O operations", "operations", 2004, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("disk_cur_ops", disk, NULL, disk, "Current Disk I/O operations", "operations", 2004, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "operations", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
+                               rrddim_add(st, "operations", NULL, 1, 1, RRDDIM_ABSOLUTE);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "operations", currentios);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "operations", currentios);
+                       rrdset_done(st);
                }
        }
        
index 004cb094de571dc4f8144a089b9c210a684bd4f7..75c30144365a1d76ef9570bb5c982b589e17c27b 100755 (executable)
@@ -98,7 +98,7 @@ int do_proc_meminfo(int update_every, unsigned long long dt) {
                else if(!DirectMap2M && strcmp(name, "DirectMap2M") == 0) DirectMap2M = value;
        }
 
-       RRD_STATS *st;
+       RRDSET *st;
 
        // --------------------------------------------------------------------
        
@@ -106,22 +106,22 @@ int do_proc_meminfo(int update_every, unsigned long long dt) {
        unsigned long long MemUsed = MemTotal - MemFree - Cached - Buffers;
 
        if(do_ram) {
-               st = rrd_stats_find("system.ram");
+               st = rrdset_find("system.ram");
                if(!st) {
-                       st = rrd_stats_create("system", "ram", NULL, "mem", "System RAM", "MB", 200, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("system", "ram", NULL, "mem", "System RAM", "MB", 200, update_every, RRDSET_TYPE_STACKED);
 
-                       rrd_stats_dimension_add(st, "buffers", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "used",    NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "cached",  NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "free",    NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "buffers", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "used",    NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "cached",  NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "free",    NULL, 1, 1024, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "used", MemUsed);
-               rrd_stats_dimension_set(st, "free", MemFree);
-               rrd_stats_dimension_set(st, "cached", Cached);
-               rrd_stats_dimension_set(st, "buffers", Buffers);
-               rrd_stats_done(st);
+               rrddim_set(st, "used", MemUsed);
+               rrddim_set(st, "free", MemFree);
+               rrddim_set(st, "cached", Cached);
+               rrddim_set(st, "buffers", Buffers);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
@@ -129,115 +129,115 @@ int do_proc_meminfo(int update_every, unsigned long long dt) {
        unsigned long long SwapUsed = SwapTotal - SwapFree;
 
        if(do_swap) {
-               st = rrd_stats_find("system.swap");
+               st = rrdset_find("system.swap");
                if(!st) {
-                       st = rrd_stats_create("system", "swap", NULL, "mem", "System Swap", "MB", 201, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("system", "swap", NULL, "mem", "System Swap", "MB", 201, update_every, RRDSET_TYPE_STACKED);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "free",    NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "used",    NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "free",    NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "used",    NULL, 1, 1024, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "used", SwapUsed);
-               rrd_stats_dimension_set(st, "free", SwapFree);
-               rrd_stats_done(st);
+               rrddim_set(st, "used", SwapUsed);
+               rrddim_set(st, "free", SwapFree);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
        
        if(hwcorrupted && do_hwcorrupt) {
-               st = rrd_stats_find("mem.hwcorrupt");
+               st = rrdset_find("mem.hwcorrupt");
                if(!st) {
-                       st = rrd_stats_create("mem", "hwcorrupt", NULL, "mem", "Hardware Corrupted ECC", "MB", 9000, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create("mem", "hwcorrupt", NULL, "mem", "Hardware Corrupted ECC", "MB", 9000, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "HardwareCorrupted", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "HardwareCorrupted", NULL, 1, 1024, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "HardwareCorrupted", HardwareCorrupted);
-               rrd_stats_done(st);
+               rrddim_set(st, "HardwareCorrupted", HardwareCorrupted);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
        
        if(do_committed) {
-               st = rrd_stats_find("mem.committed");
+               st = rrdset_find("mem.committed");
                if(!st) {
-                       st = rrd_stats_create("mem", "committed", NULL, "mem", "Committed (Allocated) Memory", "MB", 5000, update_every, CHART_TYPE_AREA);
+                       st = rrdset_create("mem", "committed", NULL, "mem", "Committed (Allocated) Memory", "MB", 5000, update_every, RRDSET_TYPE_AREA);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "Committed_AS", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "Committed_AS", NULL, 1, 1024, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "Committed_AS", Committed_AS);
-               rrd_stats_done(st);
+               rrddim_set(st, "Committed_AS", Committed_AS);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
        
        if(do_writeback) {
-               st = rrd_stats_find("mem.writeback");
+               st = rrdset_find("mem.writeback");
                if(!st) {
-                       st = rrd_stats_create("mem", "writeback", NULL, "mem", "Writeback Memory", "MB", 4000, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create("mem", "writeback", NULL, "mem", "Writeback Memory", "MB", 4000, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "Dirty", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "Writeback", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "FuseWriteback", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "NfsWriteback", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "Bounce", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "Dirty", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "Writeback", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "FuseWriteback", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "NfsWriteback", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "Bounce", NULL, 1, 1024, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
-
-               rrd_stats_dimension_set(st, "Dirty", Dirty);
-               rrd_stats_dimension_set(st, "Writeback", Writeback);
-               rrd_stats_dimension_set(st, "FuseWriteback", WritebackTmp);
-               rrd_stats_dimension_set(st, "NfsWriteback", NFS_Unstable);
-               rrd_stats_dimension_set(st, "Bounce", Bounce);
-               rrd_stats_done(st);
+               else rrdset_next(st);
+
+               rrddim_set(st, "Dirty", Dirty);
+               rrddim_set(st, "Writeback", Writeback);
+               rrddim_set(st, "FuseWriteback", WritebackTmp);
+               rrddim_set(st, "NfsWriteback", NFS_Unstable);
+               rrddim_set(st, "Bounce", Bounce);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
        
        if(do_kernel) {
-               st = rrd_stats_find("mem.kernel");
+               st = rrdset_find("mem.kernel");
                if(!st) {
-                       st = rrd_stats_create("mem", "kernel", NULL, "mem", "Memory Used by Kernel", "MB", 6000, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("mem", "kernel", NULL, "mem", "Memory Used by Kernel", "MB", 6000, update_every, RRDSET_TYPE_STACKED);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "Slab", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "KernelStack", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "PageTables", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "VmallocUsed", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "Slab", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "KernelStack", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "PageTables", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "VmallocUsed", NULL, 1, 1024, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "KernelStack", KernelStack);
-               rrd_stats_dimension_set(st, "Slab", Slab);
-               rrd_stats_dimension_set(st, "PageTables", PageTables);
-               rrd_stats_dimension_set(st, "VmallocUsed", VmallocUsed);
-               rrd_stats_done(st);
+               rrddim_set(st, "KernelStack", KernelStack);
+               rrddim_set(st, "Slab", Slab);
+               rrddim_set(st, "PageTables", PageTables);
+               rrddim_set(st, "VmallocUsed", VmallocUsed);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
        
        if(do_slab) {
-               st = rrd_stats_find("mem.slab");
+               st = rrdset_find("mem.slab");
                if(!st) {
-                       st = rrd_stats_create("mem", "slab", NULL, "mem", "Reclaimable Kernel Memory", "MB", 6500, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("mem", "slab", NULL, "mem", "Reclaimable Kernel Memory", "MB", 6500, update_every, RRDSET_TYPE_STACKED);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "reclaimable", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "unreclaimable", NULL, 1, 1024, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "reclaimable", NULL, 1, 1024, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "unreclaimable", NULL, 1, 1024, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "reclaimable", SReclaimable);
-               rrd_stats_dimension_set(st, "unreclaimable", SUnreclaim);
-               rrd_stats_done(st);
+               rrddim_set(st, "reclaimable", SReclaimable);
+               rrddim_set(st, "unreclaimable", SUnreclaim);
+               rrdset_done(st);
        }
 
        return 0;
index 48d1eb807acf28e78c35708bb0c339cb5148b7e6..92f3e008624529525585a9e0fabec248d2879ebe 100755 (executable)
@@ -67,135 +67,135 @@ int do_proc_net_dev(int update_every, unsigned long long dt) {
                        if(!config_get_boolean("plugin:proc:/proc/net/dev", var_name, enable_new_interfaces)) continue;
                }
 
-               RRD_STATS *st;
+               RRDSET *st;
 
                // --------------------------------------------------------------------
 
                if(do_bandwidth) {
-                       st = rrd_stats_find_bytype("net", iface);
+                       st = rrdset_find_bytype("net", iface);
                        if(!st) {
-                               st = rrd_stats_create("net", iface, NULL, iface, "Bandwidth", "kilobits/s", 1000, update_every, CHART_TYPE_AREA);
+                               st = rrdset_create("net", iface, NULL, iface, "Bandwidth", "kilobits/s", 1000, update_every, RRDSET_TYPE_AREA);
 
-                               rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "received", rbytes);
-                       rrd_stats_dimension_set(st, "sent", tbytes);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "received", rbytes);
+                       rrddim_set(st, "sent", tbytes);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                if(do_packets) {
-                       st = rrd_stats_find_bytype("net_packets", iface);
+                       st = rrdset_find_bytype("net_packets", iface);
                        if(!st) {
-                               st = rrd_stats_create("net_packets", iface, NULL, iface, "Packets", "packets/s", 1001, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("net_packets", iface, NULL, iface, "Packets", "packets/s", 1001, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "multicast", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "multicast", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "received", rpackets);
-                       rrd_stats_dimension_set(st, "sent", tpackets);
-                       rrd_stats_dimension_set(st, "multicast", rmulticast);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "received", rpackets);
+                       rrddim_set(st, "sent", tpackets);
+                       rrddim_set(st, "multicast", rmulticast);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                if(do_errors) {
-                       st = rrd_stats_find_bytype("net_errors", iface);
+                       st = rrdset_find_bytype("net_errors", iface);
                        if(!st) {
-                               st = rrd_stats_create("net_errors", iface, NULL, iface, "Interface Errors", "errors/s", 1002, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("net_errors", iface, NULL, iface, "Interface Errors", "errors/s", 1002, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "inbound", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "outbound", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "inbound", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "outbound", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "inbound", rerrors);
-                       rrd_stats_dimension_set(st, "outbound", terrors);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "inbound", rerrors);
+                       rrddim_set(st, "outbound", terrors);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                if(do_drops) {
-                       st = rrd_stats_find_bytype("net_drops", iface);
+                       st = rrdset_find_bytype("net_drops", iface);
                        if(!st) {
-                               st = rrd_stats_create("net_drops", iface, NULL, iface, "Interface Drops", "drops/s", 1003, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("net_drops", iface, NULL, iface, "Interface Drops", "drops/s", 1003, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "inbound", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "outbound", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "inbound", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "outbound", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "inbound", rdrops);
-                       rrd_stats_dimension_set(st, "outbound", tdrops);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "inbound", rdrops);
+                       rrddim_set(st, "outbound", tdrops);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                if(do_fifo) {
-                       st = rrd_stats_find_bytype("net_fifo", iface);
+                       st = rrdset_find_bytype("net_fifo", iface);
                        if(!st) {
-                               st = rrd_stats_create("net_fifo", iface, NULL, iface, "Interface Queue", "packets", 1100, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("net_fifo", iface, NULL, iface, "Interface Queue", "packets", 1100, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "receive", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
-                               rrd_stats_dimension_add(st, "transmit", NULL, -1, 1, RRD_DIMENSION_ABSOLUTE);
+                               rrddim_add(st, "receive", NULL, 1, 1, RRDDIM_ABSOLUTE);
+                               rrddim_add(st, "transmit", NULL, -1, 1, RRDDIM_ABSOLUTE);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "receive", rfifo);
-                       rrd_stats_dimension_set(st, "transmit", tfifo);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "receive", rfifo);
+                       rrddim_set(st, "transmit", tfifo);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                if(do_compressed) {
-                       st = rrd_stats_find_bytype("net_compressed", iface);
+                       st = rrdset_find_bytype("net_compressed", iface);
                        if(!st) {
-                               st = rrd_stats_create("net_compressed", iface, NULL, iface, "Compressed Packets", "packets/s", 1200, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("net_compressed", iface, NULL, iface, "Compressed Packets", "packets/s", 1200, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "received", rcompressed);
-                       rrd_stats_dimension_set(st, "sent", tcompressed);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "received", rcompressed);
+                       rrddim_set(st, "sent", tcompressed);
+                       rrdset_done(st);
                }
 
                // --------------------------------------------------------------------
 
                if(do_events) {
-                       st = rrd_stats_find_bytype("net_events", iface);
+                       st = rrdset_find_bytype("net_events", iface);
                        if(!st) {
-                               st = rrd_stats_create("net_events", iface, NULL, iface, "Network Interface Events", "events/s", 1200, update_every, CHART_TYPE_LINE);
+                               st = rrdset_create("net_events", iface, NULL, iface, "Network Interface Events", "events/s", 1200, update_every, RRDSET_TYPE_LINE);
                                st->isdetail = 1;
 
-                               rrd_stats_dimension_add(st, "frames", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "collisions", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                               rrd_stats_dimension_add(st, "carrier", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, "frames", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "collisions", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                               rrddim_add(st, "carrier", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                        }
-                       else rrd_stats_next(st);
+                       else rrdset_next(st);
 
-                       rrd_stats_dimension_set(st, "frames", rframe);
-                       rrd_stats_dimension_set(st, "collisions", tcollisions);
-                       rrd_stats_dimension_set(st, "carrier", tcarrier);
-                       rrd_stats_done(st);
+                       rrddim_set(st, "frames", rframe);
+                       rrddim_set(st, "collisions", tcollisions);
+                       rrddim_set(st, "carrier", tcarrier);
+                       rrdset_done(st);
                }
        }
 
index d6b44911229220209ddd1fd4b30045e20f9aaf71..d24b1df526fcc1de81e230f3f11550d5184a018e 100755 (executable)
@@ -40,55 +40,55 @@ int do_proc_net_ip_vs_stats(int update_every, unsigned long long dt) {
        InBytes         = strtoull(procfile_lineword(ff, 2, 3), NULL, 16);
        OutBytes        = strtoull(procfile_lineword(ff, 2, 4), NULL, 16);
 
-       RRD_STATS *st;
+       RRDSET *st;
 
        // --------------------------------------------------------------------
 
        if(do_sockets) {
-               st = rrd_stats_find(RRD_TYPE_NET_IPVS ".sockets");
+               st = rrdset_find(RRD_TYPE_NET_IPVS ".sockets");
                if(!st) {
-                       st = rrd_stats_create(RRD_TYPE_NET_IPVS, "sockets", NULL, RRD_TYPE_NET_IPVS, "IPVS New Connections", "connections/s", 1001, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create(RRD_TYPE_NET_IPVS, "sockets", NULL, RRD_TYPE_NET_IPVS, "IPVS New Connections", "connections/s", 1001, update_every, RRDSET_TYPE_LINE);
 
-                       rrd_stats_dimension_add(st, "connections", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "connections", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "connections", entries);
-               rrd_stats_done(st);
+               rrddim_set(st, "connections", entries);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
        
        if(do_packets) {
-               st = rrd_stats_find(RRD_TYPE_NET_IPVS ".packets");
+               st = rrdset_find(RRD_TYPE_NET_IPVS ".packets");
                if(!st) {
-                       st = rrd_stats_create(RRD_TYPE_NET_IPVS, "packets", NULL, RRD_TYPE_NET_IPVS, "IPVS Packets", "packets/s", 1002, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create(RRD_TYPE_NET_IPVS, "packets", NULL, RRD_TYPE_NET_IPVS, "IPVS Packets", "packets/s", 1002, update_every, RRDSET_TYPE_LINE);
 
-                       rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "received", InPackets);
-               rrd_stats_dimension_set(st, "sent", OutPackets);
-               rrd_stats_done(st);
+               rrddim_set(st, "received", InPackets);
+               rrddim_set(st, "sent", OutPackets);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
        
        if(do_bandwidth) {
-               st = rrd_stats_find(RRD_TYPE_NET_IPVS ".net");
+               st = rrdset_find(RRD_TYPE_NET_IPVS ".net");
                if(!st) {
-                       st = rrd_stats_create(RRD_TYPE_NET_IPVS, "net", NULL, RRD_TYPE_NET_IPVS, "IPVS Bandwidth", "kilobits/s", 1000, update_every, CHART_TYPE_AREA);
+                       st = rrdset_create(RRD_TYPE_NET_IPVS, "net", NULL, RRD_TYPE_NET_IPVS, "IPVS Bandwidth", "kilobits/s", 1000, update_every, RRDSET_TYPE_AREA);
 
-                       rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "received", InBytes);
-               rrd_stats_dimension_set(st, "sent", OutBytes);
-               rrd_stats_done(st);
+               rrddim_set(st, "received", InBytes);
+               rrddim_set(st, "sent", OutBytes);
+               rrdset_done(st);
        }
 
        return 0;
index e910cf6071d3cbfc606adcb8158ef0312d7cbb87..7615871f77c377a92a1f509a9d1f5f2981bfe34a 100755 (executable)
@@ -63,113 +63,113 @@ int do_proc_net_netstat(int update_every, unsigned long long dt) {
                        InBcastOctets           = strtoull(procfile_lineword(ff, l, 11), NULL, 10);
                        OutBcastOctets          = strtoull(procfile_lineword(ff, l, 12), NULL, 10);
 
-                       RRD_STATS *st;
+                       RRDSET *st;
 
                        // --------------------------------------------------------------------
 
                        if(do_bandwidth) {
-                               st = rrd_stats_find("system.ipv4");
+                               st = rrdset_find("system.ipv4");
                                if(!st) {
-                                       st = rrd_stats_create("system", "ipv4", NULL, "ipv4", "IPv4 Bandwidth", "kilobits/s", 2000, update_every, CHART_TYPE_AREA);
+                                       st = rrdset_create("system", "ipv4", NULL, "ipv4", "IPv4 Bandwidth", "kilobits/s", 2000, update_every, RRDSET_TYPE_AREA);
 
-                                       rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "sent", OutOctets);
-                               rrd_stats_dimension_set(st, "received", InOctets);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "sent", OutOctets);
+                               rrddim_set(st, "received", InOctets);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
 
                        if(do_inerrors) {
-                               st = rrd_stats_find("ipv4.inerrors");
+                               st = rrdset_find("ipv4.inerrors");
                                if(!st) {
-                                       st = rrd_stats_create("ipv4", "inerrors", NULL, "ipv4", "IPv4 Input Errors", "packets/s", 4000, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create("ipv4", "inerrors", NULL, "ipv4", "IPv4 Input Errors", "packets/s", 4000, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "noroutes", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "trunkated", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "noroutes", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "trunkated", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "noroutes", InNoRoutes);
-                               rrd_stats_dimension_set(st, "trunkated", InTruncatedPkts);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "noroutes", InNoRoutes);
+                               rrddim_set(st, "trunkated", InTruncatedPkts);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
 
                        if(do_mcast) {
-                               st = rrd_stats_find("ipv4.mcast");
+                               st = rrdset_find("ipv4.mcast");
                                if(!st) {
-                                       st = rrd_stats_create("ipv4", "mcast", NULL, "ipv4", "IPv4 Multicast Bandwidth", "kilobits/s", 9000, update_every, CHART_TYPE_AREA);
+                                       st = rrdset_create("ipv4", "mcast", NULL, "ipv4", "IPv4 Multicast Bandwidth", "kilobits/s", 9000, update_every, RRDSET_TYPE_AREA);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "sent", OutMcastOctets);
-                               rrd_stats_dimension_set(st, "received", InMcastOctets);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "sent", OutMcastOctets);
+                               rrddim_set(st, "received", InMcastOctets);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
 
                        if(do_bcast) {
-                               st = rrd_stats_find("ipv4.bcast");
+                               st = rrdset_find("ipv4.bcast");
                                if(!st) {
-                                       st = rrd_stats_create("ipv4", "bcast", NULL, "ipv4", "IPv4 Broadcast Bandwidth", "kilobits/s", 8000, update_every, CHART_TYPE_AREA);
+                                       st = rrdset_create("ipv4", "bcast", NULL, "ipv4", "IPv4 Broadcast Bandwidth", "kilobits/s", 8000, update_every, RRDSET_TYPE_AREA);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "received", NULL, 8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "sent", NULL, -8, 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "received", NULL, 8, 1024 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "sent", NULL, -8, 1024 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "sent", OutBcastOctets);
-                               rrd_stats_dimension_set(st, "received", InBcastOctets);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "sent", OutBcastOctets);
+                               rrddim_set(st, "received", InBcastOctets);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
 
                        if(do_mcast_p) {
-                               st = rrd_stats_find("ipv4.mcastpkts");
+                               st = rrdset_find("ipv4.mcastpkts");
                                if(!st) {
-                                       st = rrd_stats_create("ipv4", "mcastpkts", NULL, "ipv4", "IPv4 Multicast Packets", "packets/s", 9500, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create("ipv4", "mcastpkts", NULL, "ipv4", "IPv4 Multicast Packets", "packets/s", 9500, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "sent", OutMcastPkts);
-                               rrd_stats_dimension_set(st, "received", InMcastPkts);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "sent", OutMcastPkts);
+                               rrddim_set(st, "received", InMcastPkts);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
 
                        if(do_bcast_p) {
-                               st = rrd_stats_find("ipv4.bcastpkts");
+                               st = rrdset_find("ipv4.bcastpkts");
                                if(!st) {
-                                       st = rrd_stats_create("ipv4", "bcastpkts", NULL, "ipv4", "IPv4 Broadcast Packets", "packets/s", 8500, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create("ipv4", "bcastpkts", NULL, "ipv4", "IPv4 Broadcast Packets", "packets/s", 8500, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "sent", OutBcastPkts);
-                               rrd_stats_dimension_set(st, "received", InBcastPkts);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "sent", OutBcastPkts);
+                               rrddim_set(st, "received", InBcastPkts);
+                               rrdset_done(st);
                        }
                }
        }
index 6e527e1e794a74b2123322bcb0496abaccd29bf6..634558d616c242c4b28f8eff0dfc5e9d64b0e742 100644 (file)
@@ -406,280 +406,280 @@ int do_proc_net_rpc_nfsd(int update_every, unsigned long long dt) {
                }
        }
 
-       RRD_STATS *st;
+       RRDSET *st;
 
        // --------------------------------------------------------------------
 
        if(do_rc == 2) {
-               st = rrd_stats_find_bytype("nfsd", "readcache");
+               st = rrdset_find_bytype("nfsd", "readcache");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "readcache", NULL, "nfsd", "Read Cache", "reads/s", 5000, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("nfsd", "readcache", NULL, "nfsd", "Read Cache", "reads/s", 5000, update_every, RRDSET_TYPE_STACKED);
 
-                       rrd_stats_dimension_add(st, "hits", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "misses", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "nocache", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "hits", NULL, 1, update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "misses", NULL, 1, update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "nocache", NULL, 1, update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "hits", rc_hits);
-               rrd_stats_dimension_set(st, "misses", rc_misses);
-               rrd_stats_dimension_set(st, "nocache", rc_nocache);
-               rrd_stats_done(st);
+               rrddim_set(st, "hits", rc_hits);
+               rrddim_set(st, "misses", rc_misses);
+               rrddim_set(st, "nocache", rc_nocache);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_fh == 2) {
-               st = rrd_stats_find_bytype("nfsd", "filehandles");
+               st = rrdset_find_bytype("nfsd", "filehandles");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "filehandles", NULL, "nfsd", "File Handles", "handles/s", 5001, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create("nfsd", "filehandles", NULL, "nfsd", "File Handles", "handles/s", 5001, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "stale", NULL, 1, update_every, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "total_lookups", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "anonymous_lookups", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "dir_not_in_dcache", NULL, -1, update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "non_dir_not_in_dcache", NULL, -1, update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "stale", NULL, 1, update_every, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "total_lookups", NULL, 1, update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "anonymous_lookups", NULL, 1, update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "dir_not_in_dcache", NULL, -1, update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "non_dir_not_in_dcache", NULL, -1, update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
-
-               rrd_stats_dimension_set(st, "stale", fh_stale);
-               rrd_stats_dimension_set(st, "total_lookups", fh_total_lookups);
-               rrd_stats_dimension_set(st, "anonymous_lookups", fh_anonymous_lookups);
-               rrd_stats_dimension_set(st, "dir_not_in_dcache", fh_dir_not_in_dcache);
-               rrd_stats_dimension_set(st, "non_dir_not_in_dcache", fh_non_dir_not_in_dcache);
-               rrd_stats_done(st);
+               else rrdset_next(st);
+
+               rrddim_set(st, "stale", fh_stale);
+               rrddim_set(st, "total_lookups", fh_total_lookups);
+               rrddim_set(st, "anonymous_lookups", fh_anonymous_lookups);
+               rrddim_set(st, "dir_not_in_dcache", fh_dir_not_in_dcache);
+               rrddim_set(st, "non_dir_not_in_dcache", fh_non_dir_not_in_dcache);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_io == 2) {
-               st = rrd_stats_find_bytype("nfsd", "io");
+               st = rrdset_find_bytype("nfsd", "io");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "io", NULL, "nfsd", "I/O", "kilobytes/s", 5002, update_every, CHART_TYPE_AREA);
+                       st = rrdset_create("nfsd", "io", NULL, "nfsd", "I/O", "kilobytes/s", 5002, update_every, RRDSET_TYPE_AREA);
 
-                       rrd_stats_dimension_add(st, "read", NULL, 1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "write", NULL, -1, 1000 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "read", NULL, 1, 1000 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "write", NULL, -1, 1000 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "read", io_read);
-               rrd_stats_dimension_set(st, "write", io_write);
-               rrd_stats_done(st);
+               rrddim_set(st, "read", io_read);
+               rrddim_set(st, "write", io_write);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_th == 2) {
-               st = rrd_stats_find_bytype("nfsd", "threads");
+               st = rrdset_find_bytype("nfsd", "threads");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "threads", NULL, "nfsd", "Threads", "threads", 5003, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create("nfsd", "threads", NULL, "nfsd", "Threads", "threads", 5003, update_every, RRDSET_TYPE_LINE);
 
-                       rrd_stats_dimension_add(st, "threads", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "threads", NULL, 1, 1, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "threads", th_threads);
-               rrd_stats_done(st);
+               rrddim_set(st, "threads", th_threads);
+               rrdset_done(st);
 
-               st = rrd_stats_find_bytype("nfsd", "threads_fullcnt");
+               st = rrdset_find_bytype("nfsd", "threads_fullcnt");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "threads_fullcnt", NULL, "nfsd", "Threads Full Count", "ops/s", 5004, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create("nfsd", "threads_fullcnt", NULL, "nfsd", "Threads Full Count", "ops/s", 5004, update_every, RRDSET_TYPE_LINE);
 
-                       rrd_stats_dimension_add(st, "full_count", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "full_count", NULL, 1, update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "full_count", th_fullcnt);
-               rrd_stats_done(st);
+               rrddim_set(st, "full_count", th_fullcnt);
+               rrdset_done(st);
 
-               st = rrd_stats_find_bytype("nfsd", "threads_histogram");
+               st = rrdset_find_bytype("nfsd", "threads_histogram");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "threads_histogram", NULL, "nfsd", "Threads Usage Histogram", "percentage", 5005, update_every, CHART_TYPE_LINE);
-
-                       rrd_stats_dimension_add(st, "0%-10%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "10%-20%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "20%-30%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "30%-40%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "40%-50%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "50%-60%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "60%-70%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "70%-80%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "80%-90%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "90%-100%", NULL, 1, 1000, RRD_DIMENSION_ABSOLUTE);
+                       st = rrdset_create("nfsd", "threads_histogram", NULL, "nfsd", "Threads Usage Histogram", "percentage", 5005, update_every, RRDSET_TYPE_LINE);
+
+                       rrddim_add(st, "0%-10%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "10%-20%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "20%-30%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "30%-40%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "40%-50%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "50%-60%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "60%-70%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "70%-80%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "80%-90%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "90%-100%", NULL, 1, 1000, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
-
-               rrd_stats_dimension_set(st, "0%-10%", th_hist10);
-               rrd_stats_dimension_set(st, "10%-20%", th_hist20);
-               rrd_stats_dimension_set(st, "20%-30%", th_hist30);
-               rrd_stats_dimension_set(st, "30%-40%", th_hist40);
-               rrd_stats_dimension_set(st, "40%-50%", th_hist50);
-               rrd_stats_dimension_set(st, "50%-60%", th_hist60);
-               rrd_stats_dimension_set(st, "60%-70%", th_hist70);
-               rrd_stats_dimension_set(st, "70%-80%", th_hist80);
-               rrd_stats_dimension_set(st, "80%-90%", th_hist90);
-               rrd_stats_dimension_set(st, "90%-100%", th_hist100);
-               rrd_stats_done(st);
+               else rrdset_next(st);
+
+               rrddim_set(st, "0%-10%", th_hist10);
+               rrddim_set(st, "10%-20%", th_hist20);
+               rrddim_set(st, "20%-30%", th_hist30);
+               rrddim_set(st, "30%-40%", th_hist40);
+               rrddim_set(st, "40%-50%", th_hist50);
+               rrddim_set(st, "50%-60%", th_hist60);
+               rrddim_set(st, "60%-70%", th_hist70);
+               rrddim_set(st, "70%-80%", th_hist80);
+               rrddim_set(st, "80%-90%", th_hist90);
+               rrddim_set(st, "90%-100%", th_hist100);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_ra == 2) {
-               st = rrd_stats_find_bytype("nfsd", "readahead");
+               st = rrdset_find_bytype("nfsd", "readahead");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "readahead", NULL, "nfsd", "Read Ahead Depth", "percentage", 5005, update_every, CHART_TYPE_STACKED);
-
-                       rrd_stats_dimension_add(st, "10%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "20%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "30%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "40%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "50%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "60%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "70%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "80%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "90%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "100%", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                       rrd_stats_dimension_add(st, "misses", NULL, 1, update_every, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
+                       st = rrdset_create("nfsd", "readahead", NULL, "nfsd", "Read Ahead Depth", "percentage", 5005, update_every, RRDSET_TYPE_STACKED);
+
+                       rrddim_add(st, "10%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "20%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "30%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "40%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "50%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "60%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "70%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "80%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "90%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "100%", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                       rrddim_add(st, "misses", NULL, 1, update_every, RRDDIM_PCENT_OVER_DIFF_TOTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
                // ignore ra_size
                if(ra_size) {};
 
-               rrd_stats_dimension_set(st, "10%", ra_hist10);
-               rrd_stats_dimension_set(st, "20%", ra_hist20);
-               rrd_stats_dimension_set(st, "30%", ra_hist30);
-               rrd_stats_dimension_set(st, "40%", ra_hist40);
-               rrd_stats_dimension_set(st, "50%", ra_hist50);
-               rrd_stats_dimension_set(st, "60%", ra_hist60);
-               rrd_stats_dimension_set(st, "70%", ra_hist70);
-               rrd_stats_dimension_set(st, "80%", ra_hist80);
-               rrd_stats_dimension_set(st, "90%", ra_hist90);
-               rrd_stats_dimension_set(st, "100%", ra_hist100);
-               rrd_stats_dimension_set(st, "misses", ra_none);
-               rrd_stats_done(st);
+               rrddim_set(st, "10%", ra_hist10);
+               rrddim_set(st, "20%", ra_hist20);
+               rrddim_set(st, "30%", ra_hist30);
+               rrddim_set(st, "40%", ra_hist40);
+               rrddim_set(st, "50%", ra_hist50);
+               rrddim_set(st, "60%", ra_hist60);
+               rrddim_set(st, "70%", ra_hist70);
+               rrddim_set(st, "80%", ra_hist80);
+               rrddim_set(st, "90%", ra_hist90);
+               rrddim_set(st, "100%", ra_hist100);
+               rrddim_set(st, "misses", ra_none);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_net == 2) {
-               st = rrd_stats_find_bytype("nfsd", "net");
+               st = rrdset_find_bytype("nfsd", "net");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "net", NULL, "nfsd", "Network Reads", "reads/s", 5007, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("nfsd", "net", NULL, "nfsd", "Network Reads", "reads/s", 5007, update_every, RRDSET_TYPE_STACKED);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "udp", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "tcp", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "udp", NULL, 1, update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "tcp", NULL, 1, update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
                // ignore net_count, net_tcp_connections
                if(net_count) {};
                if(net_tcp_connections) {};
 
-               rrd_stats_dimension_set(st, "udp", net_udp_count);
-               rrd_stats_dimension_set(st, "tcp", net_tcp_count);
-               rrd_stats_done(st);
+               rrddim_set(st, "udp", net_udp_count);
+               rrddim_set(st, "tcp", net_tcp_count);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_rpc == 2) {
-               st = rrd_stats_find_bytype("nfsd", "rpc");
+               st = rrdset_find_bytype("nfsd", "rpc");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "rpc", NULL, "nfsd", "Remote Procedure Calls", "calls/s", 5008, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create("nfsd", "rpc", NULL, "nfsd", "Remote Procedure Calls", "calls/s", 5008, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "all", NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "bad_format", NULL, -1, update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "bad_auth", NULL, -1, update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "all", NULL, 1, update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "bad_format", NULL, -1, update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "bad_auth", NULL, -1, update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
                // ignore rpc_bad_client
                if(rpc_bad_client) {};
 
-               rrd_stats_dimension_set(st, "all", rpc_count);
-               rrd_stats_dimension_set(st, "bad_format", rpc_bad_format);
-               rrd_stats_dimension_set(st, "bad_auth", rpc_bad_auth);
-               rrd_stats_done(st);
+               rrddim_set(st, "all", rpc_count);
+               rrddim_set(st, "bad_format", rpc_bad_format);
+               rrddim_set(st, "bad_auth", rpc_bad_auth);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_proc2 == 2) {
                unsigned int i;
-               st = rrd_stats_find_bytype("nfsd", "proc2");
+               st = rrdset_find_bytype("nfsd", "proc2");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "proc2", NULL, "nfsd", "NFS v2 Calls", "calls/s", 5009, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("nfsd", "proc2", NULL, "nfsd", "NFS v2 Calls", "calls/s", 5009, update_every, RRDSET_TYPE_STACKED);
 
                        for(i = 0; nfsd_proc_values[i].present2 ; i++)
-                               rrd_stats_dimension_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
                for(i = 0; nfsd_proc_values[i].present2 ; i++)
-                       rrd_stats_dimension_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc2);
+                       rrddim_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc2);
                
-               rrd_stats_done(st);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_proc3 == 2) {
                unsigned int i;
-               st = rrd_stats_find_bytype("nfsd", "proc3");
+               st = rrdset_find_bytype("nfsd", "proc3");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "proc3", NULL, "nfsd", "NFS v3 Calls", "calls/s", 5010, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("nfsd", "proc3", NULL, "nfsd", "NFS v3 Calls", "calls/s", 5010, update_every, RRDSET_TYPE_STACKED);
 
                        for(i = 0; nfsd_proc_values[i].present3 ; i++)
-                               rrd_stats_dimension_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
                for(i = 0; nfsd_proc_values[i].present3 ; i++)
-                       rrd_stats_dimension_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc3);
+                       rrddim_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc3);
                
-               rrd_stats_done(st);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_proc4 == 2) {
                unsigned int i;
-               st = rrd_stats_find_bytype("nfsd", "proc4");
+               st = rrdset_find_bytype("nfsd", "proc4");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "proc4", NULL, "nfsd", "NFS v4 Calls", "calls/s", 5011, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("nfsd", "proc4", NULL, "nfsd", "NFS v4 Calls", "calls/s", 5011, update_every, RRDSET_TYPE_STACKED);
 
                        for(i = 0; nfsd_proc_values[i].present4 ; i++)
-                               rrd_stats_dimension_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, nfsd_proc_values[i].name, NULL, 1, update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
                for(i = 0; nfsd_proc_values[i].present4 ; i++)
-                       rrd_stats_dimension_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc4);
+                       rrddim_set(st, nfsd_proc_values[i].name, nfsd_proc_values[i].proc4);
                
-               rrd_stats_done(st);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_proc4ops == 2) {
                unsigned int i;
-               st = rrd_stats_find_bytype("nfsd", "proc4ops");
+               st = rrdset_find_bytype("nfsd", "proc4ops");
                if(!st) {
-                       st = rrd_stats_create("nfsd", "proc4ops", NULL, "nfsd", "NFS v4 Operations", "operations/s", 5012, update_every, CHART_TYPE_STACKED);
+                       st = rrdset_create("nfsd", "proc4ops", NULL, "nfsd", "NFS v4 Operations", "operations/s", 5012, update_every, RRDSET_TYPE_STACKED);
 
                        for(i = 0; nfsd4_ops_values[i].present ; i++)
-                               rrd_stats_dimension_add(st, nfsd4_ops_values[i].name, NULL, 1, update_every, RRD_DIMENSION_INCREMENTAL);
+                               rrddim_add(st, nfsd4_ops_values[i].name, NULL, 1, update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
                for(i = 0; nfsd4_ops_values[i].present ; i++)
-                       rrd_stats_dimension_set(st, nfsd4_ops_values[i].name, nfsd4_ops_values[i].value);
+                       rrddim_set(st, nfsd4_ops_values[i].name, nfsd4_ops_values[i].value);
                
-               rrd_stats_done(st);
+               rrdset_done(st);
        }
 
        return 0;
index ea88d7eaf99928c6f8fa1d25fb75d2eb73f855a4..101b05829a812bb382dfb33e36d6dc6723c6880b 100755 (executable)
@@ -40,7 +40,7 @@ int do_proc_net_snmp(int update_every, unsigned long long dt) {
        uint32_t lines = procfile_lines(ff), l;
        uint32_t words;
 
-       RRD_STATS *st;
+       RRDSET *st;
 
        for(l = 0; l < lines ;l++) {
                if(strcmp(procfile_lineword(ff, l, 0), "Ip") == 0) {
@@ -92,88 +92,88 @@ int do_proc_net_snmp(int update_every, unsigned long long dt) {
                        // --------------------------------------------------------------------
 
                        if(do_ip_packets) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".packets");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".packets");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "packets", NULL, RRD_TYPE_NET_SNMP, "IPv4 Packets", "packets/s", 3000, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "packets", NULL, RRD_TYPE_NET_SNMP, "IPv4 Packets", "packets/s", 3000, update_every, RRDSET_TYPE_LINE);
 
-                                       rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "forwarded", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "forwarded", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "sent", OutRequests);
-                               rrd_stats_dimension_set(st, "received", InReceives);
-                               rrd_stats_dimension_set(st, "forwarded", ForwDatagrams);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "sent", OutRequests);
+                               rrddim_set(st, "received", InReceives);
+                               rrddim_set(st, "forwarded", ForwDatagrams);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
 
                        if(do_ip_fragsout) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".fragsout");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsout");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "fragsout", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Sent", "packets/s", 3010, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsout", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Sent", "packets/s", 3010, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "ok", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "failed", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "all", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "ok", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "failed", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "all", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "ok", FragOKs);
-                               rrd_stats_dimension_set(st, "failed", FragFails);
-                               rrd_stats_dimension_set(st, "all", FragCreates);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "ok", FragOKs);
+                               rrddim_set(st, "failed", FragFails);
+                               rrddim_set(st, "all", FragCreates);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
 
                        if(do_ip_fragsin) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".fragsin");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".fragsin");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "fragsin", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Reassembly", "packets/s", 3011, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "fragsin", NULL, RRD_TYPE_NET_SNMP, "IPv4 Fragments Reassembly", "packets/s", 3011, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "ok", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "failed", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "all", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "ok", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "failed", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "all", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "ok", ReasmOKs);
-                               rrd_stats_dimension_set(st, "failed", ReasmFails);
-                               rrd_stats_dimension_set(st, "all", ReasmReqds);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "ok", ReasmOKs);
+                               rrddim_set(st, "failed", ReasmFails);
+                               rrddim_set(st, "all", ReasmReqds);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
 
                        if(do_ip_errors) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".errors");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".errors");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "errors", NULL, RRD_TYPE_NET_SNMP, "IPv4 Errors", "packets/s", 3002, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "errors", NULL, RRD_TYPE_NET_SNMP, "IPv4 Errors", "packets/s", 3002, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "InDiscards", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "OutDiscards", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "InDiscards", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "OutDiscards", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
 
-                                       rrd_stats_dimension_add(st, "InHdrErrors", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "InAddrErrors", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "InUnknownProtos", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "InHdrErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "InAddrErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "InUnknownProtos", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
 
-                                       rrd_stats_dimension_add(st, "OutNoRoutes", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "OutNoRoutes", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
-
-                               rrd_stats_dimension_set(st, "InDiscards", InDiscards);
-                               rrd_stats_dimension_set(st, "OutDiscards", OutDiscards);
-                               rrd_stats_dimension_set(st, "InHdrErrors", InHdrErrors);
-                               rrd_stats_dimension_set(st, "InAddrErrors", InAddrErrors);
-                               rrd_stats_dimension_set(st, "InUnknownProtos", InUnknownProtos);
-                               rrd_stats_dimension_set(st, "OutNoRoutes", OutNoRoutes);
-                               rrd_stats_done(st);
+                               else rrdset_next(st);
+
+                               rrddim_set(st, "InDiscards", InDiscards);
+                               rrddim_set(st, "OutDiscards", OutDiscards);
+                               rrddim_set(st, "InHdrErrors", InHdrErrors);
+                               rrddim_set(st, "InAddrErrors", InAddrErrors);
+                               rrddim_set(st, "InUnknownProtos", InUnknownProtos);
+                               rrddim_set(st, "OutNoRoutes", OutNoRoutes);
+                               rrdset_done(st);
                        }
                }
                else if(strcmp(procfile_lineword(ff, l, 0), "Tcp") == 0) {
@@ -218,75 +218,75 @@ int do_proc_net_snmp(int update_every, unsigned long long dt) {
                        
                        // see http://net-snmp.sourceforge.net/docs/mibs/tcp.html
                        if(do_tcp_sockets) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcpsock");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".tcpsock");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "tcpsock", NULL, "tcp", "IPv4 TCP Connections", "active connections", 2500, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "tcpsock", NULL, "tcp", "IPv4 TCP Connections", "active connections", 2500, update_every, RRDSET_TYPE_LINE);
 
-                                       rrd_stats_dimension_add(st, "connections", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
+                                       rrddim_add(st, "connections", NULL, 1, 1, RRDDIM_ABSOLUTE);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "connections", CurrEstab);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "connections", CurrEstab);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
                        
                        if(do_tcp_packets) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcppackets");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".tcppackets");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "tcppackets", NULL, "tcp", "IPv4 TCP Packets", "packets/s", 2600, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "tcppackets", NULL, "tcp", "IPv4 TCP Packets", "packets/s", 2600, update_every, RRDSET_TYPE_LINE);
 
-                                       rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "received", InSegs);
-                               rrd_stats_dimension_set(st, "sent", OutSegs);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "received", InSegs);
+                               rrddim_set(st, "sent", OutSegs);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
                        
                        if(do_tcp_errors) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcperrors");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".tcperrors");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "tcperrors", NULL, "tcp", "IPv4 TCP Errors", "packets/s", 2700, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "tcperrors", NULL, "tcp", "IPv4 TCP Errors", "packets/s", 2700, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "InErrs", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "RetransSegs", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "InErrs", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "RetransSegs", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "InErrs", InErrs);
-                               rrd_stats_dimension_set(st, "RetransSegs", RetransSegs);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "InErrs", InErrs);
+                               rrddim_set(st, "RetransSegs", RetransSegs);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
                        
                        if(do_tcp_handshake) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".tcphandshake");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".tcphandshake");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "tcphandshake", NULL, "tcp", "IPv4 TCP Handshake Issues", "events/s", 2900, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "tcphandshake", NULL, "tcp", "IPv4 TCP Handshake Issues", "events/s", 2900, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "EstabResets", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "OutRsts", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "ActiveOpens", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "PassiveOpens", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "AttemptFails", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "EstabResets", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "OutRsts", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "ActiveOpens", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "PassiveOpens", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "AttemptFails", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
-
-                               rrd_stats_dimension_set(st, "EstabResets", EstabResets);
-                               rrd_stats_dimension_set(st, "OutRsts", OutRsts);
-                               rrd_stats_dimension_set(st, "ActiveOpens", ActiveOpens);
-                               rrd_stats_dimension_set(st, "PassiveOpens", PassiveOpens);
-                               rrd_stats_dimension_set(st, "AttemptFails", AttemptFails);
-                               rrd_stats_done(st);
+                               else rrdset_next(st);
+
+                               rrddim_set(st, "EstabResets", EstabResets);
+                               rrddim_set(st, "OutRsts", OutRsts);
+                               rrddim_set(st, "ActiveOpens", ActiveOpens);
+                               rrddim_set(st, "PassiveOpens", PassiveOpens);
+                               rrddim_set(st, "AttemptFails", AttemptFails);
+                               rrdset_done(st);
                        }
                }
                else if(strcmp(procfile_lineword(ff, l, 0), "Udp") == 0) {
@@ -316,40 +316,40 @@ int do_proc_net_snmp(int update_every, unsigned long long dt) {
                        
                        // see http://net-snmp.sourceforge.net/docs/mibs/udp.html
                        if(do_udp_packets) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".udppackets");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".udppackets");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "udppackets", NULL, "udp", "IPv4 UDP Packets", "packets/s", 2601, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "udppackets", NULL, "udp", "IPv4 UDP Packets", "packets/s", 2601, update_every, RRDSET_TYPE_LINE);
 
-                                       rrd_stats_dimension_add(st, "received", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "sent", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "received", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "sent", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "received", InDatagrams);
-                               rrd_stats_dimension_set(st, "sent", OutDatagrams);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "received", InDatagrams);
+                               rrddim_set(st, "sent", OutDatagrams);
+                               rrdset_done(st);
                        }
 
                        // --------------------------------------------------------------------
                        
                        if(do_udp_errors) {
-                               st = rrd_stats_find(RRD_TYPE_NET_SNMP ".udperrors");
+                               st = rrdset_find(RRD_TYPE_NET_SNMP ".udperrors");
                                if(!st) {
-                                       st = rrd_stats_create(RRD_TYPE_NET_SNMP, "udperrors", NULL, "udp", "IPv4 UDP Errors", "events/s", 2701, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create(RRD_TYPE_NET_SNMP, "udperrors", NULL, "udp", "IPv4 UDP Errors", "events/s", 2701, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "RcvbufErrors", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "SndbufErrors", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "InErrors", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                                       rrd_stats_dimension_add(st, "NoPorts", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "RcvbufErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "SndbufErrors", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "InErrors", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                                       rrddim_add(st, "NoPorts", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "InErrors", InErrors);
-                               rrd_stats_dimension_set(st, "NoPorts", NoPorts);
-                               rrd_stats_dimension_set(st, "RcvbufErrors", RcvbufErrors);
-                               rrd_stats_dimension_set(st, "SndbufErrors", SndbufErrors);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "InErrors", InErrors);
+                               rrddim_set(st, "NoPorts", NoPorts);
+                               rrddim_set(st, "RcvbufErrors", RcvbufErrors);
+                               rrddim_set(st, "SndbufErrors", SndbufErrors);
+                               rrdset_done(st);
                        }
                }
        }
index 7ccc86b1bfac137aec93067e3f083119c0852826..e70feef041adba4f6b4f611309fa0de2357c2e7f 100755 (executable)
@@ -85,122 +85,122 @@ int do_proc_net_stat_conntrack(int update_every, unsigned long long dt) {
                asearch_restart         += tsearch_restart;     // conntrack.search
        }
 
-       RRD_STATS *st;
+       RRDSET *st;
 
        // --------------------------------------------------------------------
        
        if(do_sockets) {
-               st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".sockets");
+               st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".sockets");
                if(!st) {
-                       st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "sockets", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connections", "active connections", 1000, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "sockets", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connections", "active connections", 1000, update_every, RRDSET_TYPE_LINE);
 
-                       rrd_stats_dimension_add(st, "connections", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "connections", NULL, 1, 1, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "connections", aentries);
-               rrd_stats_done(st);
+               rrddim_set(st, "connections", aentries);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_new) {
-               st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".new");
+               st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".new");
                if(!st) {
-                       st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "new", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter New Connections", "connections/s", 1001, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "new", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter New Connections", "connections/s", 1001, update_every, RRDSET_TYPE_LINE);
 
-                       rrd_stats_dimension_add(st, "new", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "ignore", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "invalid", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "new", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "ignore", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "invalid", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "new", anew);
-               rrd_stats_dimension_set(st, "ignore", aignore);
-               rrd_stats_dimension_set(st, "invalid", ainvalid);
-               rrd_stats_done(st);
+               rrddim_set(st, "new", anew);
+               rrddim_set(st, "ignore", aignore);
+               rrddim_set(st, "invalid", ainvalid);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_changes) {
-               st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".changes");
+               st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".changes");
                if(!st) {
-                       st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "changes", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Changes", "changes/s", 1002, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "changes", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Changes", "changes/s", 1002, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "inserted", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "deleted", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "delete_list", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "inserted", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "deleted", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "delete_list", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "inserted", ainsert);
-               rrd_stats_dimension_set(st, "deleted", adelete);
-               rrd_stats_dimension_set(st, "delete_list", adelete_list);
-               rrd_stats_done(st);
+               rrddim_set(st, "inserted", ainsert);
+               rrddim_set(st, "deleted", adelete);
+               rrddim_set(st, "delete_list", adelete_list);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_expect) {
-               st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".expect");
+               st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".expect");
                if(!st) {
-                       st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "expect", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Expectations", "expectations/s", 1003, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "expect", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Expectations", "expectations/s", 1003, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "created", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "deleted", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "new", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "created", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "deleted", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "new", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "created", aexpect_create);
-               rrd_stats_dimension_set(st, "deleted", aexpect_delete);
-               rrd_stats_dimension_set(st, "new", aexpect_new);
-               rrd_stats_done(st);
+               rrddim_set(st, "created", aexpect_create);
+               rrddim_set(st, "deleted", aexpect_delete);
+               rrddim_set(st, "new", aexpect_new);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_search) {
-               st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".search");
+               st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".search");
                if(!st) {
-                       st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "search", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Searches", "searches/s", 1010, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "search", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Connection Searches", "searches/s", 1010, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "searched", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "restarted", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "found", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "searched", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "restarted", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "found", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "searched", asearched);
-               rrd_stats_dimension_set(st, "restarted", asearch_restart);
-               rrd_stats_dimension_set(st, "found", afound);
-               rrd_stats_done(st);
+               rrddim_set(st, "searched", asearched);
+               rrddim_set(st, "restarted", asearch_restart);
+               rrddim_set(st, "found", afound);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_errors) {
-               st = rrd_stats_find(RRD_TYPE_NET_STAT_CONNTRACK ".errors");
+               st = rrdset_find(RRD_TYPE_NET_STAT_CONNTRACK ".errors");
                if(!st) {
-                       st = rrd_stats_create(RRD_TYPE_NET_STAT_CONNTRACK, "errors", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Errors", "events/s", 1005, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create(RRD_TYPE_NET_STAT_CONNTRACK, "errors", NULL, RRD_TYPE_NET_STAT_CONNTRACK, "Netfilter Errors", "events/s", 1005, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "icmp_error", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "insert_failed", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "drop", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "early_drop", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "icmp_error", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "insert_failed", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "drop", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "early_drop", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "icmp_error", aicmp_error);
-               rrd_stats_dimension_set(st, "insert_failed", ainsert_failed);
-               rrd_stats_dimension_set(st, "drop", adrop);
-               rrd_stats_dimension_set(st, "early_drop", aearly_drop);
-               rrd_stats_done(st);
+               rrddim_set(st, "icmp_error", aicmp_error);
+               rrddim_set(st, "insert_failed", ainsert_failed);
+               rrddim_set(st, "drop", adrop);
+               rrddim_set(st, "early_drop", aearly_drop);
+               rrdset_done(st);
        }
 
        return 0;
index e78e8b118b3629bfa10fa809d0a430a14a1e6b76..4bbe4a1118af5123dc41423797e17a5f821dcc19 100755 (executable)
@@ -35,7 +35,7 @@ int do_proc_stat(int update_every, unsigned long long dt) {
        uint32_t words;
 
        unsigned long long processes = 0, running = 0 , blocked = 0;
-       RRD_STATS *st;
+       RRDSET *st;
 
        for(l = 0; l < lines ;l++) {
                if(strncmp(procfile_lineword(ff, l, 0), "cpu", 3) == 0) {
@@ -72,39 +72,39 @@ int do_proc_stat(int update_every, unsigned long long dt) {
                        }
 
                        if((isthistotal && do_cpu) || (!isthistotal && do_cpu_cores)) {
-                               st = rrd_stats_find_bytype(type, id);
+                               st = rrdset_find_bytype(type, id);
                                if(!st) {
-                                       st = rrd_stats_create(type, id, NULL, "cpu", title, "percentage", priority, update_every, CHART_TYPE_STACKED);
+                                       st = rrdset_create(type, id, NULL, "cpu", title, "percentage", priority, update_every, RRDSET_TYPE_STACKED);
 
                                        long multiplier = 1;
                                        long divisor = 1; // sysconf(_SC_CLK_TCK);
 
-                                       rrd_stats_dimension_add(st, "guest_nice", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                                       rrd_stats_dimension_add(st, "guest", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                                       rrd_stats_dimension_add(st, "steal", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                                       rrd_stats_dimension_add(st, "softirq", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                                       rrd_stats_dimension_add(st, "irq", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                                       rrd_stats_dimension_add(st, "user", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                                       rrd_stats_dimension_add(st, "system", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                                       rrd_stats_dimension_add(st, "nice", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                                       rrd_stats_dimension_add(st, "iowait", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-
-                                       rrd_stats_dimension_add(st, "idle", NULL, multiplier, divisor, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
-                                       rrd_stats_dimension_hide(st, "idle");
+                                       rrddim_add(st, "guest_nice", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                                       rrddim_add(st, "guest", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                                       rrddim_add(st, "steal", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                                       rrddim_add(st, "softirq", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                                       rrddim_add(st, "irq", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                                       rrddim_add(st, "user", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                                       rrddim_add(st, "system", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                                       rrddim_add(st, "nice", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                                       rrddim_add(st, "iowait", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+
+                                       rrddim_add(st, "idle", NULL, multiplier, divisor, RRDDIM_PCENT_OVER_DIFF_TOTAL);
+                                       rrddim_hide(st, "idle");
                                }
-                               else rrd_stats_next(st);
-
-                               rrd_stats_dimension_set(st, "user", user);
-                               rrd_stats_dimension_set(st, "nice", nice);
-                               rrd_stats_dimension_set(st, "system", system);
-                               rrd_stats_dimension_set(st, "idle", idle);
-                               rrd_stats_dimension_set(st, "iowait", iowait);
-                               rrd_stats_dimension_set(st, "irq", irq);
-                               rrd_stats_dimension_set(st, "softirq", softirq);
-                               rrd_stats_dimension_set(st, "steal", steal);
-                               rrd_stats_dimension_set(st, "guest", guest);
-                               rrd_stats_dimension_set(st, "guest_nice", guest_nice);
-                               rrd_stats_done(st);
+                               else rrdset_next(st);
+
+                               rrddim_set(st, "user", user);
+                               rrddim_set(st, "nice", nice);
+                               rrddim_set(st, "system", system);
+                               rrddim_set(st, "idle", idle);
+                               rrddim_set(st, "iowait", iowait);
+                               rrddim_set(st, "irq", irq);
+                               rrddim_set(st, "softirq", softirq);
+                               rrddim_set(st, "steal", steal);
+                               rrddim_set(st, "guest", guest);
+                               rrddim_set(st, "guest_nice", guest_nice);
+                               rrdset_done(st);
                        }
                }
                else if(strcmp(procfile_lineword(ff, l, 0), "intr") == 0) {
@@ -113,17 +113,17 @@ int do_proc_stat(int update_every, unsigned long long dt) {
                        // --------------------------------------------------------------------
        
                        if(do_interrupts) {
-                               st = rrd_stats_find_bytype("system", "intr");
+                               st = rrdset_find_bytype("system", "intr");
                                if(!st) {
-                                       st = rrd_stats_create("system", "intr", NULL, "cpu", "CPU Interrupts", "interrupts/s", 900, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create("system", "intr", NULL, "cpu", "CPU Interrupts", "interrupts/s", 900, update_every, RRDSET_TYPE_LINE);
                                        st->isdetail = 1;
 
-                                       rrd_stats_dimension_add(st, "interrupts", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "interrupts", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "interrupts", value);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "interrupts", value);
+                               rrdset_done(st);
                        }
                }
                else if(strcmp(procfile_lineword(ff, l, 0), "ctxt") == 0) {
@@ -132,16 +132,16 @@ int do_proc_stat(int update_every, unsigned long long dt) {
                        // --------------------------------------------------------------------
        
                        if(do_context) {
-                               st = rrd_stats_find_bytype("system", "ctxt");
+                               st = rrdset_find_bytype("system", "ctxt");
                                if(!st) {
-                                       st = rrd_stats_create("system", "ctxt", NULL, "cpu", "CPU Context Switches", "context switches/s", 800, update_every, CHART_TYPE_LINE);
+                                       st = rrdset_create("system", "ctxt", NULL, "cpu", "CPU Context Switches", "context switches/s", 800, update_every, RRDSET_TYPE_LINE);
 
-                                       rrd_stats_dimension_add(st, "switches", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                                       rrddim_add(st, "switches", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                                }
-                               else rrd_stats_next(st);
+                               else rrdset_next(st);
 
-                               rrd_stats_dimension_set(st, "switches", value);
-                               rrd_stats_done(st);
+                               rrddim_set(st, "switches", value);
+                               rrdset_done(st);
                        }
                }
                else if(!processes && strcmp(procfile_lineword(ff, l, 0), "processes") == 0) {
@@ -158,34 +158,34 @@ int do_proc_stat(int update_every, unsigned long long dt) {
        // --------------------------------------------------------------------
 
        if(do_forks) {
-               st = rrd_stats_find_bytype("system", "forks");
+               st = rrdset_find_bytype("system", "forks");
                if(!st) {
-                       st = rrd_stats_create("system", "forks", NULL, "cpu", "New Processes", "processes/s", 700, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create("system", "forks", NULL, "cpu", "New Processes", "processes/s", 700, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "started", NULL, 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "started", NULL, 1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "started", processes);
-               rrd_stats_done(st);
+               rrddim_set(st, "started", processes);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
 
        if(do_processes) {
-               st = rrd_stats_find_bytype("system", "processes");
+               st = rrdset_find_bytype("system", "processes");
                if(!st) {
-                       st = rrd_stats_create("system", "processes", NULL, "cpu", "Processes", "processes", 600, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create("system", "processes", NULL, "cpu", "Processes", "processes", 600, update_every, RRDSET_TYPE_LINE);
 
-                       rrd_stats_dimension_add(st, "running", NULL, 1, 1, RRD_DIMENSION_ABSOLUTE);
-                       rrd_stats_dimension_add(st, "blocked", NULL, -1, 1, RRD_DIMENSION_ABSOLUTE);
+                       rrddim_add(st, "running", NULL, 1, 1, RRDDIM_ABSOLUTE);
+                       rrddim_add(st, "blocked", NULL, -1, 1, RRDDIM_ABSOLUTE);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "running", running);
-               rrd_stats_dimension_set(st, "blocked", blocked);
-               rrd_stats_done(st);
+               rrddim_set(st, "running", running);
+               rrddim_set(st, "blocked", blocked);
+               rrdset_done(st);
        }
 
        return 0;
index 9f77462b8ee890d65f1949b909798ac91059f74c..61c04387ca42ee631f408f02dcde79c283cbeeaa 100755 (executable)
@@ -150,58 +150,58 @@ int do_proc_vmstat(int update_every, unsigned long long dt) {
                else if(!thp_split && strcmp(name, "thp_split") == 0) thp_split = value;
        }
 
-       RRD_STATS *st;
+       RRDSET *st;
 
        // --------------------------------------------------------------------
        
        if(do_swapio) {
-               st = rrd_stats_find("system.swapio");
+               st = rrdset_find("system.swapio");
                if(!st) {
-                       st = rrd_stats_create("system", "swapio", NULL, "mem", "Swap I/O", "kilobytes/s", 250, update_every, CHART_TYPE_AREA);
+                       st = rrdset_create("system", "swapio", NULL, "mem", "Swap I/O", "kilobytes/s", 250, update_every, RRDSET_TYPE_AREA);
 
-                       rrd_stats_dimension_add(st, "in",  NULL, sysconf(_SC_PAGESIZE), 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "out", NULL, -sysconf(_SC_PAGESIZE), 1024 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "in",  NULL, sysconf(_SC_PAGESIZE), 1024 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "out", NULL, -sysconf(_SC_PAGESIZE), 1024 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "in", pswpin);
-               rrd_stats_dimension_set(st, "out", pswpout);
-               rrd_stats_done(st);
+               rrddim_set(st, "in", pswpin);
+               rrddim_set(st, "out", pswpout);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
        
        if(do_io) {
-               st = rrd_stats_find("system.io");
+               st = rrdset_find("system.io");
                if(!st) {
-                       st = rrd_stats_create("system", "io", NULL, "disk", "Disk I/O", "kilobytes/s", 150, update_every, CHART_TYPE_AREA);
+                       st = rrdset_create("system", "io", NULL, "disk", "Disk I/O", "kilobytes/s", 150, update_every, RRDSET_TYPE_AREA);
 
-                       rrd_stats_dimension_add(st, "in",  NULL,  1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "out", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "in",  NULL,  1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "out", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "in", pgpgin);
-               rrd_stats_dimension_set(st, "out", pgpgout);
-               rrd_stats_done(st);
+               rrddim_set(st, "in", pgpgin);
+               rrddim_set(st, "out", pgpgout);
+               rrdset_done(st);
        }
 
        // --------------------------------------------------------------------
        
        if(do_pgfaults) {
-               st = rrd_stats_find("system.pgfaults");
+               st = rrdset_find("system.pgfaults");
                if(!st) {
-                       st = rrd_stats_create("system", "pgfaults", NULL, "mem", "Memory Page Faults", "page faults/s", 500, update_every, CHART_TYPE_LINE);
+                       st = rrdset_create("system", "pgfaults", NULL, "mem", "Memory Page Faults", "page faults/s", 500, update_every, RRDSET_TYPE_LINE);
                        st->isdetail = 1;
 
-                       rrd_stats_dimension_add(st, "minor",  NULL,  1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-                       rrd_stats_dimension_add(st, "major", NULL, -1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
+                       rrddim_add(st, "minor",  NULL,  1, 1 * update_every, RRDDIM_INCREMENTAL);
+                       rrddim_add(st, "major", NULL, -1, 1 * update_every, RRDDIM_INCREMENTAL);
                }
-               else rrd_stats_next(st);
+               else rrdset_next(st);
 
-               rrd_stats_dimension_set(st, "minor", pgfault);
-               rrd_stats_dimension_set(st, "major", pgmajfault);
-               rrd_stats_done(st);
+               rrddim_set(st, "minor", pgfault);
+               rrddim_set(st, "major", pgmajfault);
+               rrdset_done(st);
        }
 
        return 0;
index 9841bbbd36f95f393afbf242c0d66d312707964c..f9bcd95b6bdaaa0d7c0952e7373434f6dc095a3f 100755 (executable)
@@ -26,9 +26,6 @@
 #ifndef NETDATA_PROCFILE_H
 #define NETDATA_PROCFILE_H 1
 
-// if enabled, procfile will output a lot of debug info
-extern int pfdebug;
-
 // ----------------------------------------------------------------------------
 // An array of words
 
index 98914dd99f29ad52a8181389b38bd3fb1d0a37b7..8675f84410cf39768f559534f69e385df2266988 100755 (executable)
--- a/src/rrd.c
+++ b/src/rrd.c
 
 #include "rrd.h"
 
-int update_every = UPDATE_EVERY;
-int save_history = HISTORY;
+// ----------------------------------------------------------------------------
+// globals
+
+int rrd_update_every = UPDATE_EVERY;
+int rrd_default_history_entries = RRD_DEFAULT_HISTORY_ENTRIES;
+
+RRDSET *rrdset_root = NULL;
+pthread_rwlock_t rrdset_root_rwlock = PTHREAD_RWLOCK_INITIALIZER;
+
+int rrd_memory_mode = RRD_MEMORY_MODE_SAVE;
+
+
+// ----------------------------------------------------------------------------
+// RRDSET index
+
+static int rrdset_iterator(avl *a) { if(a) {}; return 0; }
+
+static int rrdset_compare(void* a, void* b) {
+       if(((RRDSET *)a)->hash < ((RRDSET *)b)->hash) return -1;
+       else if(((RRDSET *)a)->hash > ((RRDSET *)b)->hash) return 1;
+       else return strcmp(((RRDSET *)a)->id, ((RRDSET *)b)->id);
+}
+
+avl_tree rrdset_root_index = {
+               NULL,
+               rrdset_compare
+};
+
+#define rrdset_index_add(st) avl_insert(&rrdset_root_index, (avl *)(st))
+#define rrdset_index_del(st) avl_remove(&rrdset_root_index, (avl *)(st))
+
+static RRDSET *rrdset_index_find(const char *id, unsigned long hash) {
+       RRDSET *result = NULL, tmp;
+       strncpy(tmp.id, id, RRD_ID_LENGTH_MAX);
+       tmp.id[RRD_ID_LENGTH_MAX] = '\0';
+       tmp.hash = (hash)?hash:simple_hash(tmp.id);
+
+       avl_search(&(rrdset_root_index), (avl *)&tmp, rrdset_iterator, (avl **)&result);
+       return result;
+}
+
+// ----------------------------------------------------------------------------
+// RRDDIM index
+
+static int rrddim_iterator(avl *a) { if(a) {}; return 0; }
+
+static int rrddim_compare(void* a, void* b) {
+       if(((RRDDIM *)a)->hash < ((RRDDIM *)b)->hash) return -1;
+       else if(((RRDDIM *)a)->hash > ((RRDDIM *)b)->hash) return 1;
+       else return strcmp(((RRDDIM *)a)->id, ((RRDDIM *)b)->id);
+}
+
+#define rrddim_index_add(st, rd) avl_insert(&((st)->dimensions_index), (avl *)(rd))
+#define rrddim_index_del(st,rd ) avl_remove(&((st)->dimensions_index), (avl *)(rd))
+
+static RRDDIM *rrddim_index_find(RRDSET *st, const char *id, unsigned long hash) {
+       RRDDIM *result = NULL, tmp;
+       tmp.hash = (hash)?hash:simple_hash(id);
+       strncpy(tmp.id, id, RRD_ID_LENGTH_MAX);
+       tmp.id[RRD_ID_LENGTH_MAX] = '\0';
+       tmp.hash = (hash)?hash:simple_hash(tmp.id);
+
+       avl_search(&(st->dimensions_index), (avl *)&tmp, rrddim_iterator, (avl **)&result);
+       return result;
+}
 
 // ----------------------------------------------------------------------------
 // chart types
 
-int chart_type_id(const char *name)
+int rrdset_type_id(const char *name)
 {
-       if(strcmp(name, CHART_TYPE_AREA_NAME) == 0) return CHART_TYPE_AREA;
-       if(strcmp(name, CHART_TYPE_STACKED_NAME) == 0) return CHART_TYPE_STACKED;
-       if(strcmp(name, CHART_TYPE_LINE_NAME) == 0) return CHART_TYPE_LINE;
-       return CHART_TYPE_LINE;
+       if(strcmp(name, RRDSET_TYPE_AREA_NAME) == 0) return RRDSET_TYPE_AREA;
+       if(strcmp(name, RRDSET_TYPE_STACKED_NAME) == 0) return RRDSET_TYPE_STACKED;
+       if(strcmp(name, RRDSET_TYPE_LINE_NAME) == 0) return RRDSET_TYPE_LINE;
+       return RRDSET_TYPE_LINE;
 }
 
-const char *chart_type_name(int chart_type)
+const char *rrdset_type_name(int chart_type)
 {
-       static char line[] = CHART_TYPE_LINE_NAME;
-       static char area[] = CHART_TYPE_AREA_NAME;
-       static char stacked[] = CHART_TYPE_STACKED_NAME;
+       static char line[] = RRDSET_TYPE_LINE_NAME;
+       static char area[] = RRDSET_TYPE_AREA_NAME;
+       static char stacked[] = RRDSET_TYPE_STACKED_NAME;
 
        switch(chart_type) {
-               case CHART_TYPE_LINE:
+               case RRDSET_TYPE_LINE:
                        return line;
 
-               case CHART_TYPE_AREA:
+               case RRDSET_TYPE_AREA:
                        return area;
 
-               case CHART_TYPE_STACKED:
+               case RRDSET_TYPE_STACKED:
                        return stacked;
        }
        return line;
 }
 
 // ----------------------------------------------------------------------------
-// mmap() wrapper
+// load / save
 
-int memory_mode = NETDATA_MEMORY_MODE_SAVE;
-
-const char *memory_mode_name(int id)
+const char *rrd_memory_mode_name(int id)
 {
-       static const char ram[] = NETDATA_MEMORY_MODE_RAM_NAME;
-       static const char map[] = NETDATA_MEMORY_MODE_MAP_NAME;
-       static const char save[] = NETDATA_MEMORY_MODE_SAVE_NAME;
+       static const char ram[] = RRD_MEMORY_MODE_RAM_NAME;
+       static const char map[] = RRD_MEMORY_MODE_MAP_NAME;
+       static const char save[] = RRD_MEMORY_MODE_SAVE_NAME;
 
        switch(id) {
-               case NETDATA_MEMORY_MODE_RAM:
+               case RRD_MEMORY_MODE_RAM:
                        return ram;
 
-               case NETDATA_MEMORY_MODE_MAP:
+               case RRD_MEMORY_MODE_MAP:
                        return map;
 
-               case NETDATA_MEMORY_MODE_SAVE:
+               case RRD_MEMORY_MODE_SAVE:
                default:
                        return save;
        }
@@ -75,55 +136,55 @@ const char *memory_mode_name(int id)
        return save;
 }
 
-int memory_mode_id(const char *name)
+int rrd_memory_mode_id(const char *name)
 {
-       if(!strcmp(name, NETDATA_MEMORY_MODE_RAM_NAME))
-               return NETDATA_MEMORY_MODE_RAM;
-       else if(!strcmp(name, NETDATA_MEMORY_MODE_MAP_NAME))
-               return NETDATA_MEMORY_MODE_MAP;
+       if(!strcmp(name, RRD_MEMORY_MODE_RAM_NAME))
+               return RRD_MEMORY_MODE_RAM;
+       else if(!strcmp(name, RRD_MEMORY_MODE_MAP_NAME))
+               return RRD_MEMORY_MODE_MAP;
 
-       return NETDATA_MEMORY_MODE_SAVE;
+       return RRD_MEMORY_MODE_SAVE;
 }
 
 // ----------------------------------------------------------------------------
 // algorithms types
 
-int algorithm_id(const char *name)
+int rrddim_algorithm_id(const char *name)
 {
-       if(strcmp(name, RRD_DIMENSION_ABSOLUTE_NAME) == 0)                      return RRD_DIMENSION_ABSOLUTE;
-       if(strcmp(name, RRD_DIMENSION_INCREMENTAL_NAME) == 0)                   return RRD_DIMENSION_INCREMENTAL;
-       if(strcmp(name, RRD_DIMENSION_PCENT_OVER_ROW_TOTAL_NAME) == 0)          return RRD_DIMENSION_PCENT_OVER_ROW_TOTAL;
-       if(strcmp(name, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL_NAME) == 0)         return RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL;
-       return RRD_DIMENSION_ABSOLUTE;
+       if(strcmp(name, RRDDIM_ABSOLUTE_NAME) == 0)                     return RRDDIM_ABSOLUTE;
+       if(strcmp(name, RRDDIM_INCREMENTAL_NAME) == 0)                  return RRDDIM_INCREMENTAL;
+       if(strcmp(name, RRDDIM_PCENT_OVER_ROW_TOTAL_NAME) == 0)                 return RRDDIM_PCENT_OVER_ROW_TOTAL;
+       if(strcmp(name, RRDDIM_PCENT_OVER_DIFF_TOTAL_NAME) == 0)        return RRDDIM_PCENT_OVER_DIFF_TOTAL;
+       return RRDDIM_ABSOLUTE;
 }
 
-const char *algorithm_name(int chart_type)
+const char *rrddim_algorithm_name(int chart_type)
 {
-       static char absolute[] = RRD_DIMENSION_ABSOLUTE_NAME;
-       static char incremental[] = RRD_DIMENSION_INCREMENTAL_NAME;
-       static char percentage_of_absolute_row[] = RRD_DIMENSION_PCENT_OVER_ROW_TOTAL_NAME;
-       static char percentage_of_incremental_row[] = RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL_NAME;
+       static char absolute[] = RRDDIM_ABSOLUTE_NAME;
+       static char incremental[] = RRDDIM_INCREMENTAL_NAME;
+       static char percentage_of_absolute_row[] = RRDDIM_PCENT_OVER_ROW_TOTAL_NAME;
+       static char percentage_of_incremental_row[] = RRDDIM_PCENT_OVER_DIFF_TOTAL_NAME;
 
        switch(chart_type) {
-               case RRD_DIMENSION_ABSOLUTE:
+               case RRDDIM_ABSOLUTE:
                        return absolute;
 
-               case RRD_DIMENSION_INCREMENTAL:
+               case RRDDIM_INCREMENTAL:
                        return incremental;
 
-               case RRD_DIMENSION_PCENT_OVER_ROW_TOTAL:
+               case RRDDIM_PCENT_OVER_ROW_TOTAL:
                        return percentage_of_absolute_row;
 
-               case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL:
+               case RRDDIM_PCENT_OVER_DIFF_TOTAL:
                        return percentage_of_incremental_row;
        }
        return absolute;
 }
 
-RRD_STATS *root = NULL;
-pthread_rwlock_t root_rwlock = PTHREAD_RWLOCK_INITIALIZER;
+// ----------------------------------------------------------------------------
+// chart names
 
-char *rrd_stats_strncpy_name(char *to, const char *from, int length)
+char *rrdset_strncpy_name(char *to, const char *from, int length)
 {
        int i;
        for(i = 0; i < length && from[i] ;i++) {
@@ -136,18 +197,21 @@ char *rrd_stats_strncpy_name(char *to, const char *from, int length)
        return to;
 }
 
-void rrd_stats_set_name(RRD_STATS *st, const char *name)
+void rrdset_set_name(RRDSET *st, const char *name)
 {
        char b[CONFIG_MAX_VALUE + 1];
-       char n[RRD_STATS_NAME_MAX + 1];
+       char n[RRD_ID_LENGTH_MAX + 1];
 
-       snprintf(n, RRD_STATS_NAME_MAX, "%s.%s", st->type, name);
-       rrd_stats_strncpy_name(b, n, CONFIG_MAX_VALUE);
+       snprintf(n, RRD_ID_LENGTH_MAX, "%s.%s", st->type, name);
+       rrdset_strncpy_name(b, n, CONFIG_MAX_VALUE);
        st->name = config_get(st->id, "name", b);
        st->hash_name = simple_hash(st->name);
 }
 
-char *rrd_stats_cache_dir(const char *id)
+// ----------------------------------------------------------------------------
+// cache directory
+
+char *rrdset_cache_dir(const char *id)
 {
        char *ret = NULL;
 
@@ -156,12 +220,12 @@ char *rrd_stats_cache_dir(const char *id)
 
        char b[FILENAME_MAX + 1];
        char n[FILENAME_MAX + 1];
-       rrd_stats_strncpy_name(b, id, FILENAME_MAX);
+       rrdset_strncpy_name(b, id, FILENAME_MAX);
 
        snprintf(n, FILENAME_MAX, "%s/%s", cache_dir, b);
        ret = config_get(id, "database directory", n);
 
-       if(memory_mode == NETDATA_MEMORY_MODE_MAP || memory_mode == NETDATA_MEMORY_MODE_SAVE) {
+       if(rrd_memory_mode == RRD_MEMORY_MODE_MAP || rrd_memory_mode == RRD_MEMORY_MODE_SAVE) {
                int r = mkdir(ret, 0775);
                if(r != 0 && errno != EEXIST)
                        error("Cannot create directory '%s'", ret);
@@ -170,7 +234,10 @@ char *rrd_stats_cache_dir(const char *id)
        return ret;
 }
 
-void rrd_stats_reset(RRD_STATS *st)
+// ----------------------------------------------------------------------------
+// core functions
+
+void rrdset_reset(RRDSET *st)
 {
        st->last_collected_time.tv_sec = 0;
        st->last_collected_time.tv_usec = 0;
@@ -180,7 +247,7 @@ void rrd_stats_reset(RRD_STATS *st)
        st->counter = 0;
        st->counter_done = 0;
 
-       RRD_DIMENSION *rd;
+       RRDDIM *rd;
        for(rd = st->dimensions; rd ; rd = rd->next) {
                rd->last_collected_time.tv_sec = 0;
                rd->last_collected_time.tv_usec = 0;
@@ -188,35 +255,35 @@ void rrd_stats_reset(RRD_STATS *st)
        }
 }
 
-RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name, const char *family, const char *title, const char *units, long priority, int update_every, int chart_type)
+RRDSET *rrdset_create(const char *type, const char *id, const char *name, const char *family, const char *title, const char *units, long priority, int update_every, int chart_type)
 {
        if(!id || !id[0]) {
                fatal("Cannot create rrd stats without an id.");
                return NULL;
        }
 
-       char fullid[RRD_STATS_NAME_MAX + 1];
+       char fullid[RRD_ID_LENGTH_MAX + 1];
        char fullfilename[FILENAME_MAX + 1];
-       RRD_STATS *st = NULL;
+       RRDSET *st = NULL;
 
-       snprintf(fullid, RRD_STATS_NAME_MAX, "%s.%s", type, id);
+       snprintf(fullid, RRD_ID_LENGTH_MAX, "%s.%s", type, id);
 
-       long entries = config_get_number(fullid, "history", save_history);
+       long entries = config_get_number(fullid, "history", rrd_default_history_entries);
        if(entries < 5) entries = config_set_number(fullid, "history", 5);
-       if(entries > HISTORY_MAX) entries = config_set_number(fullid, "history", HISTORY_MAX);
+       if(entries > RRD_HISTORY_ENTRIES_MAX) entries = config_set_number(fullid, "history", RRD_HISTORY_ENTRIES_MAX);
 
        int enabled = config_get_boolean(fullid, "enabled", 1);
        if(!enabled) entries = 5;
 
-       unsigned long size = sizeof(RRD_STATS);
-       char *cache_dir = rrd_stats_cache_dir(fullid);
+       unsigned long size = sizeof(RRDSET);
+       char *cache_dir = rrdset_cache_dir(fullid);
 
        debug(D_RRD_CALLS, "Creating RRD_STATS for '%s.%s'.", type, id);
 
        snprintf(fullfilename, FILENAME_MAX, "%s/main.db", cache_dir);
-       if(memory_mode != NETDATA_MEMORY_MODE_RAM) st = (RRD_STATS *)mymmap(fullfilename, size, ((memory_mode == NETDATA_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE));
+       if(rrd_memory_mode != RRD_MEMORY_MODE_RAM) st = (RRDSET *)mymmap(fullfilename, size, ((rrd_memory_mode == RRD_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE));
        if(st) {
-               if(strcmp(st->magic, RRD_STATS_MAGIC) != 0) {
+               if(strcmp(st->magic, RRDSET_MAGIC) != 0) {
                        errno = 0;
                        info("Initializing file %s.", fullfilename);
                        bzero(st, size);
@@ -253,7 +320,7 @@ RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name,
                st->units = NULL;
                st->dimensions = NULL;
                st->next = NULL;
-               st->mapped = memory_mode;
+               st->mapped = rrd_memory_mode;
        }
        else {
                st = calloc(1, size);
@@ -261,14 +328,14 @@ RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name,
                        fatal("Cannot allocate memory for RRD_STATS %s.%s", type, id);
                        return NULL;
                }
-               st->mapped = NETDATA_MEMORY_MODE_RAM;
+               st->mapped = RRD_MEMORY_MODE_RAM;
        }
        st->memsize = size;
        st->entries = entries;
        st->update_every = update_every;
 
-       strcpy(st->cache_file, fullfilename);
-       strcpy(st->magic, RRD_STATS_MAGIC);
+       strcpy(st->cache_filename, fullfilename);
+       strcpy(st->magic, RRDSET_MAGIC);
 
        strcpy(st->id, fullid);
        st->hash = simple_hash(st->id);
@@ -278,10 +345,10 @@ RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name,
        st->family     = config_get(st->id, "family", family?family:st->id);
        st->units      = config_get(st->id, "units", units?units:"");
        st->type       = config_get(st->id, "type", type);
-       st->chart_type = chart_type_id(config_get(st->id, "chart type", chart_type_name(chart_type)));
+       st->chart_type = rrdset_type_id(config_get(st->id, "chart type", rrdset_type_name(chart_type)));
 
-       if(name && *name) rrd_stats_set_name(st, name);
-       else rrd_stats_set_name(st, id);
+       if(name && *name) rrdset_set_name(st, name);
+       else rrdset_set_name(st, id);
 
        {
                char varvalue[CONFIG_MAX_VALUE + 1];
@@ -299,38 +366,43 @@ RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name,
        st->last_collected_time.tv_usec = 0;
        st->counter_done = 0;
 
-       st->gap_when_lost_iterations = config_get_number(st->id, "gap when lost iterations above", DEFAULT_GAP_INTERPOLATIONS);
+       st->gap_when_lost_iterations_above = config_get_number(st->id, "gap when lost iterations above", RRD_DEFAULT_GAP_INTERPOLATIONS);
+
+       st->dimensions_index.root = NULL;
+       st->dimensions_index.compar = rrddim_compare;
 
        pthread_rwlock_init(&st->rwlock, NULL);
-       pthread_rwlock_wrlock(&root_rwlock);
+       pthread_rwlock_wrlock(&rrdset_root_rwlock);
+
+       st->next = rrdset_root;
+       rrdset_root = st;
 
-       st->next = root;
-       root = st;
+       rrdset_index_add(st);
 
-       pthread_rwlock_unlock(&root_rwlock);
+       pthread_rwlock_unlock(&rrdset_root_rwlock);
 
        return(st);
 }
 
-RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char *name, long multiplier, long divisor, int algorithm)
+RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, long multiplier, long divisor, int algorithm)
 {
        char filename[FILENAME_MAX + 1];
        char fullfilename[FILENAME_MAX + 1];
 
        char varname[CONFIG_MAX_NAME + 1];
-       RRD_DIMENSION *rd = NULL;
-       unsigned long size = sizeof(RRD_DIMENSION) + (st->entries * sizeof(storage_number));
+       RRDDIM *rd = NULL;
+       unsigned long size = sizeof(RRDDIM) + (st->entries * sizeof(storage_number));
 
        debug(D_RRD_CALLS, "Adding dimension '%s/%s'.", st->id, id);
 
-       rrd_stats_strncpy_name(filename, id, FILENAME_MAX);
+       rrdset_strncpy_name(filename, id, FILENAME_MAX);
        snprintf(fullfilename, FILENAME_MAX, "%s/%s.db", st->cache_dir, filename);
-       if(memory_mode != NETDATA_MEMORY_MODE_RAM) rd = (RRD_DIMENSION *)mymmap(fullfilename, size, ((memory_mode == NETDATA_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE));
+       if(rrd_memory_mode != RRD_MEMORY_MODE_RAM) rd = (RRDDIM *)mymmap(fullfilename, size, ((rrd_memory_mode == RRD_MEMORY_MODE_MAP)?MAP_SHARED:MAP_PRIVATE));
        if(rd) {
                struct timeval now;
                gettimeofday(&now, NULL);
 
-               if(strcmp(rd->magic, RRD_DIMENSION_MAGIC) != 0) {
+               if(strcmp(rd->magic, RRDDIMENSION_MAGIC) != 0) {
                        errno = 0;
                        info("Initializing file %s.", fullfilename);
                        bzero(rd, size);
@@ -376,7 +448,7 @@ RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char
 
        if(rd) {
                // we have a file mapped for rd
-               rd->mapped = memory_mode;
+               rd->mapped = rrd_memory_mode;
                rd->hidden = 0;
                rd->next = NULL;
                rd->name = NULL;
@@ -390,20 +462,20 @@ RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char
                        return NULL;
                }
 
-               rd->mapped = NETDATA_MEMORY_MODE_RAM;
+               rd->mapped = RRD_MEMORY_MODE_RAM;
        }
        rd->memsize = size;
 
-       strcpy(rd->magic, RRD_DIMENSION_MAGIC);
-       strcpy(rd->cache_file, fullfilename);
-       strncpy(rd->id, id, RRD_STATS_NAME_MAX);
+       strcpy(rd->magic, RRDDIMENSION_MAGIC);
+       strcpy(rd->cache_filename, fullfilename);
+       strncpy(rd->id, id, RRD_ID_LENGTH_MAX);
        rd->hash = simple_hash(rd->id);
 
        snprintf(varname, CONFIG_MAX_NAME, "dim %s name", rd->id);
        rd->name = config_get(st->id, varname, (name && *name)?name:rd->id);
 
        snprintf(varname, CONFIG_MAX_NAME, "dim %s algorithm", rd->id);
-       rd->algorithm = algorithm_id(config_get(st->id, varname, algorithm_name(algorithm)));
+       rd->algorithm = rrddim_algorithm_id(config_get(st->id, varname, rrddim_algorithm_name(algorithm)));
 
        snprintf(varname, CONFIG_MAX_NAME, "dim %s multiplier", rd->id);
        rd->multiplier = config_get_number(st->id, varname, multiplier);
@@ -419,33 +491,47 @@ RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char
        if(!st->dimensions)
                st->dimensions = rd;
        else {
-               RRD_DIMENSION *td = st->dimensions;
+               RRDDIM *td = st->dimensions;
                for(; td->next; td = td->next) ;
                td->next = rd;
        }
 
+       rrddim_index_add(st, rd);
+
        return(rd);
 }
 
-void rrd_stats_dimension_set_name(RRD_STATS *st, RRD_DIMENSION *rd, const char *name)
+void rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name)
 {
        char varname[CONFIG_MAX_NAME + 1];
        snprintf(varname, CONFIG_MAX_NAME, "dim %s name", rd->id);
        config_get(st->id, varname, name);
 }
 
-void rrd_stats_dimension_free(RRD_DIMENSION *rd)
+void rrddim_free(RRDSET *st, RRDDIM *rd)
 {
-       if(rd->next) rrd_stats_dimension_free(rd->next);
+       RRDDIM *i = st->dimensions, *last = NULL;
+       for(i = st->dimensions; i && i != rd ; i = i->next) last = i;
+
+       if(!i) {
+               error("Request to free dimension %s.%s but it is not linked.", st->id, rd->name);
+               return;
+       }
+
+       if(last) last = i->next;
+       else st->dimensions = i->next;
+
+       rrddim_index_del(st, rd);
+
        // free(rd->annotations);
-       if(rd->mapped == NETDATA_MEMORY_MODE_SAVE) {
-               debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_file);
-               savememory(rd->cache_file, rd, rd->memsize);
+       if(rd->mapped == 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);
 
                debug(D_RRD_CALLS, "Unmapping dimension '%s'.", rd->name);
                munmap(rd, rd->memsize);
        }
-       else if(rd->mapped == NETDATA_MEMORY_MODE_MAP) {
+       else if(rd->mapped == RRD_MEMORY_MODE_MAP) {
                debug(D_RRD_CALLS, "Unmapping dimension '%s'.", rd->name);
                munmap(rd, rd->memsize);
        }
@@ -455,25 +541,27 @@ void rrd_stats_dimension_free(RRD_DIMENSION *rd)
        }
 }
 
-void rrd_stats_free_all(void)
+void rrdset_free_all(void)
 {
        info("Freeing all memory...");
 
-       RRD_STATS *st;
-       for(st = root; st ;) {
-               RRD_STATS *next = st->next;
+       RRDSET *st;
+       for(st = rrdset_root; st ;) {
+               RRDSET *next = st->next;
 
-               if(st->dimensions) rrd_stats_dimension_free(st->dimensions);
-               st->dimensions = NULL;
+               while(st->dimensions)
+                       rrddim_free(st, st->dimensions);
 
-               if(st->mapped == NETDATA_MEMORY_MODE_SAVE) {
-                       debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_file);
-                       savememory(st->cache_file, st, st->memsize);
+               rrdset_index_del(st);
+
+               if(st->mapped == RRD_MEMORY_MODE_SAVE) {
+                       debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_filename);
+                       savememory(st->cache_filename, st, st->memsize);
 
                        debug(D_RRD_CALLS, "Unmapping stats '%s'.", st->name);
                        munmap(st, st->memsize);
                }
-               else if(st->mapped == NETDATA_MEMORY_MODE_MAP) {
+               else if(st->mapped == RRD_MEMORY_MODE_MAP) {
                        debug(D_RRD_CALLS, "Unmapping stats '%s'.", st->name);
                        munmap(st, st->memsize);
                }
@@ -482,111 +570,96 @@ void rrd_stats_free_all(void)
 
                st = next;
        }
-       root = NULL;
+       rrdset_root = NULL;
 
        info("Memory cleanup completed...");
 }
 
-void rrd_stats_save_all(void)
+void rrdset_save_all(void)
 {
-       RRD_STATS *st;
-       RRD_DIMENSION *rd;
+       RRDSET *st;
+       RRDDIM *rd;
 
-       pthread_rwlock_wrlock(&root_rwlock);
-       for(st = root; st ; st = st->next) {
+       pthread_rwlock_wrlock(&rrdset_root_rwlock);
+       for(st = rrdset_root; st ; st = st->next) {
                pthread_rwlock_wrlock(&st->rwlock);
 
-               if(st->mapped == NETDATA_MEMORY_MODE_SAVE) {
-                       debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_file);
-                       savememory(st->cache_file, st, st->memsize);
+               if(st->mapped == RRD_MEMORY_MODE_SAVE) {
+                       debug(D_RRD_CALLS, "Saving stats '%s' to '%s'.", st->name, st->cache_filename);
+                       savememory(st->cache_filename, st, st->memsize);
                }
 
                for(rd = st->dimensions; rd ; rd = rd->next) {
-                       if(rd->mapped == NETDATA_MEMORY_MODE_SAVE) {
-                               debug(D_RRD_CALLS, "Saving dimension '%s' to '%s'.", rd->name, rd->cache_file);
-                               savememory(rd->cache_file, rd, rd->memsize);
+                       if(rd->mapped == 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);
                        }
                }
 
                pthread_rwlock_unlock(&st->rwlock);
        }
-       pthread_rwlock_unlock(&root_rwlock);
+       pthread_rwlock_unlock(&rrdset_root_rwlock);
 }
 
 
-RRD_STATS *rrd_stats_find(const char *id)
+RRDSET *rrdset_find(const char *id)
 {
        debug(D_RRD_CALLS, "rrd_stats_find() for chart %s", id);
 
-       unsigned long hash = simple_hash(id);
-
-       pthread_rwlock_rdlock(&root_rwlock);
-       RRD_STATS *st = root;
-       for ( ; st ; st = st->next )
-               if(hash == st->hash)
-                       if(strcmp(st->id, id) == 0)
-                               break;
-       pthread_rwlock_unlock(&root_rwlock);
+       pthread_rwlock_rdlock(&rrdset_root_rwlock);
+       RRDSET *st = rrdset_index_find(id, 0);
+       pthread_rwlock_unlock(&rrdset_root_rwlock);
 
        return(st);
 }
 
-RRD_STATS *rrd_stats_find_bytype(const char *type, const char *id)
+RRDSET *rrdset_find_bytype(const char *type, const char *id)
 {
        debug(D_RRD_CALLS, "rrd_stats_find_bytype() for chart %s.%s", type, id);
 
-       char buf[RRD_STATS_NAME_MAX + 1];
+       char buf[RRD_ID_LENGTH_MAX + 1];
 
-       strncpy(buf, type, RRD_STATS_NAME_MAX - 1);
-       buf[RRD_STATS_NAME_MAX - 1] = '\0';
+       strncpy(buf, type, RRD_ID_LENGTH_MAX - 1);
+       buf[RRD_ID_LENGTH_MAX - 1] = '\0';
        strcat(buf, ".");
        int len = strlen(buf);
-       strncpy(&buf[len], id, RRD_STATS_NAME_MAX - len);
-       buf[RRD_STATS_NAME_MAX] = '\0';
+       strncpy(&buf[len], id, RRD_ID_LENGTH_MAX - len);
+       buf[RRD_ID_LENGTH_MAX] = '\0';
 
-       return(rrd_stats_find(buf));
+       return(rrdset_find(buf));
 }
 
-RRD_STATS *rrd_stats_find_byname(const char *name)
+RRDSET *rrdset_find_byname(const char *name)
 {
        debug(D_RRD_CALLS, "rrd_stats_find_byname() for chart %s", name);
 
        char b[CONFIG_MAX_VALUE + 1];
 
-       rrd_stats_strncpy_name(b, name, CONFIG_MAX_VALUE);
+       rrdset_strncpy_name(b, name, CONFIG_MAX_VALUE);
        unsigned long hash = simple_hash(b);
 
-       pthread_rwlock_rdlock(&root_rwlock);
-       RRD_STATS *st = root;
+       pthread_rwlock_rdlock(&rrdset_root_rwlock);
+       RRDSET *st = rrdset_root;
        for ( ; st ; st = st->next ) {
                if(hash == st->hash_name && strcmp(st->name, b) == 0) break;
        }
-       pthread_rwlock_unlock(&root_rwlock);
+       pthread_rwlock_unlock(&rrdset_root_rwlock);
 
        return(st);
 }
 
-RRD_DIMENSION *rrd_stats_dimension_find(RRD_STATS *st, const char *id)
+RRDDIM *rrddim_find(RRDSET *st, const char *id)
 {
        debug(D_RRD_CALLS, "rrd_stats_dimension_find() for chart %s, dimension %s", st->name, id);
 
-       unsigned long hash = simple_hash(id);
-
-       RRD_DIMENSION *rd = st->dimensions;
-
-       for ( ; rd ; rd = rd->next )
-               if(hash == rd->hash)
-                       if(strcmp(rd->id, id) == 0)
-                               break;
-
-       return(rd);
+       return rrddim_index_find(st, id, 0);
 }
 
-int rrd_stats_dimension_hide(RRD_STATS *st, const char *id)
+int rrddim_hide(RRDSET *st, const char *id)
 {
        debug(D_RRD_CALLS, "rrd_stats_dimension_hide() for chart %s, dimension %s", st->name, id);
 
-       RRD_DIMENSION *rd = rrd_stats_dimension_find(st, id);
+       RRDDIM *rd = rrddim_find(st, id);
        if(!rd) {
                error("Cannot find dimension with id '%s' on stats '%s' (%s).", id, st->name, st->id);
                return 1;
@@ -596,7 +669,7 @@ int rrd_stats_dimension_hide(RRD_STATS *st, const char *id)
        return 0;
 }
 
-void rrd_stats_dimension_set_by_pointer(RRD_STATS *st, RRD_DIMENSION *rd, collected_number value)
+void rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number value)
 {
        debug(D_RRD_CALLS, "rrd_stats_dimension_set() for chart %s, dimension %s, value " COLLECTED_NUMBER_FORMAT, st->name, rd->name, value);
        
@@ -605,19 +678,19 @@ void rrd_stats_dimension_set_by_pointer(RRD_STATS *st, RRD_DIMENSION *rd, collec
        rd->updated = 1;
 }
 
-int rrd_stats_dimension_set(RRD_STATS *st, const char *id, collected_number value)
+int rrddim_set(RRDSET *st, const char *id, collected_number value)
 {
-       RRD_DIMENSION *rd = rrd_stats_dimension_find(st, id);
+       RRDDIM *rd = rrddim_find(st, id);
        if(!rd) {
                error("Cannot find dimension with id '%s' on stats '%s' (%s).", id, st->name, st->id);
                return 1;
        }
 
-       rrd_stats_dimension_set_by_pointer(st, rd, value);
+       rrddim_set_by_pointer(st, rd, value);
        return 0;
 }
 
-void rrd_stats_next_usec(RRD_STATS *st, unsigned long long microseconds)
+void rrdset_next_usec(RRDSET *st, unsigned long long microseconds)
 {
        debug(D_RRD_CALLS, "rrd_stats_next() for chart %s with microseconds %llu", st->name, microseconds);
 
@@ -625,7 +698,7 @@ void rrd_stats_next_usec(RRD_STATS *st, unsigned long long microseconds)
        st->usec_since_last_update = microseconds;
 }
 
-void rrd_stats_next(RRD_STATS *st)
+void rrdset_next(RRDSET *st)
 {
        unsigned long long microseconds = 0;
 
@@ -635,19 +708,19 @@ void rrd_stats_next(RRD_STATS *st)
                microseconds = usecdiff(&now, &st->last_collected_time);
        }
 
-       rrd_stats_next_usec(st, microseconds);
+       rrdset_next_usec(st, microseconds);
 }
 
-void rrd_stats_next_plugins(RRD_STATS *st)
+void rrdset_next_plugins(RRDSET *st)
 {
-       rrd_stats_next(st);
+       rrdset_next(st);
 }
 
-unsigned long long rrd_stats_done(RRD_STATS *st)
+unsigned long long rrdset_done(RRDSET *st)
 {
        debug(D_RRD_CALLS, "rrd_stats_done() for chart %s", st->name);
 
-       RRD_DIMENSION *rd, *last;
+       RRDDIM *rd, *last;
        int oldstate, store_this_entry = 1;
 
        if(pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate) != 0)
@@ -659,7 +732,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
        // check if the chart has a long time to be refreshed
        if(st->usec_since_last_update > st->entries * st->update_every * 1000000ULL) {
                info("%s: took too long to be updated (%0.3Lf secs). Reseting it.", st->name, (long double)(st->usec_since_last_update / 1000000.0));
-               rrd_stats_reset(st);
+               rrdset_reset(st);
                st->usec_since_last_update = st->update_every * 1000000ULL;
        }
        if(st->debug) debug(D_RRD_STATS, "%s: microseconds since last update: %llu", st->name, st->usec_since_last_update);
@@ -701,7 +774,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
        // check if we will re-write the entire data set
        if(usecdiff(&st->last_collected_time, &st->last_updated) > st->update_every * st->entries * 1000000ULL) {
                info("%s: too old data (last updated at %u.%u, last collected at %u.%u). 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);
-               rrd_stats_reset(st);
+               rrdset_reset(st);
 
                st->usec_since_last_update = st->update_every * 1000000ULL;
 
@@ -759,7 +832,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                        );
 
                switch(rd->algorithm) {
-                       case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL:
+                       case RRDDIM_PCENT_OVER_DIFF_TOTAL:
                                // the percentage of the current increment
                                // over the increment of all dimensions together
                                if(st->collected_total == st->last_collected_total) rd->calculated_value = rd->last_calculated_value;
@@ -780,7 +853,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                                                );
                                break;
 
-                       case RRD_DIMENSION_PCENT_OVER_ROW_TOTAL:
+                       case RRDDIM_PCENT_OVER_ROW_TOTAL:
                                if(!st->collected_total) rd->calculated_value = 0;
                                else
                                // the percentage of the current value
@@ -802,10 +875,14 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                                                );
                                break;
 
-                       case RRD_DIMENSION_INCREMENTAL:
+                       case RRDDIM_INCREMENTAL:
                                // if the new is smaller than the old (an overflow, or reset), set the old equal to the new
                                // to reset the calculation (it will give zero as the calculation for this second)
                                if(rd->last_collected_value > rd->collected_value) {
+                                       info("%s.%s: Detect RESET or OVERFLOW. Last collected value = " COLLECTED_NUMBER_FORMAT ", current = " COLLECTED_NUMBER_FORMAT
+                                                       , st->name, rd->name
+                                                       , rd->last_collected_value
+                                                       , rd->collected_value);
                                        storage_flags = SN_EXISTS_RESET;
                                        rd->last_collected_value = rd->collected_value;
                                }
@@ -822,7 +899,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                                                );
                                break;
 
-                       case RRD_DIMENSION_ABSOLUTE:
+                       case RRDDIM_ABSOLUTE:
                                rd->calculated_value = (calculated_number)rd->collected_value;
 
                                if(st->debug)
@@ -869,7 +946,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                        calculated_number new_value;
 
                        switch(rd->algorithm) {
-                               case RRD_DIMENSION_INCREMENTAL:
+                               case RRDDIM_INCREMENTAL:
                                        new_value = (calculated_number)
                                                (          rd->calculated_value
                                                        * (calculated_number)(next_ut - last_ut)
@@ -892,9 +969,9 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                                        rd->calculated_value -= new_value;
                                        break;
 
-                               case RRD_DIMENSION_ABSOLUTE:
-                               case RRD_DIMENSION_PCENT_OVER_ROW_TOTAL:
-                               case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL:
+                               case RRDDIM_ABSOLUTE:
+                               case RRDDIM_PCENT_OVER_ROW_TOTAL:
+                               case RRDDIM_PCENT_OVER_DIFF_TOTAL:
                                default:
                                        new_value = (calculated_number)
                                                (       (         (rd->calculated_value - rd->last_calculated_value)
@@ -926,7 +1003,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                                continue;
                        }
 
-                       if(rd->updated && iterations < st->gap_when_lost_iterations) {
+                       if(rd->updated && iterations < st->gap_when_lost_iterations_above) {
                                rd->values[st->current_entry] = pack_storage_number(
                                                  new_value
                                                * (calculated_number)rd->multiplier
@@ -1007,8 +1084,8 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                // we have to set the first calculated_value to zero
                // to eliminate the first spike
                if(st->counter_done == 1) switch(rd->algorithm) {
-                       case RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL:
-                       case RRD_DIMENSION_INCREMENTAL:
+                       case RRDDIM_PCENT_OVER_DIFF_TOTAL:
+                       case RRDDIM_INCREMENTAL:
                                rd->calculated_value = 0;
                                // the next time, a new incremental total will be calculated
                                break;
@@ -1037,14 +1114,14 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
                                if(!last) {
                                        st->dimensions = rd->next;
                                        rd->next = NULL;
-                                       rrd_stats_dimension_free(rd);
+                                       rrddim_free(st, rd);
                                        rd = st->dimensions;
                                        continue;
                                }
                                else {
                                        last->next = rd->next;
                                        rd->next = NULL;
-                                       rrd_stats_dimension_free(rd);
+                                       rrddim_free(st, rd);
                                        rd = last->next;
                                        continue;
                                }
@@ -1067,7 +1144,7 @@ unsigned long long rrd_stats_done(RRD_STATS *st)
 
 
 // find the oldest entry in the data, skipping all empty slots
-time_t rrd_stats_first_entry_t(RRD_STATS *st)
+time_t rrdset_first_entry_t(RRDSET *st)
 {
        if(!st->first_entry_t) return st->last_updated.tv_sec;
        
index 8a141e540f00d7e679b15c9c5790186f2199bbf6..a36f194c5aa3d98da0d385f273fde403fa885164 100755 (executable)
--- a/src/rrd.h
+++ b/src/rrd.h
@@ -1,6 +1,7 @@
 #include <sys/time.h>
 #include <pthread.h>
 
+#include "avl.h"
 #include "storage_number.h"
 
 #ifndef NETDATA_RRD_H
@@ -8,77 +9,81 @@
 
 #define UPDATE_EVERY 1
 #define UPDATE_EVERY_MAX 3600
-extern int update_every;
+extern int rrd_update_every;
 
-#define HISTORY 3600
-#define HISTORY_MAX (86400*10)
-extern int save_history;
+#define RRD_DEFAULT_HISTORY_ENTRIES 3600
+#define RRD_HISTORY_ENTRIES_MAX (86400*10)
+extern int rrd_default_history_entries;
 
-#define DEFAULT_GAP_INTERPOLATIONS 10
+#define RRD_DEFAULT_GAP_INTERPOLATIONS 10
 
 typedef long long total_number;
-
 #define TOTAL_NUMBER_FORMAT "%lld"
 
-#define RRD_STATS_NAME_MAX 1024
-
-#define RRD_STATS_MAGIC     "NETDATA CACHE STATS FILE V010"
-#define RRD_DIMENSION_MAGIC "NETDATA CACHE DIMENSION FILE V010"
+#define RRD_ID_LENGTH_MAX 1024
 
+#define RRDSET_MAGIC           "NETDATA CACHE STATS FILE V011"
+#define RRDDIMENSION_MAGIC     "NETDATA CACHE DIMENSION FILE V011"
 
 // ----------------------------------------------------------------------------
 // chart types
 
-#define CHART_TYPE_LINE_NAME "line"
-#define CHART_TYPE_AREA_NAME "area"
-#define CHART_TYPE_STACKED_NAME "stacked"
+#define RRDSET_TYPE_LINE_NAME "line"
+#define RRDSET_TYPE_AREA_NAME "area"
+#define RRDSET_TYPE_STACKED_NAME "stacked"
 
-#define CHART_TYPE_LINE        0
-#define CHART_TYPE_AREA 1
-#define CHART_TYPE_STACKED 2
+#define RRDSET_TYPE_LINE       0
+#define RRDSET_TYPE_AREA       1
+#define RRDSET_TYPE_STACKED 2
 
-int chart_type_id(const char *name);
-const char *chart_type_name(int chart_type);
+int rrdset_type_id(const char *name);
+const char *rrdset_type_name(int chart_type);
 
 
 // ----------------------------------------------------------------------------
 // memory mode
 
-#define NETDATA_MEMORY_MODE_RAM_NAME "ram"
-#define NETDATA_MEMORY_MODE_MAP_NAME "map"
-#define NETDATA_MEMORY_MODE_SAVE_NAME "save"
+#define RRD_MEMORY_MODE_RAM_NAME "ram"
+#define RRD_MEMORY_MODE_MAP_NAME "map"
+#define RRD_MEMORY_MODE_SAVE_NAME "save"
 
-#define NETDATA_MEMORY_MODE_RAM 0
-#define NETDATA_MEMORY_MODE_MAP 1
-#define NETDATA_MEMORY_MODE_SAVE 2
+#define RRD_MEMORY_MODE_RAM 0
+#define RRD_MEMORY_MODE_MAP 1
+#define RRD_MEMORY_MODE_SAVE 2
 
-extern int memory_mode;
+extern int rrd_memory_mode;
 
-extern const char *memory_mode_name(int id);
-extern int memory_mode_id(const char *name);
+extern const char *rrd_memory_mode_name(int id);
+extern int rrd_memory_mode_id(const char *name);
 
 
 // ----------------------------------------------------------------------------
 // algorithms types
 
-#define RRD_DIMENSION_ABSOLUTE_NAME                            "absolute"
-#define RRD_DIMENSION_INCREMENTAL_NAME                                 "incremental"
-#define RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL_NAME       "percentage-of-incremental-row"
-#define RRD_DIMENSION_PCENT_OVER_ROW_TOTAL_NAME                "percentage-of-absolute-row"
+#define RRDDIM_ABSOLUTE_NAME                           "absolute"
+#define RRDDIM_INCREMENTAL_NAME                        "incremental"
+#define RRDDIM_PCENT_OVER_DIFF_TOTAL_NAME      "percentage-of-incremental-row"
+#define RRDDIM_PCENT_OVER_ROW_TOTAL_NAME       "percentage-of-absolute-row"
+
+#define RRDDIM_ABSOLUTE                                        0
+#define RRDDIM_INCREMENTAL                             1
+#define RRDDIM_PCENT_OVER_DIFF_TOTAL   2
+#define RRDDIM_PCENT_OVER_ROW_TOTAL            3
+
+extern int rrddim_algorithm_id(const char *name);
+extern const char *rrddim_algorithm_name(int chart_type);
 
-#define RRD_DIMENSION_ABSOLUTE                 0
-#define RRD_DIMENSION_INCREMENTAL              1
-#define RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL    2
-#define RRD_DIMENSION_PCENT_OVER_ROW_TOTAL     3
 
-extern int algorithm_id(const char *name);
-extern const char *algorithm_name(int chart_type);
+// ----------------------------------------------------------------------------
+// RRD DIMENSION
+
+struct rrddim {
+       avl avl;
 
-struct rrd_dimension {
-       char magic[sizeof(RRD_DIMENSION_MAGIC) + 1];    // our magic
-       char id[RRD_STATS_NAME_MAX + 1];                                // the id of this dimension (for internal identification)
-       char *name;                                                                             // the name of this dimension (as presented to user)
-       char cache_file[FILENAME_MAX+1];
+       char magic[sizeof(RRDDIMENSION_MAGIC) + 1];             // our magic
+       char id[RRD_ID_LENGTH_MAX + 1];                                         // the id of this dimension (for internal identification)
+       const char *name;                                                               // the name of this dimension (as presented to user)
+       char cache_filename[FILENAME_MAX+1];
        
        unsigned long hash;                                                             // a simple hash on the id, to speed up searching
                                                                                                        // we first compare hashes, and only if the hashes are equal we do string comparisons
@@ -110,19 +115,25 @@ struct rrd_dimension {
        calculated_number collected_volume;
        calculated_number stored_volume;
 
-       struct rrd_dimension *next;                                             // linking of dimensions within the same data set
+       struct rrddim *next;                                            // linking of dimensions within the same data set
 
        storage_number values[];                                                // the array of values - THIS HAS TO BE THE LAST MEMBER
 };
-typedef struct rrd_dimension RRD_DIMENSION;
+typedef struct rrddim RRDDIM;
+
+
+// ----------------------------------------------------------------------------
+// RRDSET
+
+struct rrdset {
+       avl avl;
 
-struct rrd_stats {
-       char magic[sizeof(RRD_STATS_MAGIC) + 1];                // our magic
+       char magic[sizeof(RRDSET_MAGIC) + 1];                   // our magic
 
-       char id[RRD_STATS_NAME_MAX + 1];                                // id of the data set
-       char *name;                                                                             // name of the data set
+       char id[RRD_ID_LENGTH_MAX + 1];                                         // id of the data set
+       const char *name;                                                               // name of the data set
        char *cache_dir;                                                                // the directory to store dimension maps
-       char cache_file[FILENAME_MAX+1];
+       char cache_filename[FILENAME_MAX+1];
 
        char *type;                                                                             // the type of graph RRD_TYPE_* (a category, for determining graphing options)
        char *family;                                                                   // the family of this data set (for grouping them together)
@@ -140,7 +151,7 @@ struct rrd_stats {
        unsigned long hash;                                                             // a simple hash on the id, to speed up searching
                                                                                                        // we first compare hashes, and only if the hashes are equal we do string comparisons
 
-       int gap_when_lost_iterations;                                   // after how many lost iterations a gap should be stored
+       int gap_when_lost_iterations_above;                             // after how many lost iterations a gap should be stored
                                                                                                        // netdata will interpolate values for gaps lower than this
 
        long priority;
@@ -164,49 +175,58 @@ struct rrd_stats {
        int isdetail;                                                                   // if set, the data set should be considered as a detail of another
                                                                                                        // (the master data set should be the one that has the same family and is not detail)
 
-       RRD_DIMENSION *dimensions;                                              // the actual data for every dimension
+       RRDDIM *dimensions;                                                             // the actual data for every dimension
 
-       struct rrd_stats *next;                                                 // linking of rrd stats
+       avl_tree dimensions_index;
+
+       struct rrdset *next;                                                    // linking of rrdsets
 };
-typedef struct rrd_stats RRD_STATS;
+typedef struct rrdset RRDSET;
+
+extern RRDSET *rrdset_root;
+extern pthread_rwlock_t rrdset_root_rwlock;
 
-extern RRD_STATS *root;
-extern pthread_rwlock_t root_rwlock;
+// ----------------------------------------------------------------------------
+// RRD SET functions
+
+extern char *rrdset_strncpy_name(char *to, const char *from, int length);
+extern void rrdset_set_name(RRDSET *st, const char *name);
 
-extern char *rrd_stats_strncpy_name(char *to, const char *from, int length);
-extern void rrd_stats_set_name(RRD_STATS *st, const char *name);
+extern char *rrdset_cache_dir(const char *id);
 
-extern char *rrd_stats_cache_dir(const char *id);
+extern void rrdset_reset(RRDSET *st);
 
-extern void rrd_stats_reset(RRD_STATS *st);
+extern RRDSET *rrdset_create(const char *type, const char *id, const char *name, const char *family, const char *title, const char *units, long priority, int update_every, int chart_type);
 
-extern RRD_STATS *rrd_stats_create(const char *type, const char *id, const char *name, const char *family, const char *title, const char *units, long priority, int update_every, int chart_type);
+extern void rrdset_free_all(void);
+extern void rrdset_save_all(void);
 
-extern RRD_DIMENSION *rrd_stats_dimension_add(RRD_STATS *st, const char *id, const char *name, long multiplier, long divisor, int algorithm);
+extern RRDSET *rrdset_find(const char *id);
+extern RRDSET *rrdset_find_bytype(const char *type, const char *id);
+extern RRDSET *rrdset_find_byname(const char *name);
 
-extern void rrd_stats_dimension_set_name(RRD_STATS *st, RRD_DIMENSION *rd, const char *name);
-extern void rrd_stats_dimension_free(RRD_DIMENSION *rd);
+extern void rrdset_next_usec(RRDSET *st, unsigned long long microseconds);
+extern void rrdset_next(RRDSET *st);
+extern void rrdset_next_plugins(RRDSET *st);
 
-extern void rrd_stats_free_all(void);
-extern void rrd_stats_save_all(void);
+extern unsigned long long rrdset_done(RRDSET *st);
 
-extern RRD_STATS *rrd_stats_find(const char *id);
-extern RRD_STATS *rrd_stats_find_bytype(const char *type, const char *id);
-extern RRD_STATS *rrd_stats_find_byname(const char *name);
+extern time_t rrdset_first_entry_t(RRDSET *st);
 
-extern RRD_DIMENSION *rrd_stats_dimension_find(RRD_STATS *st, const char *id);
 
-extern int rrd_stats_dimension_hide(RRD_STATS *st, const char *id);
+// ----------------------------------------------------------------------------
+// RRD DIMENSION functions
+
+extern RRDDIM *rrddim_add(RRDSET *st, const char *id, const char *name, long multiplier, long divisor, int algorithm);
 
-extern void rrd_stats_dimension_set_by_pointer(RRD_STATS *st, RRD_DIMENSION *rd, collected_number value);
-extern int rrd_stats_dimension_set(RRD_STATS *st, const char *id, collected_number value);
+extern void rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name);
+extern void rrddim_free(RRDSET *st, RRDDIM *rd);
 
-extern void rrd_stats_next_usec(RRD_STATS *st, unsigned long long microseconds);
-extern void rrd_stats_next(RRD_STATS *st);
-extern void rrd_stats_next_plugins(RRD_STATS *st);
+extern RRDDIM *rrddim_find(RRDSET *st, const char *id);
 
-extern unsigned long long rrd_stats_done(RRD_STATS *st);
+extern int rrddim_hide(RRDSET *st, const char *id);
 
-extern time_t rrd_stats_first_entry_t(RRD_STATS *st);
+extern void rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number value);
+extern int rrddim_set(RRDSET *st, const char *id, collected_number value);
 
 #endif /* NETDATA_RRD_H */
index cb00fce0938fdb23d3adde791554643282b5f4fe..12bb5dcae4b8cc2aa0d0a010c3a2ff2b0d3637c0 100755 (executable)
@@ -8,7 +8,7 @@
 #define HOSTNAME_MAX 1024
 char *hostname = "unknown";
 
-unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer *wb)
+unsigned long rrd_stats_one_json(RRDSET *st, char *options, struct web_buffer *wb)
 {
        time_t now = time(NULL);
        web_buffer_increase(wb, 16384);
@@ -48,10 +48,10 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer
                , st->enabled
                , st->units
                , st->name, options?options:""
-               , chart_type_name(st->chart_type)
+               , rrdset_type_name(st->chart_type)
                , st->counter
                , st->entries
-               , rrd_stats_first_entry_t(st)
+               , rrdset_first_entry_t(st)
                , st->current_entry
                , st->last_updated.tv_sec
                , now - (st->last_updated.tv_sec > now) ? now : st->last_updated.tv_sec
@@ -64,7 +64,7 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer
 
        unsigned long memory = st->memsize;
 
-       RRD_DIMENSION *rd;
+       RRDDIM *rd;
        for(rd = st->dimensions; rd ; rd = rd->next) {
                memory += rd->memsize;
 
@@ -88,7 +88,7 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer
                        , rd->name
                        , rd->entries
                        , rd->hidden
-                       , algorithm_name(rd->algorithm)
+                       , rrddim_algorithm_name(rd->algorithm)
                        , rd->multiplier
                        , rd->divisor
                        , rd->last_collected_time.tv_sec
@@ -115,7 +115,7 @@ unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer
 #define RRD_GRAPH_JSON_HEADER "{\n\t\"charts\": [\n"
 #define RRD_GRAPH_JSON_FOOTER "\n\t]\n}\n"
 
-void rrd_stats_graph_json(RRD_STATS *st, char *options, struct web_buffer *wb)
+void rrd_stats_graph_json(RRDSET *st, char *options, struct web_buffer *wb)
 {
        web_buffer_increase(wb, 16384);
 
@@ -130,19 +130,19 @@ void rrd_stats_all_json(struct web_buffer *wb)
 
        unsigned long memory = 0;
        long c;
-       RRD_STATS *st;
+       RRDSET *st;
 
        web_buffer_printf(wb, RRD_GRAPH_JSON_HEADER);
 
-       pthread_rwlock_rdlock(&root_rwlock);
-       for(st = root, c = 0; st ; st = st->next) {
+       pthread_rwlock_rdlock(&rrdset_root_rwlock);
+       for(st = rrdset_root, c = 0; st ; st = st->next) {
                if(st->enabled) {
                        if(c) web_buffer_printf(wb, "%s", ",\n");
                        memory += rrd_stats_one_json(st, NULL, wb);
                        c++;
                }
        }
-       pthread_rwlock_unlock(&root_rwlock);
+       pthread_rwlock_unlock(&rrdset_root_rwlock);
        
        web_buffer_printf(wb, "\n\t],\n"
                "\t\"hostname\": \"%s\",\n"
@@ -151,13 +151,13 @@ void rrd_stats_all_json(struct web_buffer *wb)
                "\t\"memory\": %lu\n"
                "}\n"
                , hostname
-               , update_every
-               , save_history
+               , rrd_update_every
+               , rrd_default_history_entries
                , memory
                );
 }
 
-unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int entries_to_show, int group, int group_method, time_t after, time_t before, int only_non_zero)
+unsigned long rrd_stats_json(int type, RRDSET *st, struct web_buffer *wb, int entries_to_show, int group, int group_method, time_t after, time_t before, int only_non_zero)
 {
        int c;
        pthread_rwlock_rdlock(&st->rwlock);
@@ -198,7 +198,7 @@ unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int
        time_t time_init = st->last_updated.tv_sec;
        
        if(before == 0 || before > time_init) before = time_init;
-       if(after  == 0) after = rrd_stats_first_entry_t(st);
+       if(after  == 0) after = rrdset_first_entry_t(st);
 
 
        // ---
@@ -212,7 +212,7 @@ unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int
        // find how many dimensions we have
        
        int dimensions = 0;
-       RRD_DIMENSION *rd;
+       RRDDIM *rd;
        for( rd = st->dimensions ; rd ; rd = rd->next) dimensions++;
        if(!dimensions) {
                pthread_rwlock_unlock(&st->rwlock);
@@ -238,9 +238,9 @@ unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int
        if(st->debug) {
                debug(D_RRD_STATS, "%s first_entry_t = %lu, last_entry_t = %lu, duration = %lu, after = %lu, before = %lu, duration = %lu, entries_to_show = %lu, group = %lu, max_entries = %ld"
                        , st->id
-                       , rrd_stats_first_entry_t(st)
+                       , rrdset_first_entry_t(st)
                        , st->last_updated.tv_sec
-                       , st->last_updated.tv_sec - rrd_stats_first_entry_t(st)
+                       , st->last_updated.tv_sec - rrdset_first_entry_t(st)
                        , after
                        , before
                        , before - after
index 1fd33921b6ce9f7bff8c38da17f374a674da17e5..69dfabbe1c5bd83471f3a39fab71f42a991c5888 100755 (executable)
@@ -18,12 +18,12 @@ extern char *hostname;
 #define GROUP_MAX              1
 #define GROUP_SUM              2
 
-extern unsigned long rrd_stats_one_json(RRD_STATS *st, char *options, struct web_buffer *wb);
+extern unsigned long rrd_stats_one_json(RRDSET *st, char *options, struct web_buffer *wb);
 
-extern void rrd_stats_graph_json(RRD_STATS *st, char *options, struct web_buffer *wb);
+extern void rrd_stats_graph_json(RRDSET *st, char *options, struct web_buffer *wb);
 
 extern void rrd_stats_all_json(struct web_buffer *wb);
 
-extern unsigned long rrd_stats_json(int type, RRD_STATS *st, struct web_buffer *wb, int entries_to_show, int group, int group_method, time_t after, time_t before, int only_non_zero);
+extern unsigned long rrd_stats_json(int type, RRDSET *st, struct web_buffer *wb, int entries_to_show, int group, int group_method, time_t after, time_t before, int only_non_zero);
 
 #endif /* NETDATA_RRD2JSON_H */
index 17edeec44fa14e79b364db3441191b9f3ba777c8..f5ccc8fe39e25b57fe3da63ef8b7452c1d2325b9 100755 (executable)
@@ -246,32 +246,32 @@ int unit_test(long delay, long shift)
        snprintf(name, 100, "unittest-%d-%ld-%ld", repeat, delay, shift);
 
        debug_flags = 0xffffffff;
-       memory_mode = NETDATA_MEMORY_MODE_RAM;
-       update_every = 1;
+       rrd_memory_mode = RRD_MEMORY_MODE_RAM;
+       rrd_update_every = 1;
 
        int do_abs = 1;
        int do_inc = 1;
        int do_abst = 1;
        int do_absi = 1;
 
-       RRD_STATS *st = rrd_stats_create("netdata", name, name, "netdata", "Unit Testing", "a value", 1, 1, CHART_TYPE_LINE);
+       RRDSET *st = rrdset_create("netdata", name, name, "netdata", "Unit Testing", "a value", 1, 1, RRDSET_TYPE_LINE);
        st->debug = 1;
 
-       RRD_DIMENSION *rdabs = NULL;
-       RRD_DIMENSION *rdinc = NULL;
-       RRD_DIMENSION *rdabst = NULL;
-       RRD_DIMENSION *rdabsi = NULL;
+       RRDDIM *rdabs = NULL;
+       RRDDIM *rdinc = NULL;
+       RRDDIM *rdabst = NULL;
+       RRDDIM *rdabsi = NULL;
 
-       if(do_abs) rdabs = rrd_stats_dimension_add(st, "absolute", "absolute", 1, 1, RRD_DIMENSION_ABSOLUTE);
-       if(do_inc) rdinc = rrd_stats_dimension_add(st, "incremental", "incremental", 1, 1 * update_every, RRD_DIMENSION_INCREMENTAL);
-       if(do_abst) rdabst = rrd_stats_dimension_add(st, "percentage-of-absolute-row", "percentage-of-absolute-row", 1, 1, RRD_DIMENSION_PCENT_OVER_ROW_TOTAL);
-       if(do_absi) rdabsi = rrd_stats_dimension_add(st, "percentage-of-incremental-row", "percentage-of-incremental-row", 1, 1, RRD_DIMENSION_PCENT_OVER_DIFF_TOTAL);
+       if(do_abs) rdabs = rrddim_add(st, "absolute", "absolute", 1, 1, RRDDIM_ABSOLUTE);
+       if(do_inc) rdinc = rrddim_add(st, "incremental", "incremental", 1, 1 * rrd_update_every, RRDDIM_INCREMENTAL);
+       if(do_abst) rdabst = rrddim_add(st, "percentage-of-absolute-row", "percentage-of-absolute-row", 1, 1, RRDDIM_PCENT_OVER_ROW_TOTAL);
+       if(do_absi) rdabsi = rrddim_add(st, "percentage-of-incremental-row", "percentage-of-incremental-row", 1, 1, RRDDIM_PCENT_OVER_DIFF_TOTAL);
 
        long increment = 1000;
        collected_number i = 0;
 
        unsigned long c, dimensions = 0;
-       RRD_DIMENSION *rd;
+       RRDDIM *rd;
        for(rd = st->dimensions ; rd ; rd = rd->next) dimensions++;
 
        for(c = 0; c < 20 ;c++) {
@@ -279,12 +279,12 @@ int unit_test(long delay, long shift)
 
                fprintf(stderr, "\n\nLOOP = %lu, DELAY = %ld, VALUE = " COLLECTED_NUMBER_FORMAT "\n", c, delay, i);
                if(c) {
-                       rrd_stats_next_usec(st, delay);
+                       rrdset_next_usec(st, delay);
                }
-               if(do_abs) rrd_stats_dimension_set(st, "absolute", i);
-               if(do_inc) rrd_stats_dimension_set(st, "incremental", i);
-               if(do_abst) rrd_stats_dimension_set(st, "percentage-of-absolute-row", i);
-               if(do_absi) rrd_stats_dimension_set(st, "percentage-of-incremental-row", i);
+               if(do_abs) rrddim_set(st, "absolute", i);
+               if(do_inc) rrddim_set(st, "incremental", i);
+               if(do_abst) rrddim_set(st, "percentage-of-absolute-row", i);
+               if(do_absi) rrddim_set(st, "percentage-of-incremental-row", i);
 
                if(!c) {
                        gettimeofday(&st->last_collected_time, NULL);
@@ -294,7 +294,7 @@ int unit_test(long delay, long shift)
                // prevent it from deleting the dimensions
                for(rd = st->dimensions ; rd ; rd = rd->next) rd->last_collected_time.tv_sec = st->last_collected_time.tv_sec;
 
-               rrd_stats_done(st);
+               rrdset_done(st);
        }
 
        unsigned long oincrement = increment;
index c7c4b3ec208291acce35d5a9bbf0a09848080c51..68ababbc55ef5ad6f04568470f6ac990cbc37d42 100755 (executable)
@@ -11,6 +11,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <netinet/tcp.h>
+#include <malloc.h>
 
 #include "common.h"
 #include "log.h"
 int listen_fd = -1;
 int listen_port = LISTEN_PORT;
 
+static void log_allocations(void)
+{
+       static int mem = 0;
+
+       struct mallinfo mi;
+
+       mi = mallinfo();
+       if(mi.uordblks > mem) {
+               int clients = 0;
+               struct web_client *w;
+               for(w = web_clients; w ; w = w->next) clients++;
+
+               info("Allocated memory increased from %d to %d (increased by %d bytes). There are %d web clients connected.", mem, mi.uordblks, mi.uordblks - mem, clients);
+               mem = mi.uordblks;
+       }
+}
+
 int create_listen_socket(int port)
 {
                int sock=-1;
@@ -257,8 +275,8 @@ int web_client_data_request(struct web_client *w, char *url, int datasource_type
        debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok);
 
        // do we have such a data set?
-       RRD_STATS *st = rrd_stats_find_byname(tok);
-       if(!st) st = rrd_stats_find(tok);
+       RRDSET *st = rrdset_find_byname(tok);
+       if(!st) st = rrdset_find(tok);
        if(!st) {
                // we don't have it
                // try to send a file with that name
@@ -270,7 +288,7 @@ int web_client_data_request(struct web_client *w, char *url, int datasource_type
        debug(D_WEB_CLIENT, "%llu: Found RRD data with name '%s'.", w->id, tok);
 
        // how many entries does the client want?
-       long lines = save_history;
+       long lines = rrd_default_history_entries;
        long group_count = 1;
        time_t after = 0, before = 0;
        int group_method = GROUP_AVERAGE;
@@ -472,7 +490,7 @@ void web_client_process(struct web_client *w)
                                debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok);
 
                                // do we have such a data set?
-                               RRD_STATS *st = rrd_stats_find_byname(tok);
+                               RRDSET *st = rrdset_find_byname(tok);
                                if(!st) {
                                        // we don't have it
                                        // try to send a file with that name
@@ -495,7 +513,7 @@ void web_client_process(struct web_client *w)
                                debug(D_WEB_CLIENT, "%llu: Searching for RRD data with name '%s'.", w->id, tok);
 
                                // do we have such a data set?
-                               RRD_STATS *st = rrd_stats_find_byname(tok);
+                               RRDSET *st = rrdset_find_byname(tok);
                                if(!st) {
                                        code = 404;
                                        web_buffer_printf(w->data, "Chart %s is not found.\r\n", tok);
@@ -528,7 +546,7 @@ void web_client_process(struct web_client *w)
                                debug(D_WEB_CLIENT_ACCESS, "%llu: Sending list of RRD_STATS...", w->id);
 
                                w->data->bytes = 0;
-                               RRD_STATS *st = root;
+                               RRDSET *st = rrdset_root;
 
                                for ( ; st ; st = st->next )
                                        web_buffer_printf(w->data, "%s\n", st->name);