X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=src%2Frrd.h;h=2f4f2127fffb202b7b94510770d2bbc250fd536e;hb=8679670bdbe3c5928ec2e266d9c72e1a758fdf37;hp=ec79447712e85442fa24af0115079761db031446;hpb=78e548c50a24e6195c687d0422e5ac095204c57e;p=netdata.git diff --git a/src/rrd.h b/src/rrd.h index ec794477..2f4f2127 100644 --- a/src/rrd.h +++ b/src/rrd.h @@ -213,7 +213,8 @@ typedef enum rrdset_flags { RRDSET_FLAG_ENABLED = 1 << 0, // enables or disables a chart RRDSET_FLAG_DETAIL = 1 << 1, // 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) - RRDSET_FLAG_DEBUG = 1 << 2 // enables or disables debugging for a chart + RRDSET_FLAG_DEBUG = 1 << 2, // enables or disables debugging for a chart + RRDSET_FLAG_OBSOLETE = 1 << 3 // this is marked by the collector/module as obsolete } RRDSET_FLAGS; #define rrdset_flag_check(st, flag) ((st)->flags & flag) @@ -272,11 +273,13 @@ 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 rrdset_rwlock; // protects dimensions linked list + netdata_rwlock_t rrdset_rwlock; // protects dimensions linked list size_t counter; // the number of times we added values to this database size_t counter_done; // the number of times rrdset_done() has been called - size_t unused[10]; + + time_t last_accessed_time; // the last time this RRDSET has been accessed + size_t unused[9]; uint32_t 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 @@ -322,9 +325,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)) +#define rrdset_rdlock(st) netdata_rwlock_rdlock(&((st)->rrdset_rwlock)) +#define rrdset_wrlock(st) netdata_rwlock_wrlock(&((st)->rrdset_rwlock)) +#define rrdset_unlock(st) netdata_rwlock_unlock(&((st)->rrdset_rwlock)) + // ---------------------------------------------------------------------------- // these loop macros make sure the linked list is accessed with the right lock @@ -336,6 +340,22 @@ typedef struct rrdset RRDSET; for(st = host->rrdset_root, rrdhost_check_wrlock(host); st ; st = st->next) +// ---------------------------------------------------------------------------- +// RRDHOST flags +// use this for configuration flags, not for state control +// flags are set/unset in a manner that is not thread safe +// and may lead to missing information. + +typedef enum rrdhost_flags { + RRDHOST_ORPHAN = 1 << 0, // this host is orphan + RRDHOST_DELETE_OBSOLETE_FILES = 1 << 1, // delete files of obsolete charts + RRDHOST_DELETE_ORPHAN_FILES = 1 << 2 // delete the entire host when orphan +} RRDHOST_FLAGS; + +#define rrdhost_flag_check(host, flag) ((host)->flags & flag) +#define rrdhost_flag_set(host, flag) (host)->flags |= flag +#define rrdhost_flag_clear(host, flag) (host)->flags &= ~flag + // ---------------------------------------------------------------------------- // RRD HOST @@ -352,8 +372,11 @@ struct rrdhost { uint32_t hash_machine_guid; // the hash of the unique ID char *os; // the O/S type of the host + + uint32_t flags; // flags about this RRDHOST + int rrd_update_every; // the update frequency of the host - int rrd_history_entries; // the number of history entries for the host's charts + long rrd_history_entries; // the number of history entries for the host's charts RRD_MEMORY_MODE rrd_memory_mode; // the memory more for the charts of this host char *cache_dir; // the directory to save RRD cache files @@ -371,7 +394,7 @@ struct rrdhost { volatile int rrdpush_error_shown:1; // 1 when we have logged a communication error int rrdpush_socket; // the fd of the socket to the remote host, or -1 pthread_t rrdpush_thread; // the sender thread - pthread_mutex_t rrdpush_mutex; // exclusive access to rrdpush_buffer + netdata_mutex_t rrdpush_mutex; // exclusive access to rrdpush_buffer int rrdpush_pipe[2]; // collector to sender thread communication BUFFER *rrdpush_buffer; // collector fills it, sender sends them @@ -417,7 +440,7 @@ struct rrdhost { // ------------------------------------------------------------------------ // locks - pthread_rwlock_t rrdhost_rwlock; // lock for this RRDHOST (protects rrdset_root linked list) + netdata_rwlock_t rrdhost_rwlock; // lock for this RRDHOST (protects rrdset_root linked list) 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) @@ -430,9 +453,9 @@ struct rrdhost { 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)) +#define rrdhost_rdlock(host) netdata_rwlock_rdlock(&((host)->rrdhost_rwlock)) +#define rrdhost_wrlock(host) netdata_rwlock_wrlock(&((host)->rrdhost_rwlock)) +#define rrdhost_unlock(host) netdata_rwlock_unlock(&((host)->rrdhost_rwlock)) // ---------------------------------------------------------------------------- // these loop macros make sure the linked list is accessed with the right lock @@ -447,24 +470,28 @@ extern RRDHOST *localhost; // ---------------------------------------------------------------------------- // 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) +extern netdata_rwlock_t rrd_rwlock; + +#define rrd_rdlock() netdata_rwlock_rdlock(&rrd_rwlock) +#define rrd_wrlock() netdata_rwlock_wrlock(&rrd_rwlock) +#define rrd_unlock() netdata_rwlock_unlock(&rrd_rwlock) // ---------------------------------------------------------------------------- +extern size_t rrd_hosts_available; extern time_t rrdhost_free_orphan_time; extern void rrd_init(char *hostname); -extern RRDHOST *rrdhost_find_guid(const char *guid, uint32_t hash); +extern RRDHOST *rrdhost_find_by_hostname(const char *hostname, uint32_t hash); +extern RRDHOST *rrdhost_find_by_guid(const char *guid, uint32_t hash); + extern RRDHOST *rrdhost_find_or_create( const char *hostname , const char *guid , const char *os , int update_every - , int history + , long history , RRD_MEMORY_MODE mode , int health_enabled , int rrdpush_enabled @@ -472,20 +499,20 @@ extern RRDHOST *rrdhost_find_or_create( , char *rrdpush_api_key ); -#ifdef NETDATA_INTERNAL_CHECKS -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 rrdset_check_rdlock_int(RRDSET *st, const char *file, const char *function, const unsigned long line); -extern void rrdset_check_wrlock_int(RRDSET *st, const char *file, const char *function, const unsigned long line); -extern void rrd_check_rdlock_int(const char *file, const char *function, const unsigned long line); -extern void rrd_check_wrlock_int(const char *file, const char *function, const unsigned long 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 rrdset_check_rdlock(st) rrdset_check_rdlock_int(st, __FILE__, __FUNCTION__, __LINE__) -#define rrdset_check_wrlock(st) rrdset_check_wrlock_int(st, __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__) +#if defined(NETDATA_INTERNAL_CHECKS) && defined(NETDATA_VERIFY_LOCKS) +extern void __rrdhost_check_wrlock(RRDHOST *host, const char *file, const char *function, const unsigned long line); +extern void __rrdhost_check_rdlock(RRDHOST *host, const char *file, const char *function, const unsigned long line); +extern void __rrdset_check_rdlock(RRDSET *st, const char *file, const char *function, const unsigned long line); +extern void __rrdset_check_wrlock(RRDSET *st, const char *file, const char *function, const unsigned long line); +extern void __rrd_check_rdlock(const char *file, const char *function, const unsigned long line); +extern void __rrd_check_wrlock(const char *file, const char *function, const unsigned long line); + +#define rrdhost_check_rdlock(host) __rrdhost_check_rdlock(host, __FILE__, __FUNCTION__, __LINE__) +#define rrdhost_check_wrlock(host) __rrdhost_check_wrlock(host, __FILE__, __FUNCTION__, __LINE__) +#define rrdset_check_rdlock(st) __rrdset_check_rdlock(st, __FILE__, __FUNCTION__, __LINE__) +#define rrdset_check_wrlock(st) __rrdset_check_wrlock(st, __FILE__, __FUNCTION__, __LINE__) +#define rrd_check_rdlock() __rrd_check_rdlock(__FILE__, __FUNCTION__, __LINE__) +#define rrd_check_wrlock() __rrd_check_wrlock(__FILE__, __FUNCTION__, __LINE__) #else #define rrdhost_check_rdlock(host) (void)0 @@ -518,9 +545,10 @@ extern RRDSET *rrdset_create(RRDHOST *host extern void rrdhost_free_all(void); extern void rrdhost_save_all(void); -extern void rrdhost_cleanup_remote_stale(RRDHOST *protected); +extern void rrdhost_cleanup_orphan(RRDHOST *protected); extern void rrdhost_free(RRDHOST *host); extern void rrdhost_save(RRDHOST *host); +extern void rrdhost_delete(RRDHOST *host); extern RRDSET *rrdset_find(RRDHOST *host, const char *id); #define rrdset_find_localhost(id) rrdset_find(localhost, id) @@ -537,6 +565,9 @@ extern void rrdset_next_usec(RRDSET *st, usec_t microseconds); extern void rrdset_done(RRDSET *st); +// checks if the RRDSET should be offered to viewers +#define rrdset_is_available_for_viewers(st) (rrdset_flag_check(st, RRDSET_FLAG_ENABLED) && !rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE) && (st)->dimensions) + // 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 )) @@ -592,14 +623,11 @@ extern long align_entries_to_pagesize(RRD_MEMORY_MODE mode, long entries); #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, const char *config_section); -extern void rrdset_reset(RRDSET *st); - extern void rrddim_free(RRDSET *st, RRDDIM *rd); extern int rrddim_compare(void* a, void* b); @@ -614,6 +642,13 @@ extern void rrdfamily_free(RRDHOST *host, RRDFAMILY *rc); #define rrdset_index_del(host, st) (RRDSET *)avl_remove_lock(&((host)->rrdset_root_index), (avl *)(st)) extern RRDSET *rrdset_index_del_name(RRDHOST *host, RRDSET *st); +extern void rrdset_free(RRDSET *st); +extern void rrdset_reset(RRDSET *st); +extern void rrdset_save(RRDSET *st); +extern void rrdset_delete(RRDSET *st); + +extern void rrdhost_cleanup_obsolete(RRDHOST *host); + #endif /* NETDATA_RRD_INTERNALS */