X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=src%2Frrd.h;h=7e34e956c63af0d88112327f414d082e453b9970;hb=489f4dfccb2259103175c01c4b51d76946248629;hp=0b91bf2fc0fedae6b9aebcee88376ce20825268c;hpb=d0cd29a9196763270421280e97bf53a49a3db85c;p=netdata.git diff --git a/src/rrd.h b/src/rrd.h index 0b91bf2f..7e34e956 100644 --- a/src/rrd.h +++ b/src/rrd.h @@ -7,8 +7,8 @@ #define RRD_DEFAULT_HISTORY_ENTRIES 3600 #define RRD_HISTORY_ENTRIES_MAX (86400*10) -extern int default_localhost_rrd_update_every; -extern int default_localhost_rrd_history_entries; +extern int default_rrd_update_every; +extern int default_rrd_history_entries; #define RRD_ID_LENGTH_MAX 200 @@ -48,7 +48,7 @@ typedef enum rrd_memory_mode { #define RRD_MEMORY_MODE_MAP_NAME "map" #define RRD_MEMORY_MODE_SAVE_NAME "save" -extern RRD_MEMORY_MODE default_localhost_rrd_memory_mode; +extern RRD_MEMORY_MODE default_rrd_memory_mode; extern const char *rrd_memory_mode_name(RRD_MEMORY_MODE id); extern RRD_MEMORY_MODE rrd_memory_mode_id(const char *name); @@ -78,7 +78,8 @@ extern const char *rrd_algorithm_name(RRD_ALGORITHM algorithm); typedef enum rrddim_flags { RRDDIM_FLAG_HIDDEN = 1 << 0, // this dimension will not be offered to callers RRDDIM_FLAG_DONT_DETECT_RESETS_OR_OVERFLOWS = 1 << 1, // do not offer RESET or OVERFLOW info to callers - RRDDIM_FLAG_UPDATED = 1 << 31 // the dimension has been updated since the last processing + RRDDIM_FLAG_UPDATED = 1 << 2, // the dimension has been updated since the last processing + RRDDIM_FLAG_EXPOSED = 1 << 3 // when set what have sent this dimension to the central netdata } RRDDIM_FLAGS; #define rrddim_flag_check(rd, flag) ((rd)->flags & flag) @@ -216,6 +217,8 @@ struct rrdset { // since the config always has a higher priority // (the user overwrites the name of the charts) + char *config_section; // the config section for the chart + char *type; // the type of graph RRD_TYPE_* (a category, for determining graphing options) char *family; // grouping sets under the same family char *title; // title shown to user @@ -249,7 +252,7 @@ struct rrdset { char *cache_dir; // the directory to store dimensions char cache_filename[FILENAME_MAX+1]; // the filename to store this set - pthread_rwlock_t rwlock; + pthread_rwlock_t rrdset_rwlock; unsigned long counter; // the number of times we added values to this rrd unsigned long counter_done; // the number of times we added values to this rrd @@ -298,6 +301,10 @@ struct rrdset { }; typedef struct rrdset RRDSET; +#define rrdset_rdlock(st) pthread_rwlock_rdlock(&((st)->rrdset_rwlock)) +#define rrdset_wrlock(st) pthread_rwlock_wrlock(&((st)->rrdset_rwlock)) +#define rrdset_unlock(st) pthread_rwlock_unlock(&((st)->rrdset_rwlock)) + // ---------------------------------------------------------------------------- // RRD HOST @@ -317,7 +324,8 @@ struct rrdhost { RRD_MEMORY_MODE rrd_memory_mode; // the memory more for the charts of this host RRDSET *rrdset_root; // the host charts - pthread_rwlock_t rrdset_root_rwlock; // lock for the host charts + + pthread_rwlock_t rrdhost_rwlock; // lock for this RRDHOST avl_tree_lock rrdset_root_index; // the host's charts index (by id) avl_tree_lock rrdset_root_index_name; // the host's charts index (by name) @@ -325,6 +333,9 @@ struct rrdhost { avl_tree_lock rrdfamily_root_index; // the host's chart families index avl_tree_lock variables_root_index; // the host's chart variables index + char *cache_dir; // the directory to save RRD cache files + char *varlib_dir; // the directory to save health log + // all RRDCALCs are primarily allocated and linked here // RRDCALCs may be linked to charts at any point // (charts may or may not exist when these are loaded) @@ -347,28 +358,40 @@ struct rrdhost { struct rrdhost *next; }; typedef struct rrdhost RRDHOST; - extern RRDHOST *localhost; +#define rrdhost_rdlock(h) pthread_rwlock_rdlock(&((h)->rrdhost_rwlock)) +#define rrdhost_wrlock(h) pthread_rwlock_wrlock(&((h)->rrdhost_rwlock)) +#define rrdhost_unlock(h) pthread_rwlock_unlock(&((h)->rrdhost_rwlock)) + extern void rrd_init(char *hostname); extern RRDHOST *rrdhost_find(const char *guid, uint32_t hash); extern RRDHOST *rrdhost_find_or_create(const char *hostname, const char *guid); #ifdef NETDATA_INTERNAL_CHECKS -#define rrdhost_check_wrlock(host) rrdhost_check_wrlock_int(host, __FILE__, __FUNCTION__, __LINE__) #define rrdhost_check_rdlock(host) rrdhost_check_rdlock_int(host, __FILE__, __FUNCTION__, __LINE__) +#define rrdhost_check_wrlock(host) rrdhost_check_wrlock_int(host, __FILE__, __FUNCTION__, __LINE__) +#define rrd_check_rdlock() rrd_check_rdlock_int(__FILE__, __FUNCTION__, __LINE__) +#define rrd_check_wrlock() rrd_check_wrlock_int(__FILE__, __FUNCTION__, __LINE__) #else #define rrdhost_check_rdlock(host) (void)0 #define rrdhost_check_wrlock(host) (void)0 +#define rrd_check_rdlock() (void)0 +#define rrd_check_wrlock() (void)0 #endif extern void rrdhost_check_wrlock_int(RRDHOST *host, const char *file, const char *function, const unsigned long line); extern void rrdhost_check_rdlock_int(RRDHOST *host, const char *file, const char *function, const unsigned long line); -extern void rrdhost_rwlock(RRDHOST *host); -extern void rrdhost_rdlock(RRDHOST *host); -extern void rrdhost_unlock(RRDHOST *host); +// ---------------------------------------------------------------------------- +// global lock for all RRDHOSTs + +extern pthread_rwlock_t rrd_rwlock; +#define rrd_rdlock() pthread_rwlock_rdlock(&rrd_rwlock) +#define rrd_wrlock() pthread_rwlock_wrlock(&rrd_rwlock) +#define rrd_unlock() pthread_rwlock_unlock(&rrd_rwlock) + // ---------------------------------------------------------------------------- // RRDSET functions @@ -385,7 +408,7 @@ extern RRDSET *rrdset_create(RRDHOST *host , const char *units , long priority , int update_every - , int chart_type); + , RRDSET_TYPE chart_type); #define rrdset_create_localhost(type, id, name, family, context, title, units, priority, update_every, chart_type) rrdset_create(localhost, type, id, name, family, context, title, units, priority, update_every, chart_type) @@ -408,7 +431,7 @@ extern void rrdset_next_usec_unfiltered(RRDSET *st, usec_t microseconds); extern void rrdset_next_usec(RRDSET *st, usec_t microseconds); #define rrdset_next(st) rrdset_next_usec(st, 0ULL) -extern usec_t rrdset_done(RRDSET *st); +extern void rrdset_done(RRDSET *st); // get the total duration in seconds of the round robin database #define rrdset_duration(st) ((time_t)( (((st)->counter >= ((unsigned long)(st)->entries))?(unsigned long)(st)->entries:(st)->counter) * (st)->update_every )) @@ -457,16 +480,19 @@ extern int rrddim_unhide(RRDSET *st, const char *id); extern collected_number rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number value); extern collected_number rrddim_set(RRDSET *st, const char *id, collected_number value); +extern long align_entries_to_pagesize(long entries); + // ---------------------------------------------------------------------------- // RRD internal functions #ifdef NETDATA_RRD_INTERNALS +extern void rrdset_free(RRDSET *st); extern avl_tree_lock rrdhost_root_index; extern char *rrdset_strncpyz_name(char *to, const char *from, size_t length); -extern char *rrdset_cache_dir(RRDHOST *host, const char *id); +extern char *rrdset_cache_dir(RRDHOST *host, const char *id, const char *config_section); extern void rrdset_reset(RRDSET *st);