on exit delete orphan hosts and obsolete chart files; fixes #2329
Costa Tsaousis (ktsaou) committed
Jun 28, 2017 at 12:00 UTC
7c7b2509c3a95b9d1b9a661c3e1b0867de8a707c
4 files changed
+74
-18
src/main.c
+2
-2
@@ -9,8 +9,8 @@ void netdata_cleanup_and_exit(int ret) {
9
10
debug(D_EXIT, "Called: netdata_cleanup_and_exit()");
11
12
- // save the database
13
- rrdhost_save_all();
12
+ // cleanup the database
13
+ rrdhost_cleanup_all();
14
15
// unlink the pid
16
if(pidfile[0]) {
src/rrd.h
+5
-4
@@ -353,8 +353,8 @@ typedef struct rrdset RRDSET;
353
354
typedef enum rrdhost_flags {
355
RRDHOST_ORPHAN = 1 << 0, // this host is orphan (not receiving data)
356
- RRDHOST_DELETE_OBSOLETE_FILES = 1 << 1, // delete files of obsolete charts
357
- RRDHOST_DELETE_ORPHAN_FILES = 1 << 2 // delete the entire host when orphan
356
+ RRDHOST_DELETE_OBSOLETE_CHARTS = 1 << 1, // delete files of obsolete charts
357
+ RRDHOST_DELETE_ORPHAN_HOST = 1 << 2 // delete the entire host when orphan
358
} RRDHOST_FLAGS;
359
360
#define rrdhost_flag_check(host, flag) ((host)->flags & flag)
@@ -560,8 +560,9 @@ extern RRDSET *rrdset_create_custom(RRDHOST *host
560
561
extern void rrdhost_free_all(void);
562
extern void rrdhost_save_all(void);
563
+extern void rrdhost_cleanup_all(void);
564
564
-extern void rrdhost_cleanup_orphan(RRDHOST *protected);
565
+extern void rrdhost_cleanup_orphan_hosts(RRDHOST *protected);
566
extern void rrdhost_free(RRDHOST *host);
567
extern void rrdhost_save(RRDHOST *host);
568
extern void rrdhost_delete(RRDHOST *host);
@@ -669,7 +670,7 @@ extern void rrdset_reset(RRDSET *st);
670
extern void rrdset_save(RRDSET *st);
671
extern void rrdset_delete(RRDSET *st);
672
672
-extern void rrdhost_cleanup_obsolete(RRDHOST *host);
673
+extern void rrdhost_cleanup_obsolete_charts(RRDHOST *host);
674
675
#endif /* NETDATA_RRD_INTERNALS */
676
src/rrdhost.c
+66
-11
@@ -143,10 +143,10 @@ RRDHOST *rrdhost_create(const char *hostname,
143
avl_init_lock(&(host->variables_root_index), rrdvar_compare);
144
145
if(config_get_boolean(CONFIG_SECTION_GLOBAL, "delete obsolete charts files", 1))
146
- rrdhost_flag_set(host, RRDHOST_DELETE_OBSOLETE_FILES);
146
+ rrdhost_flag_set(host, RRDHOST_DELETE_OBSOLETE_CHARTS);
147
148
if(config_get_boolean(CONFIG_SECTION_GLOBAL, "delete orphan hosts files", 1) && !is_localhost)
149
- rrdhost_flag_set(host, RRDHOST_DELETE_ORPHAN_FILES);
149
+ rrdhost_flag_set(host, RRDHOST_DELETE_ORPHAN_HOST);
150
151
152
// ------------------------------------------------------------------------
@@ -348,12 +348,12 @@ RRDHOST *rrdhost_find_or_create(
348
}
349
rrd_unlock();
350
351
- rrdhost_cleanup_orphan(host);
351
+ rrdhost_cleanup_orphan_hosts(host);
352
353
return host;
354
}
355
356
-static inline int rrdhost_should_be_deleted(RRDHOST *host, RRDHOST *protected, time_t now) {
356
+static inline int rrdhost_should_be_removed(RRDHOST *host, RRDHOST *protected, time_t now) {
357
if(host != protected
358
&& host != localhost
359
&& !host->connected_senders
@@ -364,7 +364,7 @@ static inline int rrdhost_should_be_deleted(RRDHOST *host, RRDHOST *protected, t
364
return 0;
365
}
366
367
-void rrdhost_cleanup_orphan(RRDHOST *protected) {
367
+void rrdhost_cleanup_orphan_hosts(RRDHOST *protected) {
368
time_t now = now_realtime_sec();
369
370
rrd_wrlock();
@@ -373,10 +373,10 @@ void rrdhost_cleanup_orphan(RRDHOST *protected) {
373
374
restart_after_removal:
375
rrdhost_foreach_write(host) {
376
- if(rrdhost_should_be_deleted(host, protected, now)) {
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_ORPHAN))
379
+ if(rrdset_flag_check(host, RRDHOST_DELETE_ORPHAN_HOST) && rrdset_flag_check(host, RRDHOST_ORPHAN))
380
rrdhost_delete(host);
381
else
382
rrdhost_save(host);
@@ -532,7 +532,7 @@ void rrdhost_free_all(void) {
532
}
533
534
// ----------------------------------------------------------------------------
535
-// RRDHOST - save
535
+// RRDHOST - save host files
536
537
void rrdhost_save(RRDHOST *host) {
538
if(!host) return;
@@ -555,7 +555,7 @@ void rrdhost_save(RRDHOST *host) {
555
}
556
557
// ----------------------------------------------------------------------------
558
-// RRDHOST - delete files
558
+// RRDHOST - delete host files
559
560
void rrdhost_delete(RRDHOST *host) {
561
if(!host) return;
@@ -579,6 +579,38 @@ void rrdhost_delete(RRDHOST *host) {
579
rrdhost_unlock(host);
580
}
581
582
+// ----------------------------------------------------------------------------
583
+// RRDHOST - cleanup host files
584
+
585
+void rrdhost_cleanup(RRDHOST *host) {
586
+ if(!host) return;
587
+
588
+ info("Cleaning up database of host '%s'...", host->hostname);
589
+
590
+ RRDSET *st;
591
+
592
+ // we get a write lock
593
+ // to ensure only one thread is saving the database
594
+ rrdhost_wrlock(host);
595
+
596
+ rrdset_foreach_write(st, host) {
597
+ rrdset_rdlock(st);
598
+
599
+ if(rrdset_flag_check(st, RRDSET_FLAG_OBSOLETE))
600
+ rrdset_delete(st);
601
+ else
602
+ rrdset_save(st);
603
+
604
+ rrdset_unlock(st);
605
+ }
606
+
607
+ rrdhost_unlock(host);
608
+}
609
+
610
+
611
+// ----------------------------------------------------------------------------
612
+// RRDHOST - save all hosts to disk
613
+
614
void rrdhost_save_all(void) {
615
info("Saving database [%zu hosts(s)]...", rrd_hosts_available);
616
@@ -591,7 +623,30 @@ void rrdhost_save_all(void) {
623
rrd_unlock();
624
}
625
594
-void rrdhost_cleanup_obsolete(RRDHOST *host) {
626
+// ----------------------------------------------------------------------------
627
+// RRDHOST - save or delete all hosts from disk
628
+
629
+void rrdhost_cleanup_all(void) {
630
+ info("Cleaning up database [%zu hosts(s)]...", rrd_hosts_available);
631
+
632
+ rrd_rdlock();
633
+
634
+ RRDHOST *host;
635
+ rrdhost_foreach_read(host) {
636
+ if(host != localhost && rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS) && !host->connected_senders)
637
+ rrdhost_delete(host);
638
+ else
639
+ rrdhost_cleanup(host);
640
+ }
641
+
642
+ rrd_unlock();
643
+}
644
+
645
+
646
+// ----------------------------------------------------------------------------
647
+// RRDHOST - save or delete all the host charts from disk
648
+
649
+void rrdhost_cleanup_obsolete_charts(RRDHOST *host) {
650
time_t now = now_realtime_sec();
651
652
RRDSET *st;
@@ -606,7 +661,7 @@ restart_after_removal:
661
662
rrdset_rdlock(st);
663
609
- if(rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_FILES))
664
+ if(rrdhost_flag_check(host, RRDHOST_DELETE_OBSOLETE_CHARTS))
665
rrdset_delete(st);
666
else
667
rrdset_save(st);
src/rrdset.c
+1
-1
@@ -589,7 +589,7 @@ RRDSET *rrdset_create_custom(
589
rrdsetcalc_link_matching(st);
590
rrdcalctemplate_link_matching(st);
591
592
- rrdhost_cleanup_obsolete(host);
592
+ rrdhost_cleanup_obsolete_charts(host);
593
594
rrdhost_unlock(host);
595