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);