#include "common.h"
RRDHOST *localhost = NULL;
-
+size_t rrd_hosts_available = 0;
pthread_rwlock_t rrd_rwlock = PTHREAD_RWLOCK_INITIALIZER;
time_t rrdhost_free_orphan_time = 3600;
.rwlock = AVL_LOCK_INITIALIZER
};
-RRDHOST *rrdhost_find_guid(const char *guid, uint32_t hash) {
+RRDHOST *rrdhost_find_by_guid(const char *guid, uint32_t hash) {
debug(D_RRDHOST, "Searching in index for host with guid '%s'", guid);
RRDHOST tmp;
return (RRDHOST *)avl_search_lock(&(rrdhost_root_index), (avl *) &tmp);
}
+RRDHOST *rrdhost_find_by_hostname(const char *hostname, uint32_t hash) {
+ if(unlikely(!strcmp(hostname, "localhost")))
+ return localhost;
+
+ if(unlikely(!hash)) hash = simple_hash(hostname);
+
+ rrd_rdlock();
+ RRDHOST *host;
+ rrdhost_foreach_read(host) {
+ if(unlikely((hash == host->hash_hostname && !strcmp(hostname, host->hostname)))) {
+ rrd_unlock();
+ return host;
+ }
+ }
+ rrd_unlock();
+
+ return NULL;
+}
+
#define rrdhost_index_add(rrdhost) (RRDHOST *)avl_insert_lock(&(rrdhost_root_index), (avl *)(rrdhost))
#define rrdhost_index_del(rrdhost) (RRDHOST *)avl_remove_lock(&(rrdhost_root_index), (avl *)(rrdhost))
int r = mkdir(host->varlib_dir, 0775);
if(r != 0 && errno != EEXIST)
error("Host '%s': cannot create directory '%s'", host->hostname, host->varlib_dir);
+ }
- snprintfz(filename, FILENAME_MAX, "%s/health", host->varlib_dir);
- r = mkdir(filename, 0775);
- if(r != 0 && errno != EEXIST)
- error("Host '%s': cannot create directory '%s'", host->hostname, filename);
- }
+ }
+ if(host->health_enabled) {
+ snprintfz(filename, FILENAME_MAX, "%s/health", host->varlib_dir);
+ int r = mkdir(filename, 0775);
+ if(r != 0 && errno != EEXIST)
+ error("Host '%s': cannot create directory '%s'", host->hostname, filename);
}
snprintfz(filename, FILENAME_MAX, "%s/health/health-log.db", host->varlib_dir);
);
}
+ rrd_hosts_available++;
rrd_unlock();
return host;
) {
debug(D_RRDHOST, "Searching for host '%s' with guid '%s'", hostname, guid);
- RRDHOST *host = rrdhost_find_guid(guid, 0);
+ RRDHOST *host = rrdhost_find_by_guid(guid, 0);
if(!host) {
host = rrdhost_create(
hostname
rrdhost_unlock(host);
freez(host);
- info("Host memory cleanup completed...");
+ rrd_hosts_available--;
}
void rrdhost_free_all(void) {
void rrdhost_save(RRDHOST *host) {
if(!host) return;
- info("Saving host '%s' database...", host->hostname);
+ info("Saving database of host '%s'...", host->hostname);
RRDSET *st;
RRDDIM *rd;
}
void rrdhost_save_all(void) {
- info("Saving database...");
+ info("Saving database [%zu hosts(s)]...", rrd_hosts_available);
rrd_rdlock();