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