@cryptotaxi247 / netdata-1 / commits / a00c8217d

delete obsolete charts and orphan hosts by default

Costa Tsaousis (ktsaou) committed Mar 1, 2017 at 22:50 UTC a00c8217dca7180462a470c1a3a5d883e6069af4
4 files changed +103 -19
src/rrd.h
+26 -5
@@ -339,6 +339,22 @@ typedef struct rrdset RRDSET;
339 for(st = host->rrdset_root, rrdhost_check_wrlock(host); st ; st = st->next)
340
341
342 +// ----------------------------------------------------------------------------
343 +// RRDHOST flags
344 +// use this for configuration flags, not for state control
345 +// flags are set/unset in a manner that is not thread safe
346 +// and may lead to missing information.
347 +
348 +typedef enum rrdhost_flags {
349 + RRDHOST_ORPHAN = 1 << 0, // this host is orphan
350 + RRDHOST_DELETE_OBSOLETE_FILES = 1 << 1, // delete files of obsolete charts
351 + RRDHOST_DELETE_ORPHAN_FILES = 1 << 2 // delete the entire host when orphan
352 +} RRDHOST_FLAGS;
353 +
354 +#define rrdhost_flag_check(host, flag) ((host)->flags & flag)
355 +#define rrdhost_flag_set(host, flag) (host)->flags |= flag
356 +#define rrdhost_flag_clear(host, flag) (host)->flags &= ~flag
357 +
358 // ----------------------------------------------------------------------------
359 // RRD HOST
360
@@ -355,6 +371,9 @@ struct rrdhost {
371 uint32_t hash_machine_guid; // the hash of the unique ID
372
373 char *os; // the O/S type of the host
374 +
375 + uint32_t flags; // flags about this RRDHOST
376 +
377 int rrd_update_every; // the update frequency of the host
378 int rrd_history_entries; // the number of history entries for the host's charts
379 RRD_MEMORY_MODE rrd_memory_mode; // the memory more for the charts of this host
@@ -524,9 +543,10 @@ extern RRDSET *rrdset_create(RRDHOST *host
543 extern void rrdhost_free_all(void);
544 extern void rrdhost_save_all(void);
545
527 -extern void rrdhost_cleanup_remote_stale(RRDHOST *protected);
546 +extern void rrdhost_cleanup_orphan(RRDHOST *protected);
547 extern void rrdhost_free(RRDHOST *host);
548 extern void rrdhost_save(RRDHOST *host);
549 +extern void rrdhost_delete(RRDHOST *host);
550
551 extern RRDSET *rrdset_find(RRDHOST *host, const char *id);
552 #define rrdset_find_localhost(id) rrdset_find(localhost, id)
@@ -601,14 +621,11 @@ extern long align_entries_to_pagesize(RRD_MEMORY_MODE mode, long entries);
621
622 #ifdef NETDATA_RRD_INTERNALS
623
604 -extern void rrdset_free(RRDSET *st);
624 extern avl_tree_lock rrdhost_root_index;
625
626 extern char *rrdset_strncpyz_name(char *to, const char *from, size_t length);
627 extern char *rrdset_cache_dir(RRDHOST *host, const char *id, const char *config_section);
628
610 -extern void rrdset_reset(RRDSET *st);
611 -
629 extern void rrddim_free(RRDSET *st, RRDDIM *rd);
630
631 extern int rrddim_compare(void* a, void* b);
@@ -623,8 +640,12 @@ extern void rrdfamily_free(RRDHOST *host, RRDFAMILY *rc);
640 #define rrdset_index_del(host, st) (RRDSET *)avl_remove_lock(&((host)->rrdset_root_index), (avl *)(st))
641 extern RRDSET *rrdset_index_del_name(RRDHOST *host, RRDSET *st);
642
643 +extern void rrdset_free(RRDSET *st);
644 +extern void rrdset_reset(RRDSET *st);
645 extern void rrdset_save(RRDSET *st);
627 -extern void rrdhost_cleanup(RRDHOST *host);
646 +extern void rrdset_delete(RRDSET *st);
647 +
648 +extern void rrdhost_cleanup_obsolete(RRDHOST *host);
649
650 #endif /* NETDATA_RRD_INTERNALS */
651
src/rrdhost.c
+53 -13
@@ -120,6 +120,13 @@ RRDHOST *rrdhost_create(const char *hostname,
120 avl_init_lock(&(host->rrdfamily_root_index), rrdfamily_compare);
121 avl_init_lock(&(host->variables_root_index), rrdvar_compare);
122
123 + if(config_get_boolean(CONFIG_SECTION_GLOBAL, "delete obsolete charts files", 1))
124 + rrdhost_flag_set(host, RRDHOST_DELETE_OBSOLETE_FILES);
125 +
126 + if(config_get_boolean(CONFIG_SECTION_GLOBAL, "delete orphan hosts files", 1) && !is_localhost)
127 + rrdhost_flag_set(host, RRDHOST_DELETE_ORPHAN_FILES);
128 +
129 +
130 // ------------------------------------------------------------------------
131 // initialize health variables
132
@@ -310,27 +317,32 @@ RRDHOST *rrdhost_find_or_create(
317 error("Host '%s' has memory mode '%s', but the wanted one is '%s'.", host->hostname, rrd_memory_mode_name(host->rrd_memory_mode), rrd_memory_mode_name(mode));
318 }
319
313 - rrdhost_cleanup_remote_stale(host);
320 + rrdhost_cleanup_orphan(host);
321
322 return host;
323 }
324
318 -void rrdhost_cleanup_remote_stale(RRDHOST *protected) {
325 +void rrdhost_cleanup_orphan(RRDHOST *protected) {
326 time_t now = now_realtime_sec();
327
328 rrd_wrlock();
329
323 - RRDHOST *h;
330 + RRDHOST *host;
331
332 restart_after_removal:
326 - rrdhost_foreach_write(h) {
327 - if(h != protected
328 - && h != localhost
329 - && !h->connected_senders
330 - && h->senders_disconnected_time + rrdhost_free_orphan_time < now) {
331 - info("Host '%s' with machine guid '%s' is obsolete - cleaning up.", h->hostname, h->machine_guid);
332 - rrdhost_save(h);
333 - rrdhost_free(h);
333 + rrdhost_foreach_write(host) {
334 + if(host != protected
335 + && host != localhost
336 + && !host->connected_senders
337 + && host->senders_disconnected_time + rrdhost_free_orphan_time < now) {
338 + info("Host '%s' with machine guid '%s' is obsolete - cleaning up.", host->hostname, host->machine_guid);
339 +
340 + if(rrdset_flag_check(host, RRDHOST_ORPHAN))
341 + rrdhost_delete(host);
342 + else
343 + rrdhost_save(host);
344 +
345 + rrdhost_free(host);
346 goto restart_after_removal;
347 }
348 }
@@ -495,6 +507,29 @@ void rrdhost_save(RRDHOST *host) {
507 rrdhost_unlock(host);
508 }
509
510 +// ----------------------------------------------------------------------------
511 +// RRDHOST - delete files
512 +
513 +void rrdhost_delete(RRDHOST *host) {
514 + if(!host) return;
515 +
516 + info("Deleting database of host '%s'...", host->hostname);
517 +
518 + RRDSET *st;
519 +
520 + // we get a write lock
521 + // to ensure only one thread is saving the database
522 + rrdhost_wrlock(host);
523 +
524 + rrdset_foreach_write(st, host) {
525 + rrdset_rdlock(st);
526 + rrdset_delete(st);
527 + rrdset_unlock(st);
528 + }
529 +
530 + rrdhost_unlock(host);
531 +}
532 +
533 void rrdhost_save_all(void) {
534 info("Saving database [%zu hosts(s)]...", rrd_hosts_available);
535
@@ -507,7 +542,7 @@ void rrdhost_save_all(void) {
542 rrd_unlock();
543 }
544
510 -void rrdhost_cleanup(RRDHOST *host) {
545 +void rrdhost_cleanup_obsolete(RRDHOST *host) {
546 time_t now = now_realtime_sec();
547
548 RRDSET *st;
@@ -521,7 +556,12 @@ restart_after_removal:
556 )) {
557
558 rrdset_rdlock(st);
524 - rrdset_save(st);
559 +
560 + if(rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_FILES))
561 + rrdset_delete(st);
562 + else
563 + rrdset_save(st);
564 +
565 rrdset_unlock(st);
566
567 rrdset_free(st);
src/rrdpush.c
+3
@@ -219,6 +219,8 @@ static void rrdpush_sender_thread_cleanup_locked_all(RRDHOST *host) {
219 host->rrdpush_buffer = NULL;
220
221 host->rrdpush_spawn = 0;
222 +
223 + rrdhost_flag_set(host, RRDHOST_ORPHAN);
224 }
225
226 void rrdpush_sender_thread_stop(RRDHOST *host) {
@@ -645,6 +647,7 @@ void rrdpush_sender_thread_spawn(RRDHOST *host) {
647 else if(pthread_detach(host->rrdpush_thread))
648 error("STREAM %s [send]: cannot request detach newly created thread.", host->hostname);
649
650 + rrdhost_flag_clear(host, RRDHOST_ORPHAN);
651 host->rrdpush_spawn = 1;
652 }
653
src/rrdset.c
+21 -1
@@ -305,6 +305,26 @@ void rrdset_save(RRDSET *st) {
305 }
306 }
307
308 +void rrdset_delete(RRDSET *st) {
309 + RRDDIM *rd;
310 +
311 + rrdset_check_rdlock(st);
312 +
313 + // info("Deleting chart '%s' ('%s')", st->id, st->name);
314 +
315 + if(st->rrd_memory_mode == RRD_MEMORY_MODE_SAVE) {
316 + debug(D_RRD_STATS, "Deleting stats '%s' to '%s'.", st->name, st->cache_filename);
317 + unlink(st->cache_filename);
318 + }
319 +
320 + rrddim_foreach_read(rd, st) {
321 + if(likely(rd->rrd_memory_mode == RRD_MEMORY_MODE_SAVE)) {
322 + debug(D_RRD_STATS, "Deleting dimension '%s' to '%s'.", rd->name, rd->cache_filename);
323 + unlink(rd->cache_filename);
324 + }
325 + }
326 +}
327 +
328 // ----------------------------------------------------------------------------
329 // RRDSET - create a chart
330
@@ -535,7 +555,7 @@ RRDSET *rrdset_create(
555 rrdsetcalc_link_matching(st);
556 rrdcalctemplate_link_matching(st);
557
538 - rrdhost_cleanup(host);
558 + rrdhost_cleanup_obsolete(host);
559
560 rrdhost_unlock(host);
561