@cryptotaxi247 / netdata-1 / commits / 2506c9db6

delete unupdated dimensions after a week

Costa Tsaousis (ktsaou) committed Sep 13, 2015 at 22:58 UTC 2506c9db6ed3b4d3bc5b5a9bbc3109705e00158c
2 files changed +55 -29
src/rrd.c
+50 -29
@@ -22,6 +22,8 @@
22 // ----------------------------------------------------------------------------
23 // globals
24
25 +int rrd_delete_unupdated_dimensions = (86400 * 7);
26 +
27 int rrd_update_every = UPDATE_EVERY;
28 int rrd_default_history_entries = RRD_DEFAULT_HISTORY_ENTRIES;
29
@@ -728,6 +730,20 @@ int rrddim_hide(RRDSET *st, const char *id)
730 return 0;
731 }
732
733 +int rrddim_unhide(RRDSET *st, const char *id)
734 +{
735 + debug(D_RRD_CALLS, "rrddim_unhide() for chart %s, dimension %s", st->name, id);
736 +
737 + RRDDIM *rd = rrddim_find(st, id);
738 + if(!rd) {
739 + error("Cannot find dimension with id '%s' on stats '%s' (%s).", id, st->name, st->id);
740 + return 1;
741 + }
742 +
743 + rd->hidden = 0;
744 + return 0;
745 +}
746 +
747 void rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number value)
748 {
749 debug(D_RRD_CALLS, "rrddim_set_by_pointer() for chart %s, dimension %s, value " COLLECTED_NUMBER_FORMAT, st->name, rd->name, value);
@@ -1156,41 +1172,46 @@ unsigned long long rrdset_done(RRDSET *st)
1172 // --------------------------------------------------------------------
1173
1174 // find if there are any obsolete dimensions (not updated recently)
1159 - for( rd = st->dimensions; rd ; rd = rd->next )
1160 - if((rd->last_collected_time.tv_sec + (10 * st->update_every)) < st->last_collected_time.tv_sec)
1161 - break;
1162 -
1163 - if(rd) {
1164 - // there is dimension to free
1165 - // upgrade our read lock to a write lock
1166 - pthread_rwlock_unlock(&st->rwlock);
1167 - pthread_rwlock_wrlock(&st->rwlock);
1175 + if(rrd_delete_unupdated_dimensions) {
1176
1169 - for( rd = st->dimensions, last = NULL ; rd ; ) {
1170 - if((rd->last_collected_time.tv_sec + (10 * st->update_every)) < st->last_collected_time.tv_sec) { // remove it only it is not updated in 10 seconds
1171 - debug(D_RRD_STATS, "Removing obsolete dimension '%s' (%s) of '%s' (%s).", rd->name, rd->id, st->name, st->id);
1177 + for( rd = st->dimensions; rd ; rd = rd->next )
1178 + if((rd->last_collected_time.tv_sec + (rrd_delete_unupdated_dimensions * st->update_every)) < st->last_collected_time.tv_sec)
1179 + break;
1180
1173 - if(!last) {
1174 - st->dimensions = rd->next;
1175 - rd->next = NULL;
1176 - rrddim_free(st, rd);
1177 - rd = st->dimensions;
1178 - continue;
1179 - }
1180 - else {
1181 - last->next = rd->next;
1182 - rd->next = NULL;
1183 - rrddim_free(st, rd);
1184 - rd = last->next;
1185 - continue;
1181 + if(rd) {
1182 + // there is dimension to free
1183 + // upgrade our read lock to a write lock
1184 + pthread_rwlock_unlock(&st->rwlock);
1185 + pthread_rwlock_wrlock(&st->rwlock);
1186 +
1187 + for( rd = st->dimensions, last = NULL ; rd ; ) {
1188 + // remove it only it is not updated in rrd_delete_unupdated_dimensions seconds
1189 +
1190 + if((rd->last_collected_time.tv_sec + (rrd_delete_unupdated_dimensions * st->update_every)) < st->last_collected_time.tv_sec) {
1191 + debug(D_RRD_STATS, "Removing obsolete dimension '%s' (%s) of '%s' (%s).", rd->name, rd->id, st->name, st->id);
1192 +
1193 + if(!last) {
1194 + st->dimensions = rd->next;
1195 + rd->next = NULL;
1196 + rrddim_free(st, rd);
1197 + rd = st->dimensions;
1198 + continue;
1199 + }
1200 + else {
1201 + last->next = rd->next;
1202 + rd->next = NULL;
1203 + rrddim_free(st, rd);
1204 + rd = last->next;
1205 + continue;
1206 + }
1207 }
1208 +
1209 + last = rd;
1210 + rd = rd->next;
1211 }
1212
1189 - last = rd;
1190 - rd = rd->next;
1213 + if(!st->dimensions) st->enabled = 0;
1214 }
1192 -
1193 - if(!st->dimensions) st->enabled = 0;
1215 }
1216
1217 pthread_rwlock_unlock(&st->rwlock);
src/rrd.h
+5
@@ -15,6 +15,10 @@ extern int rrd_update_every;
15 #define RRD_HISTORY_ENTRIES_MAX (86400*10)
16 extern int rrd_default_history_entries;
17
18 +// time in seconds to delete unupdated dimensions
19 +// set to zero to disable this feature
20 +extern int rrd_delete_unupdated_dimensions;
21 +
22 #define RRD_ID_LENGTH_MAX 1024
23
24 #define RRDSET_MAGIC "NETDATA RRD SET FILE V012"
@@ -281,6 +285,7 @@ extern void rrddim_free(RRDSET *st, RRDDIM *rd);
285 extern RRDDIM *rrddim_find(RRDSET *st, const char *id);
286
287 extern int rrddim_hide(RRDSET *st, const char *id);
288 +extern int rrddim_unhide(RRDSET *st, const char *id);
289
290 extern void rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number value);
291 extern int rrddim_set(RRDSET *st, const char *id, collected_number value);