38
RRD_FLAG_OWN_LABELS = (1 << 4), // this instance has its own labels - not linked to an RRDSET
39
RRD_FLAG_LIVE_RETENTION = (1 << 5), // we have got live retention from the database
40
RRD_FLAG_QUEUED_FOR_HUB = (1 << 6), // this context is currently queued to be dispatched to hub
41
- RRD_FLAG_QUEUED_FOR_POST_PROCESSING = (1 << 7), // this context is currently queued to be post-processed
41
+ RRD_FLAG_QUEUED_FOR_PP = (1 << 7), // this context is currently queued to be post-processed
42
RRD_FLAG_HIDDEN = (1 << 8), // don't expose this to the hub or the API
43
44
RRD_FLAG_UPDATE_REASON_TRIGGERED = (1 << 9), // the update was triggered by the child object
46
RRD_FLAG_UPDATE_REASON_NEW_OBJECT = (1 << 11), // this object has just been created
47
RRD_FLAG_UPDATE_REASON_UPDATED_OBJECT = (1 << 12), // we received an update on this object
48
RRD_FLAG_UPDATE_REASON_CHANGED_LINKING = (1 << 13), // an instance or a metric switched RRDSET or RRDDIM
49
- RRD_FLAG_UPDATE_REASON_CHANGED_UUID = (1 << 14), // an instance or a metric changed UUID
50
- RRD_FLAG_UPDATE_REASON_CHANGED_NAME = (1 << 15), // an instance or a metric changed name
51
- RRD_FLAG_UPDATE_REASON_CHANGED_UNITS = (1 << 16), // this context or instance changed units
52
- RRD_FLAG_UPDATE_REASON_CHANGED_TITLE = (1 << 17), // this context or instance changed title
53
- RRD_FLAG_UPDATE_REASON_CHANGED_FAMILY = (1 << 18), // the context or the instance changed family
54
- RRD_FLAG_UPDATE_REASON_CHANGED_CHART_TYPE = (1 << 19), // this context or instance changed chart type
55
- RRD_FLAG_UPDATE_REASON_CHANGED_PRIORITY = (1 << 20), // this context or instance changed its priority
56
- RRD_FLAG_UPDATE_REASON_CHANGED_UPDATE_EVERY = (1 << 21), // the instance or the metric changed update frequency
57
- RRD_FLAG_UPDATE_REASON_ZERO_RETENTION = (1 << 22), // this object has not retention
58
- RRD_FLAG_UPDATE_REASON_CHANGED_FIRST_TIME_T = (1 << 23), // this object changed its oldest time in the db
59
- RRD_FLAG_UPDATE_REASON_CHANGED_LAST_TIME_T = (1 << 24), // this object change its latest time in the db
60
- RRD_FLAG_UPDATE_REASON_STOPPED_BEING_COLLECTED = (1 << 25), // this object has stopped being collected
61
- RRD_FLAG_UPDATE_REASON_STARTED_BEING_COLLECTED = (1 << 26), // this object has started being collected
62
- RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD = (1 << 27), // this context belongs to a host that just disconnected
63
- RRD_FLAG_UPDATE_REASON_DB_ROTATION = (1 << 28), // this context changed because of a db rotation
64
- RRD_FLAG_UPDATE_REASON_UNUSED = (1 << 29), // this context is not used anymore
65
- RRD_FLAG_UPDATE_REASON_CHANGED_FLAGS = (1 << 30), // this context is not used anymore
66
- RRD_FLAG_UPDATE_REASON_UPDATED_RETENTION = (1 << 31), // this object has updated retention
49
+ RRD_FLAG_UPDATE_REASON_CHANGED_METADATA = (1 << 14), // this context or instance changed uuid, name, units, title, family, chart type, priority, update every, rrd changed flags
50
+ RRD_FLAG_UPDATE_REASON_ZERO_RETENTION = (1 << 15), // this object has no retention
51
+ RRD_FLAG_UPDATE_REASON_CHANGED_FIRST_TIME_T = (1 << 16), // this object changed its oldest time in the db
52
+ RRD_FLAG_UPDATE_REASON_CHANGED_LAST_TIME_T = (1 << 17), // this object change its latest time in the db
53
+ RRD_FLAG_UPDATE_REASON_STOPPED_BEING_COLLECTED = (1 << 18), // this object has stopped being collected
54
+ RRD_FLAG_UPDATE_REASON_STARTED_BEING_COLLECTED = (1 << 19), // this object has started being collected
55
+ RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD = (1 << 20), // this context belongs to a host that just disconnected
56
+ RRD_FLAG_UPDATE_REASON_UNUSED = (1 << 21), // this context is not used anymore
57
+ RRD_FLAG_UPDATE_REASON_DB_ROTATION = (1 << 22), // this context changed because of a db rotation
58
+
59
+ // action to perform on an object
60
+ RRD_FLAG_UPDATE_REASON_UPDATE_RETENTION = (1 << 30), // this object has to update its retention from the db
61
} RRD_FLAGS;
62
63
#define RRD_FLAG_ALL_UPDATE_REASONS ( \
66
|RRD_FLAG_UPDATE_REASON_NEW_OBJECT \
67
|RRD_FLAG_UPDATE_REASON_UPDATED_OBJECT \
68
|RRD_FLAG_UPDATE_REASON_CHANGED_LINKING \
75
- |RRD_FLAG_UPDATE_REASON_CHANGED_UUID \
76
- |RRD_FLAG_UPDATE_REASON_CHANGED_NAME \
77
- |RRD_FLAG_UPDATE_REASON_CHANGED_UNITS \
78
- |RRD_FLAG_UPDATE_REASON_CHANGED_TITLE \
79
- |RRD_FLAG_UPDATE_REASON_CHANGED_FAMILY \
80
- |RRD_FLAG_UPDATE_REASON_CHANGED_CHART_TYPE \
81
- |RRD_FLAG_UPDATE_REASON_CHANGED_PRIORITY \
82
- |RRD_FLAG_UPDATE_REASON_CHANGED_UPDATE_EVERY \
69
+ |RRD_FLAG_UPDATE_REASON_CHANGED_METADATA \
70
|RRD_FLAG_UPDATE_REASON_ZERO_RETENTION \
71
|RRD_FLAG_UPDATE_REASON_CHANGED_FIRST_TIME_T \
72
|RRD_FLAG_UPDATE_REASON_CHANGED_LAST_TIME_T \
75
|RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD \
76
|RRD_FLAG_UPDATE_REASON_DB_ROTATION \
77
|RRD_FLAG_UPDATE_REASON_UNUSED \
91
- |RRD_FLAG_UPDATE_REASON_CHANGED_FLAGS \
78
)
79
80
#define RRD_FLAGS_ALLOWED_EXTERNALLY_ON_NEW_OBJECTS ( \
91
#define RRD_FLAGS_PREVENTING_DELETIONS ( \
92
RRD_FLAG_QUEUED_FOR_HUB \
93
|RRD_FLAG_COLLECTED \
108
- |RRD_FLAG_QUEUED_FOR_POST_PROCESSING \
94
+ |RRD_FLAG_QUEUED_FOR_PP \
95
)
96
97
// get all the flags of an object
189
usec_t delay_ut;
190
} rrdcontext_reasons[] = {
191
// context related
206
- { RRD_FLAG_UPDATE_REASON_TRIGGERED, "triggered transition", 65 * USEC_PER_SEC },
207
- { RRD_FLAG_UPDATE_REASON_NEW_OBJECT, "object created", 65 * USEC_PER_SEC },
208
- { RRD_FLAG_UPDATE_REASON_UPDATED_OBJECT, "object updated", 65 * USEC_PER_SEC },
209
- { RRD_FLAG_UPDATE_REASON_LOAD_SQL, "loaded from sql", 65 * USEC_PER_SEC },
210
- { RRD_FLAG_UPDATE_REASON_CHANGED_TITLE, "changed title", 65 * USEC_PER_SEC },
211
- { RRD_FLAG_UPDATE_REASON_CHANGED_UNITS, "changed units", 65 * USEC_PER_SEC },
212
- { RRD_FLAG_UPDATE_REASON_CHANGED_FAMILY, "changed family", 65 * USEC_PER_SEC },
213
- { RRD_FLAG_UPDATE_REASON_CHANGED_PRIORITY, "changed priority", 65 * USEC_PER_SEC },
214
- { RRD_FLAG_UPDATE_REASON_ZERO_RETENTION, "has no retention", 65 * USEC_PER_SEC },
215
- { RRD_FLAG_UPDATE_REASON_CHANGED_FIRST_TIME_T, "updated first_time_t", 65 * USEC_PER_SEC },
216
- { RRD_FLAG_UPDATE_REASON_CHANGED_LAST_TIME_T, "updated last_time_t", 65 * USEC_PER_SEC },
217
- { RRD_FLAG_UPDATE_REASON_CHANGED_CHART_TYPE, "changed chart type", 65 * USEC_PER_SEC },
218
- { RRD_FLAG_UPDATE_REASON_STOPPED_BEING_COLLECTED, "stopped collected", 65 * USEC_PER_SEC },
219
- { RRD_FLAG_UPDATE_REASON_STARTED_BEING_COLLECTED, "started collected", 5 * USEC_PER_SEC },
220
- { RRD_FLAG_UPDATE_REASON_UNUSED, "unused", 5 * USEC_PER_SEC },
192
+ {RRD_FLAG_UPDATE_REASON_TRIGGERED, "triggered transition", 65 * USEC_PER_SEC },
193
+ {RRD_FLAG_UPDATE_REASON_NEW_OBJECT, "object created", 65 * USEC_PER_SEC },
194
+ {RRD_FLAG_UPDATE_REASON_UPDATED_OBJECT, "object updated", 65 * USEC_PER_SEC },
195
+ {RRD_FLAG_UPDATE_REASON_LOAD_SQL, "loaded from sql", 65 * USEC_PER_SEC },
196
+ {RRD_FLAG_UPDATE_REASON_CHANGED_METADATA, "changed metadata", 65 * USEC_PER_SEC },
197
+ {RRD_FLAG_UPDATE_REASON_ZERO_RETENTION, "has no retention", 65 * USEC_PER_SEC },
198
+ {RRD_FLAG_UPDATE_REASON_CHANGED_FIRST_TIME_T, "updated first_time_t", 65 * USEC_PER_SEC },
199
+ {RRD_FLAG_UPDATE_REASON_CHANGED_LAST_TIME_T, "updated last_time_t", 65 * USEC_PER_SEC },
200
+ {RRD_FLAG_UPDATE_REASON_STOPPED_BEING_COLLECTED, "stopped collected", 65 * USEC_PER_SEC },
201
+ {RRD_FLAG_UPDATE_REASON_STARTED_BEING_COLLECTED, "started collected", 5 * USEC_PER_SEC },
202
+ {RRD_FLAG_UPDATE_REASON_UNUSED, "unused", 5 * USEC_PER_SEC },
203
204
// not context related
223
- { RRD_FLAG_UPDATE_REASON_CHANGED_UUID, "changed uuid", 65 * USEC_PER_SEC },
224
- { RRD_FLAG_UPDATE_REASON_CHANGED_UPDATE_EVERY, "changed updated every",65 * USEC_PER_SEC },
225
- { RRD_FLAG_UPDATE_REASON_CHANGED_LINKING, "changed rrd link", 65 * USEC_PER_SEC },
226
- { RRD_FLAG_UPDATE_REASON_CHANGED_NAME, "changed name", 65 * USEC_PER_SEC },
227
- { RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD, "child disconnected", 65 * USEC_PER_SEC },
228
- { RRD_FLAG_UPDATE_REASON_DB_ROTATION, "db rotation", 65 * USEC_PER_SEC },
229
- { RRD_FLAG_UPDATE_REASON_CHANGED_FLAGS, "changed flags", 65 * USEC_PER_SEC },
230
- { RRD_FLAG_UPDATE_REASON_UPDATED_RETENTION, "updated retention", 65 * USEC_PER_SEC },
205
+ {RRD_FLAG_UPDATE_REASON_CHANGED_LINKING, "changed rrd link", 65 * USEC_PER_SEC },
206
+ {RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD, "child disconnected", 65 * USEC_PER_SEC },
207
+ {RRD_FLAG_UPDATE_REASON_DB_ROTATION, "db rotation", 65 * USEC_PER_SEC },
208
+ {RRD_FLAG_UPDATE_REASON_UPDATE_RETENTION, "updated retention", 65 * USEC_PER_SEC },
209
210
// terminator
233
- { 0, NULL, 0 },
211
+ {0, NULL, 0 },
212
};
213
214
298
// ----------------------------------------------------------------------------
299
// helper one-liners for RRDMETRIC
300
323
-static void rrdmetric_update_retention(RRDMETRIC *rm);
301
+static bool rrdmetric_update_retention(RRDMETRIC *rm);
302
303
static inline RRDMETRIC *rrdmetric_acquired_value(RRDMETRIC_ACQUIRED *rma) {
304
return dictionary_acquired_item_value((DICTIONARY_ITEM *)rma);
450
if(flags & RRD_FLAG_HIDDEN)
451
buffer_strcat(wb, "HIDDEN ");
452
475
- if(flags & RRD_FLAG_QUEUED_FOR_POST_PROCESSING)
453
+ if(flags & RRD_FLAG_QUEUED_FOR_PP)
454
buffer_strcat(wb, "PENDING_UPDATES ");
455
}
456
516
string2str(rm->id), string2str(rm_new->id));
517
518
if(uuid_compare(rm->uuid, rm_new->uuid) != 0) {
519
+#ifdef NETDATA_INTERNAL_CHECKS
520
char uuid1[UUID_STR_LEN], uuid2[UUID_STR_LEN];
521
uuid_unparse(rm->uuid, uuid1);
522
uuid_unparse(rm_new->uuid, uuid2);
544
- internal_error(true, "RRDMETRIC: '%s' of instance '%s' changed uuid from '%s' to '%s'", string2str(rm->id), string2str(rm->ri->id), uuid1, uuid2);
523
+
524
+ time_t old_first_time_t = 0;
525
+ time_t old_last_time_t = 0;
526
+ if(rrdmetric_update_retention(rm)) {
527
+ old_first_time_t = rm->first_time_t;
528
+ old_last_time_t = rm->last_time_t;
529
+ }
530
+
531
+ uuid_copy(rm->uuid, rm_new->uuid);
532
+
533
+ time_t new_first_time_t = 0;
534
+ time_t new_last_time_t = 0;
535
+ if(rrdmetric_update_retention(rm)) {
536
+ new_first_time_t = rm->first_time_t;
537
+ new_last_time_t = rm->last_time_t;
538
+ }
539
+
540
+ internal_error(true,
541
+ "RRDMETRIC: '%s' of instance '%s' of host '%s' changed UUID from '%s' (retention %ld to %ld, %ld secs) to '%s' (retention %ld to %ld, %ld secs)"
542
+ , string2str(rm->id)
543
+ , string2str(rm->ri->id)
544
+ , rrdhost_hostname(rm->ri->rc->rrdhost)
545
+ , uuid1, old_first_time_t, old_last_time_t, old_last_time_t - old_first_time_t
546
+ , uuid2, new_first_time_t, new_last_time_t, new_last_time_t - new_first_time_t
547
+ );
548
+#else
549
uuid_copy(rm->uuid, rm_new->uuid);
546
- rrd_flag_set_updated(rm, RRD_FLAG_UPDATE_REASON_CHANGED_UUID);
550
+#endif
551
+ rrd_flag_set_updated(rm, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
552
}
553
554
if(rm->rrddim && rm_new->rrddim && rm->rrddim != rm_new->rrddim) {
556
rrd_flag_set_updated(rm, RRD_FLAG_UPDATE_REASON_CHANGED_LINKING);
557
}
558
559
+#ifdef NETDATA_INTERNAL_CHECKS
560
if(rm->rrddim && uuid_compare(rm->uuid, rm->rrddim->metric_uuid) != 0) {
561
char uuid1[UUID_STR_LEN], uuid2[UUID_STR_LEN];
562
uuid_unparse(rm->uuid, uuid1);
563
uuid_unparse(rm_new->uuid, uuid2);
564
internal_error(true, "RRDMETRIC: '%s' is linked to RRDDIM '%s' but they have different UUIDs. RRDMETRIC has '%s', RRDDIM has '%s'", string2str(rm->id), rrddim_id(rm->rrddim), uuid1, uuid2);
565
}
566
+#endif
567
568
if(rm->rrddim != rm_new->rrddim)
569
rm->rrddim = rm_new->rrddim;
572
STRING *old = rm->name;
573
rm->name = string_dup(rm_new->name);
574
string_freez(old);
568
- rrd_flag_set_updated(rm, RRD_FLAG_UPDATE_REASON_CHANGED_NAME);
575
+ rrd_flag_set_updated(rm, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
576
}
577
578
if(!rm->first_time_t || (rm_new->first_time_t && rm_new->first_time_t < rm->first_time_t)) {
807
string2str(ri->id), string2str(ri_new->id));
808
809
if(uuid_compare(ri->uuid, ri_new->uuid) != 0) {
810
+#ifdef NETDATA_INTERNAL_CHECKS
811
+ char uuid1[UUID_STR_LEN], uuid2[UUID_STR_LEN];
812
+ uuid_unparse(ri->uuid, uuid1);
813
+ uuid_unparse(ri_new->uuid, uuid2);
814
+ internal_error(true, "RRDINSTANCE: '%s' of host '%s' changed UUID from '%s' to '%s'",
815
+ string2str(ri->id), rrdhost_hostname(ri->rc->rrdhost), uuid1, uuid2);
816
+#endif
817
+
818
uuid_copy(ri->uuid, ri_new->uuid);
804
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_UUID);
819
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
820
}
821
822
if(ri->rrdset && ri_new->rrdset && ri->rrdset != ri_new->rrdset) {
824
rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_LINKING);
825
}
826
827
+#ifdef NETDATA_INTERNAL_CHECKS
828
if(ri->rrdset && uuid_compare(ri->uuid, ri->rrdset->chart_uuid) != 0) {
829
char uuid1[UUID_STR_LEN], uuid2[UUID_STR_LEN];
830
uuid_unparse(ri->uuid, uuid1);
831
uuid_unparse(ri->rrdset->chart_uuid, uuid2);
832
internal_error(true, "RRDINSTANCE: '%s' is linked to RRDSET '%s' but they have different UUIDs. RRDINSTANCE has '%s', RRDSET has '%s'", string2str(ri->id), rrdset_id(ri->rrdset), uuid1, uuid2);
833
}
834
+#endif
835
836
if(ri->name != ri_new->name) {
837
STRING *old = ri->name;
838
ri->name = string_dup(ri_new->name);
839
string_freez(old);
823
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_NAME);
840
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
841
}
842
843
if(ri->title != ri_new->title) {
844
STRING *old = ri->title;
845
ri->title = string_dup(ri_new->title);
846
string_freez(old);
830
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_TITLE);
847
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
848
}
849
850
if(ri->units != ri_new->units) {
851
STRING *old = ri->units;
852
ri->units = string_dup(ri_new->units);
853
string_freez(old);
837
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_UNITS);
854
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
855
}
856
857
if(ri->family != ri_new->family) {
858
STRING *old = ri->family;
859
ri->family = string_dup(ri_new->family);
860
string_freez(old);
844
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_FAMILY);
861
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
862
}
863
864
if(ri->chart_type != ri_new->chart_type) {
865
ri->chart_type = ri_new->chart_type;
849
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_CHART_TYPE);
866
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
867
}
868
869
if(ri->priority != ri_new->priority) {
870
ri->priority = ri_new->priority;
854
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_PRIORITY);
871
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
872
}
873
874
if(ri->update_every != ri_new->update_every) {
875
ri->update_every = ri_new->update_every;
859
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_UPDATE_EVERY);
876
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
877
}
878
879
if(ri->rrdset != ri_new->rrdset) {
942
if(likely(st)) {
943
if(unlikely((unsigned int) st->priority != ri->priority)) {
944
ri->priority = st->priority;
928
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_PRIORITY);
945
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
946
}
947
if(unlikely(st->update_every != ri->update_every)) {
948
ri->update_every = st->update_every;
932
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_UPDATE_EVERY);
949
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
950
}
951
}
952
else if(unlikely(rrd_flag_is_collected(ri))) {
1117
RRDINSTANCE *ri = rrdset_get_rrdinstance(st);
1118
if(unlikely(!ri)) return;
1119
1103
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_UPDATED_RETENTION);
1120
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_UPDATE_RETENTION);
1121
rrdinstance_trigger_updates(ri, __FUNCTION__ );
1122
}
1123
1133
ri->name = string_dup(st->name);
1134
string_freez(old);
1135
1119
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_NAME);
1136
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
1137
rrdinstance_trigger_updates(ri, __FUNCTION__ );
1138
}
1139
}
1148
1149
if(unlikely(st_is_hidden != ri_is_hidden)) {
1150
if (unlikely(st_is_hidden && !ri_is_hidden))
1134
- rrd_flag_set_updated(ri, RRD_FLAG_HIDDEN | RRD_FLAG_UPDATE_REASON_CHANGED_FLAGS);
1151
+ rrd_flag_set_updated(ri, RRD_FLAG_HIDDEN | RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
1152
1153
else if (unlikely(!st_is_hidden && ri_is_hidden)) {
1154
rrd_flag_clear(ri, RRD_FLAG_HIDDEN);
1138
- rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_FLAGS);
1155
+ rrd_flag_set_updated(ri, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
1156
}
1157
}
1158
}
1286
else
1287
rc->title = string_2way_merge(rc->title, rc_new->title);
1288
string_freez(old_title);
1272
- rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_TITLE);
1289
+ rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
1290
}
1291
1292
if(rc->units != rc_new->units) {
1293
STRING *old_units = rc->units;
1294
rc->units = string_dup(rc_new->units);
1295
string_freez(old_units);
1279
- rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_UNITS);
1296
+ rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
1297
}
1298
1299
if(rc->family != rc_new->family) {
1303
else
1304
rc->family = string_2way_merge(rc->family, rc_new->family);
1305
string_freez(old_family);
1289
- rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_FAMILY);
1306
+ rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
1307
}
1308
1309
if(rc->chart_type != rc_new->chart_type) {
1310
rc->chart_type = rc_new->chart_type;
1294
- rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_CHART_TYPE);
1311
+ rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
1312
}
1313
1314
if(rc->priority != rc_new->priority) {
1315
rc->priority = rc_new->priority;
1299
- rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_PRIORITY);
1316
+ rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
1317
}
1318
1319
rrd_flag_set(rc, rc_new->flags & RRD_FLAGS_ALLOWED_EXTERNALLY_ON_NEW_OBJECTS); // no need for atomics on rc_new
1368
1369
static void rrdcontext_post_processing_queue_insert_callback(const DICTIONARY_ITEM *item __maybe_unused, void *context, void *nothing __maybe_unused) {
1370
RRDCONTEXT *rc = context;
1354
- rrd_flag_set(rc, RRD_FLAG_QUEUED_FOR_POST_PROCESSING);
1371
+ rrd_flag_set(rc, RRD_FLAG_QUEUED_FOR_PP);
1372
rc->pp.queued_flags = rc->flags;
1373
rc->pp.queued_ut = now_realtime_usec();
1374
}
1375
1376
static void rrdcontext_post_processing_queue_delete_callback(const DICTIONARY_ITEM *item __maybe_unused, void *context, void *nothing __maybe_unused) {
1377
RRDCONTEXT *rc = context;
1361
- rrd_flag_clear(rc, RRD_FLAG_QUEUED_FOR_POST_PROCESSING);
1378
+ rrd_flag_clear(rc, RRD_FLAG_QUEUED_FOR_PP);
1379
rc->pp.dequeued_ut = now_realtime_usec();
1380
}
1381
1383
RRDCONTEXT *rc = context;
1384
bool changed = false;
1385
1369
- if(!(rc->flags & RRD_FLAG_QUEUED_FOR_POST_PROCESSING)) {
1370
- rrd_flag_set(rc, RRD_FLAG_QUEUED_FOR_POST_PROCESSING);
1386
+ if(!(rc->flags & RRD_FLAG_QUEUED_FOR_PP)) {
1387
+ rrd_flag_set(rc, RRD_FLAG_QUEUED_FOR_PP);
1388
changed = true;
1389
}
1390
3052
// ----------------------------------------------------------------------------
3053
// garbage collector
3054
3038
-static void rrdmetric_update_retention(RRDMETRIC *rm) {
3055
+static bool rrdmetric_update_retention(RRDMETRIC *rm) {
3056
time_t min_first_time_t = LONG_MAX, max_last_time_t = 0;
3057
3058
if(rm->rrddim) {
3077
}
3078
else {
3079
// cannot get retention
3063
- return;
3080
+ return false;
3081
}
3082
#endif
3083
3107
rrd_flag_set_deleted(rm, RRD_FLAG_UPDATE_REASON_ZERO_RETENTION);
3108
3109
rrd_flag_set(rm, RRD_FLAG_LIVE_RETENTION);
3110
+
3111
+ return true;
3112
}
3113
3114
static inline bool rrdmetric_should_be_deleted(RRDMETRIC *rm) {
3280
if(reason != RRD_FLAG_NONE)
3281
rrd_flag_set_updated(rm, reason);
3282
3264
- if(!force && !rrd_flag_is_updated(rm) && rrd_flag_check(rm, RRD_FLAG_LIVE_RETENTION) && !rrd_flag_check(rm, RRD_FLAG_UPDATE_REASON_UPDATED_RETENTION))
3283
+ if(!force && !rrd_flag_is_updated(rm) && rrd_flag_check(rm, RRD_FLAG_LIVE_RETENTION) && !rrd_flag_check(rm, RRD_FLAG_UPDATE_REASON_UPDATE_RETENTION))
3284
return;
3285
3286
if(worker_jobs)
3287
worker_is_busy(WORKER_JOB_PP_METRIC);
3288
3270
- if(reason == RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD) {
3289
+ if(reason & RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD) {
3290
rrd_flag_set_archived(rm);
3291
rrd_flag_set(rm, RRD_FLAG_UPDATE_REASON_DISCONNECTED_CHILD);
3292
}
3293
+ if(rrd_flag_is_deleted(rm) && (reason & RRD_FLAG_UPDATE_REASON_UPDATE_RETENTION))
3294
+ rrd_flag_set_archived(rm);
3295
3296
rrdmetric_update_retention(rm);
3297
3317
if(unlikely(netdata_exit)) break;
3318
3319
RRD_FLAGS reason_to_pass = reason;
3299
- if(rrd_flag_check(ri, RRD_FLAG_UPDATE_REASON_UPDATED_RETENTION))
3300
- reason_to_pass |= RRD_FLAG_UPDATE_REASON_UPDATED_RETENTION;
3320
+ if(rrd_flag_check(ri, RRD_FLAG_UPDATE_REASON_UPDATE_RETENTION))
3321
+ reason_to_pass |= RRD_FLAG_UPDATE_REASON_UPDATE_RETENTION;
3322
3323
rrdmetric_process_updates(rm, force, reason_to_pass, worker_jobs);
3324
3424
if(unlikely(netdata_exit)) break;
3425
3426
RRD_FLAGS reason_to_pass = reason;
3406
- if(rrd_flag_check(rc, RRD_FLAG_UPDATE_REASON_UPDATED_RETENTION))
3407
- reason_to_pass |= RRD_FLAG_UPDATE_REASON_UPDATED_RETENTION;
3427
+ if(rrd_flag_check(rc, RRD_FLAG_UPDATE_REASON_UPDATE_RETENTION))
3428
+ reason_to_pass |= RRD_FLAG_UPDATE_REASON_UPDATE_RETENTION;
3429
3430
rrdinstance_post_process_updates(ri, force, reason_to_pass, worker_jobs);
3431
3538
3539
if (min_priority != LONG_MAX && rc->priority != min_priority) {
3540
rc->priority = min_priority;
3520
- rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_PRIORITY);
3541
+ rrd_flag_set_updated(rc, RRD_FLAG_UPDATE_REASON_CHANGED_METADATA);
3542
}
3543
}
3544
3557
static void rrdcontext_queue_for_post_processing(RRDCONTEXT *rc, const char *function __maybe_unused, RRD_FLAGS flags __maybe_unused) {
3558
if(unlikely(!rc->rrdhost->rrdctx_post_processing_queue)) return;
3559
3539
- if(!rrd_flag_check(rc, RRD_FLAG_QUEUED_FOR_POST_PROCESSING)) {
3560
+ if(!rrd_flag_check(rc, RRD_FLAG_QUEUED_FOR_PP)) {
3561
dictionary_set((DICTIONARY *)rc->rrdhost->rrdctx_post_processing_queue,
3562
string2str(rc->id),
3563
rc,