diff options
Diffstat (limited to '')
-rw-r--r-- | src/rrdhost.c | 105 |
1 files changed, 65 insertions, 40 deletions
diff --git a/src/rrdhost.c b/src/rrdhost.c index ff8aa5617..831cc46c8 100644 --- a/src/rrdhost.c +++ b/src/rrdhost.c @@ -86,6 +86,15 @@ static inline void rrdhost_init_os(RRDHOST *host, const char *os) { freez(old); } +static inline void rrdhost_init_timezone(RRDHOST *host, const char *timezone) { + if(host->timezone && timezone && !strcmp(host->timezone, timezone)) + return; + + void *old = (void *)host->timezone; + host->timezone = strdupz((timezone && *timezone)?timezone:"unknown"); + freez(old); +} + static inline void rrdhost_init_machine_guid(RRDHOST *host, const char *machine_guid) { strncpy(host->machine_guid, machine_guid, GUID_LEN); host->machine_guid[GUID_LEN] = '\0'; @@ -100,6 +109,7 @@ RRDHOST *rrdhost_create(const char *hostname, const char *registry_hostname, const char *guid, const char *os, + const char *timezone, const char *tags, int update_every, long entries, @@ -120,33 +130,34 @@ RRDHOST *rrdhost_create(const char *hostname, host->rrd_history_entries = align_entries_to_pagesize(memory_mode, entries); host->rrd_memory_mode = memory_mode; host->health_enabled = (memory_mode == RRD_MEMORY_MODE_NONE)? 0 : health_enabled; - host->rrdpush_enabled = (rrdpush_enabled && rrdpush_destination && *rrdpush_destination && rrdpush_api_key && *rrdpush_api_key); - host->rrdpush_destination = (host->rrdpush_enabled)?strdupz(rrdpush_destination):NULL; - host->rrdpush_api_key = (host->rrdpush_enabled)?strdupz(rrdpush_api_key):NULL; + host->rrdpush_send_enabled = (rrdpush_enabled && rrdpush_destination && *rrdpush_destination && rrdpush_api_key && *rrdpush_api_key); + host->rrdpush_send_destination = (host->rrdpush_send_enabled)?strdupz(rrdpush_destination):NULL; + host->rrdpush_send_api_key = (host->rrdpush_send_enabled)?strdupz(rrdpush_api_key):NULL; - host->rrdpush_pipe[0] = -1; - host->rrdpush_pipe[1] = -1; - host->rrdpush_socket = -1; + host->rrdpush_sender_pipe[0] = -1; + host->rrdpush_sender_pipe[1] = -1; + host->rrdpush_sender_socket = -1; - netdata_mutex_init(&host->rrdpush_mutex); + netdata_mutex_init(&host->rrdpush_sender_buffer_mutex); netdata_rwlock_init(&host->rrdhost_rwlock); rrdhost_init_hostname(host, hostname); rrdhost_init_machine_guid(host, guid); rrdhost_init_os(host, os); + rrdhost_init_timezone(host, timezone); rrdhost_init_tags(host, tags); host->registry_hostname = strdupz((registry_hostname && *registry_hostname)?registry_hostname:hostname); avl_init_lock(&(host->rrdset_root_index), rrdset_compare); avl_init_lock(&(host->rrdset_root_index_name), rrdset_compare_name); avl_init_lock(&(host->rrdfamily_root_index), rrdfamily_compare); - avl_init_lock(&(host->variables_root_index), rrdvar_compare); + avl_init_lock(&(host->rrdvar_root_index), rrdvar_compare); if(config_get_boolean(CONFIG_SECTION_GLOBAL, "delete obsolete charts files", 1)) - rrdhost_flag_set(host, RRDHOST_DELETE_OBSOLETE_CHARTS); + rrdhost_flag_set(host, RRDHOST_FLAG_DELETE_OBSOLETE_CHARTS); if(config_get_boolean(CONFIG_SECTION_GLOBAL, "delete orphan hosts files", 1) && !is_localhost) - rrdhost_flag_set(host, RRDHOST_DELETE_ORPHAN_HOST); + rrdhost_flag_set(host, RRDHOST_FLAG_DELETE_ORPHAN_HOST); // ------------------------------------------------------------------------ @@ -251,7 +262,8 @@ RRDHOST *rrdhost_create(const char *hostname, } else { info("Host '%s' (at registry as '%s') with guid '%s' initialized" - ", os %s" + ", os '%s'" + ", timezone '%s'" ", tags '%s'" ", update every %d" ", memory mode %s" @@ -268,13 +280,14 @@ RRDHOST *rrdhost_create(const char *hostname, , host->registry_hostname , host->machine_guid , host->os + , host->timezone , (host->tags)?host->tags:"" , host->rrd_update_every , rrd_memory_mode_name(host->rrd_memory_mode) , host->rrd_history_entries - , host->rrdpush_enabled?"enabled":"disabled" - , host->rrdpush_destination?host->rrdpush_destination:"" - , host->rrdpush_api_key?host->rrdpush_api_key:"" + , host->rrdpush_send_enabled?"enabled":"disabled" + , host->rrdpush_send_destination?host->rrdpush_send_destination:"" + , host->rrdpush_send_api_key?host->rrdpush_send_api_key:"" , host->health_enabled?"enabled":"disabled" , host->cache_dir , host->varlib_dir @@ -294,6 +307,7 @@ RRDHOST *rrdhost_find_or_create( , const char *registry_hostname , const char *guid , const char *os + , const char *timezone , const char *tags , int update_every , long history @@ -313,6 +327,7 @@ RRDHOST *rrdhost_find_or_create( , registry_hostname , guid , os + , timezone , tags , update_every , history @@ -346,16 +361,18 @@ RRDHOST *rrdhost_find_or_create( // update host tags rrdhost_init_tags(host, tags); } - rrd_unlock(); - rrdhost_cleanup_orphan_hosts(host); + rrdhost_cleanup_orphan_hosts_nolock(host); + + rrd_unlock(); return host; } -static inline int rrdhost_should_be_removed(RRDHOST *host, RRDHOST *protected, time_t now) { +inline int rrdhost_should_be_removed(RRDHOST *host, RRDHOST *protected, time_t now) { if(host != protected && host != localhost + && rrdhost_flag_check(host, RRDHOST_FLAG_ORPHAN) && !host->connected_senders && host->senders_disconnected_time && host->senders_disconnected_time + rrdhost_free_orphan_time < now) @@ -364,11 +381,9 @@ static inline int rrdhost_should_be_removed(RRDHOST *host, RRDHOST *protected, t return 0; } -void rrdhost_cleanup_orphan_hosts(RRDHOST *protected) { +void rrdhost_cleanup_orphan_hosts_nolock(RRDHOST *protected) { time_t now = now_realtime_sec(); - rrd_wrlock(); - RRDHOST *host; restart_after_removal: @@ -376,17 +391,15 @@ restart_after_removal: if(rrdhost_should_be_removed(host, protected, now)) { info("Host '%s' with machine guid '%s' is obsolete - cleaning up.", host->hostname, host->machine_guid); - if(rrdset_flag_check(host, RRDHOST_DELETE_ORPHAN_HOST) && rrdset_flag_check(host, RRDHOST_ORPHAN)) - rrdhost_delete(host); + if(rrdhost_flag_check(host, RRDHOST_FLAG_DELETE_ORPHAN_HOST)) + rrdhost_delete_charts(host); else - rrdhost_save(host); + rrdhost_save_charts(host); rrdhost_free(host); goto restart_after_removal; } } - - rrd_unlock(); } // ---------------------------------------------------------------------------- @@ -406,6 +419,7 @@ void rrd_init(char *hostname) { , registry_get_this_machine_hostname() , registry_get_this_machine_guid() , os_type + , netdata_configured_timezone , config_get(CONFIG_SECTION_BACKEND, "host tags", "") , default_rrd_update_every , default_rrd_history_entries @@ -473,12 +487,19 @@ void rrdhost_free(RRDHOST *host) { // ------------------------------------------------------------------------ // release its children resources - while(host->rrdset_root) rrdset_free(host->rrdset_root); + while(host->rrdset_root) + rrdset_free(host->rrdset_root); - while(host->alarms) rrdcalc_free(host, host->alarms); - while(host->templates) rrdcalctemplate_free(host, host->templates); - health_alarm_log_free(host); + while(host->alarms) + rrdcalc_unlink_and_free(host, host->alarms); + while(host->templates) + rrdcalctemplate_unlink_and_free(host, host->templates); + + debug(D_RRD_CALLS, "RRDHOST: Cleaning up remaining host variables for host '%s'", host->hostname); + rrdvar_free_remaining_variables(host, &host->rrdvar_root_index); + + health_alarm_log_free(host); // ------------------------------------------------------------------------ // remove it from the indexes @@ -508,10 +529,11 @@ void rrdhost_free(RRDHOST *host) { freez((void *)host->tags); freez((void *)host->os); + freez((void *)host->timezone); freez(host->cache_dir); freez(host->varlib_dir); - freez(host->rrdpush_api_key); - freez(host->rrdpush_destination); + freez(host->rrdpush_send_api_key); + freez(host->rrdpush_send_destination); freez(host->health_default_exec); freez(host->health_default_recipient); freez(host->health_log_filename); @@ -534,7 +556,7 @@ void rrdhost_free_all(void) { // ---------------------------------------------------------------------------- // RRDHOST - save host files -void rrdhost_save(RRDHOST *host) { +void rrdhost_save_charts(RRDHOST *host) { if(!host) return; info("Saving/Closing database of host '%s'...", host->hostname); @@ -557,7 +579,7 @@ void rrdhost_save(RRDHOST *host) { // ---------------------------------------------------------------------------- // RRDHOST - delete host files -void rrdhost_delete(RRDHOST *host) { +void rrdhost_delete_charts(RRDHOST *host) { if(!host) return; info("Deleting database of host '%s'...", host->hostname); @@ -582,12 +604,13 @@ void rrdhost_delete(RRDHOST *host) { // ---------------------------------------------------------------------------- // RRDHOST - cleanup host files -void rrdhost_cleanup(RRDHOST *host) { +void rrdhost_cleanup_charts(RRDHOST *host) { if(!host) return; info("Cleaning up database of host '%s'...", host->hostname); RRDSET *st; + uint32_t rrdhost_delete_obsolete_charts = rrdhost_flag_check(host, RRDHOST_FLAG_DELETE_OBSOLETE_CHARTS); // we get a write lock // to ensure only one thread is saving the database @@ -596,7 +619,7 @@ void rrdhost_cleanup(RRDHOST *host) { rrdset_foreach_write(st, host) { rrdset_rdlock(st); - if(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE) && rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS)) + if(rrdhost_delete_obsolete_charts && rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE)) rrdset_delete(st); else rrdset_save(st); @@ -618,7 +641,7 @@ void rrdhost_save_all(void) { RRDHOST *host; rrdhost_foreach_read(host) - rrdhost_save(host); + rrdhost_save_charts(host); rrd_unlock(); } @@ -633,10 +656,10 @@ void rrdhost_cleanup_all(void) { RRDHOST *host; rrdhost_foreach_read(host) { - if(host != localhost && rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS) && !host->connected_senders) - rrdhost_delete(host); + if(host != localhost && rrdhost_flag_check(host, RRDHOST_FLAG_DELETE_OBSOLETE_CHARTS) && !host->connected_senders) + rrdhost_delete_charts(host); else - rrdhost_cleanup(host); + rrdhost_cleanup_charts(host); } rrd_unlock(); @@ -651,6 +674,8 @@ void rrdhost_cleanup_obsolete_charts(RRDHOST *host) { RRDSET *st; + uint32_t rrdhost_delete_obsolete_charts = rrdhost_flag_check(host, RRDHOST_FLAG_DELETE_OBSOLETE_CHARTS); + restart_after_removal: rrdset_foreach_write(st, host) { if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE) @@ -661,7 +686,7 @@ restart_after_removal: rrdset_rdlock(st); - if(rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS)) + if(rrdhost_delete_obsolete_charts) rrdset_delete(st); else rrdset_save(st); |