@cryptotaxi247 / netdata-1 / commits / 6f68ba1ff

check orphan host flag when deciding for host cleanup; #2772

Costa Tsaousis (ktsaou) committed Sep 22, 2017 at 00:13 UTC 6f68ba1ff277626ddec0ff5a742e086063cc446a
3 files changed +24 -22
src/rrd.h
+3 -3
@@ -595,10 +595,10 @@ extern void rrdhost_free_all(void);
595 extern void rrdhost_save_all(void);
596 extern void rrdhost_cleanup_all(void);
597
598 -extern void rrdhost_cleanup_orphan_hosts(RRDHOST *protected);
598 +extern void rrdhost_cleanup_orphan_hosts_nolock(RRDHOST *protected);
599 extern void rrdhost_free(RRDHOST *host);
600 -extern void rrdhost_save(RRDHOST *host);
601 -extern void rrdhost_delete(RRDHOST *host);
600 +extern void rrdhost_save_charts(RRDHOST *host);
601 +extern void rrdhost_delete_charts(RRDHOST *host);
602
603 extern void rrdset_update_heterogeneous_flag(RRDSET *st);
604
src/rrdhost.c
+19 -18
@@ -346,9 +346,10 @@ RRDHOST *rrdhost_find_or_create(
346 // update host tags
347 rrdhost_init_tags(host, tags);
348 }
349 - rrd_unlock();
349
351 - rrdhost_cleanup_orphan_hosts(host);
350 + rrdhost_cleanup_orphan_hosts_nolock(host);
351 +
352 + rrd_unlock();
353
354 return host;
355 }
@@ -356,6 +357,7 @@ RRDHOST *rrdhost_find_or_create(
357 static inline int rrdhost_should_be_removed(RRDHOST *host, RRDHOST *protected, time_t now) {
358 if(host != protected
359 && host != localhost
360 + && rrdhost_flag_check(host, RRDHOST_ORPHAN)
361 && !host->connected_senders
362 && host->senders_disconnected_time
363 && host->senders_disconnected_time + rrdhost_free_orphan_time < now)
@@ -364,11 +366,9 @@ static inline int rrdhost_should_be_removed(RRDHOST *host, RRDHOST *protected, t
366 return 0;
367 }
368
367 -void rrdhost_cleanup_orphan_hosts(RRDHOST *protected) {
369 +void rrdhost_cleanup_orphan_hosts_nolock(RRDHOST *protected) {
370 time_t now = now_realtime_sec();
371
370 - rrd_wrlock();
371 -
372 RRDHOST *host;
373
374 restart_after_removal:
@@ -376,17 +376,15 @@ restart_after_removal:
376 if(rrdhost_should_be_removed(host, protected, now)) {
377 info("Host '%s' with machine guid '%s' is obsolete - cleaning up.", host->hostname, host->machine_guid);
378
379 - if(rrdset_flag_check(host, RRDHOST_DELETE_ORPHAN_HOST) && rrdset_flag_check(host, RRDHOST_ORPHAN))
380 - rrdhost_delete(host);
379 + if(rrdhost_flag_check(host, RRDHOST_DELETE_ORPHAN_HOST))
380 + rrdhost_delete_charts(host);
381 else
382 - rrdhost_save(host);
382 + rrdhost_save_charts(host);
383
384 rrdhost_free(host);
385 goto restart_after_removal;
386 }
387 }
388 -
389 - rrd_unlock();
388 }
389
390 // ----------------------------------------------------------------------------
@@ -534,7 +532,7 @@ void rrdhost_free_all(void) {
532 // ----------------------------------------------------------------------------
533 // RRDHOST - save host files
534
537 -void rrdhost_save(RRDHOST *host) {
535 +void rrdhost_save_charts(RRDHOST *host) {
536 if(!host) return;
537
538 info("Saving/Closing database of host '%s'...", host->hostname);
@@ -557,7 +555,7 @@ void rrdhost_save(RRDHOST *host) {
555 // ----------------------------------------------------------------------------
556 // RRDHOST - delete host files
557
560 -void rrdhost_delete(RRDHOST *host) {
558 +void rrdhost_delete_charts(RRDHOST *host) {
559 if(!host) return;
560
561 info("Deleting database of host '%s'...", host->hostname);
@@ -582,12 +580,13 @@ void rrdhost_delete(RRDHOST *host) {
580 // ----------------------------------------------------------------------------
581 // RRDHOST - cleanup host files
582
585 -void rrdhost_cleanup(RRDHOST *host) {
583 +void rrdhost_cleanup_charts(RRDHOST *host) {
584 if(!host) return;
585
586 info("Cleaning up database of host '%s'...", host->hostname);
587
588 RRDSET *st;
589 + uint32_t rrdhost_delete_obsolete_charts = rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS);
590
591 // we get a write lock
592 // to ensure only one thread is saving the database
@@ -596,7 +595,7 @@ void rrdhost_cleanup(RRDHOST *host) {
595 rrdset_foreach_write(st, host) {
596 rrdset_rdlock(st);
597
599 - if(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE) && rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS))
598 + if(rrdhost_delete_obsolete_charts && rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE))
599 rrdset_delete(st);
600 else
601 rrdset_save(st);
@@ -618,7 +617,7 @@ void rrdhost_save_all(void) {
617
618 RRDHOST *host;
619 rrdhost_foreach_read(host)
621 - rrdhost_save(host);
620 + rrdhost_save_charts(host);
621
622 rrd_unlock();
623 }
@@ -634,9 +633,9 @@ void rrdhost_cleanup_all(void) {
633 RRDHOST *host;
634 rrdhost_foreach_read(host) {
635 if(host != localhost && rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS) && !host->connected_senders)
637 - rrdhost_delete(host);
636 + rrdhost_delete_charts(host);
637 else
639 - rrdhost_cleanup(host);
638 + rrdhost_cleanup_charts(host);
639 }
640
641 rrd_unlock();
@@ -651,6 +650,8 @@ void rrdhost_cleanup_obsolete_charts(RRDHOST *host) {
650
651 RRDSET *st;
652
653 + uint32_t rrdhost_delete_obsolete_charts = rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS);
654 +
655 restart_after_removal:
656 rrdset_foreach_write(st, host) {
657 if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE)
@@ -661,7 +662,7 @@ restart_after_removal:
662
663 rrdset_rdlock(st);
664
664 - if(rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS))
665 + if(rrdhost_delete_obsolete_charts)
666 rrdset_delete(st);
667 else
668 rrdset_save(st);
src/rrdpush.c
+2 -1
@@ -684,8 +684,9 @@ static int rrdpush_receive(int fd, const char *key, const char *hostname, const
684 if(host->connected_senders > 0)
685 info("STREAM %s [receive from [%s]:%s]: multiple streaming connections for the same host detected. If multiple netdata are pushing metrics for the same charts, at the same time, the result is unexpected.", host->hostname, client_ip, client_port);
686
687 - host->connected_senders++;
687 rrdhost_flag_clear(host, RRDHOST_ORPHAN);
688 + host->connected_senders++;
689 + host->senders_disconnected_time = 0;
690 if(health_enabled != CONFIG_BOOLEAN_NO) {
691 if(alarms_delay > 0) {
692 host->health_delay_up_to = now_realtime_sec() + alarms_delay;