Skip to content

Commit 182528a

Browse files
authored
CA-408126 - rrd: Do not lose ds_min/max when adding to the RRD (#6349)
Rrd.ds_create has optional min and max arguments (defaulting to neg_infinity and infinity respectively). Several callers would omit these parameters, resulting in ds_min and ds_max being lost during the conversion from Ds.ds to Rrd.ds. Without these, metrics couldn't be kept in range, which would result in some (such as CPU usage numbers) going negative when a domain would change its domid (over a reboot), for example. Make these parameters required, not optional. Requires adjusting unit tests as well. This latent behaviour was exposed during the major timestamp and plugin refactoring last year. Previously, the entire RRD was created at once by calling create_fresh_rrd. Now create_fresh_rrd is only called for the first chunk, and other chunks of the RRD call merge_new_dss, which omitted the optional arguments. Rrdd_server.add_ds also ommitted these arguments, which meant that datasources enabled at runtime would not be kept in range.
2 parents 76ad85f + 71f8d16 commit 182528a

File tree

5 files changed

+72
-28
lines changed

5 files changed

+72
-28
lines changed

ocaml/libs/xapi-rrd/lib/rrd.ml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -562,8 +562,7 @@ let rra_create cf row_cnt pdp_cnt xff =
562562
(* defer creation of the data until we know how many dss we're storing *)
563563
}
564564

565-
let ds_create name ty ?(min = neg_infinity) ?(max = infinity) ?(mrhb = infinity)
566-
init =
565+
let ds_create name ty ~min ~max ~mrhb init =
567566
{
568567
ds_name= name
569568
; ds_ty= ty

ocaml/libs/xapi-rrd/lib_test/crowbar_tests.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ let ds =
6767
Cb.(
6868
map [ds_value; float; float; ds_type] (fun v x y typ ->
6969
let min, max = castd2s x y in
70-
ds_create (ds_type_to_string typ) ~min ~max typ v
70+
ds_create (ds_type_to_string typ) ~min ~max ~mrhb:infinity typ v
7171
)
7272
)
7373

ocaml/libs/xapi-rrd/lib_test/unit_tests.ml

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,18 @@ let absolute_rrd =
113113
let rra3 = rra_create CF_Average 100 100 0.5 in
114114
let rra4 = rra_create CF_Average 100 1000 0.5 in
115115
let ts = 1000000000.0 in
116-
let ds = ds_create "foo" Absolute ~mrhb:10.0 (VT_Float 0.0) in
117-
let ds2 = ds_create "bar" Absolute ~mrhb:10.0 (VT_Float 0.0) in
118-
let ds3 = ds_create "baz" Absolute ~mrhb:10.0 (VT_Float 0.0) in
119-
let ds4 = ds_create "boo" Absolute ~mrhb:10.0 (VT_Float 0.0) in
116+
let ds =
117+
ds_create "foo" Absolute ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
118+
in
119+
let ds2 =
120+
ds_create "bar" Absolute ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
121+
in
122+
let ds3 =
123+
ds_create "baz" Absolute ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
124+
in
125+
let ds4 =
126+
ds_create "boo" Absolute ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
127+
in
120128
let rrd = rrd_create [|ds; ds2; ds3; ds4|] [|rra; rra2; rra3; rra4|] 1L ts in
121129
let id = Identity in
122130
for i = 1 to 100000 do
@@ -143,10 +151,18 @@ let absolute_rrd_CA_404597 () =
143151
let rra3 = rra_create CF_Average 100 100 0.5 in
144152
let rra4 = rra_create CF_Average 100 1000 0.5 in
145153
let ts = 1000000000.0 in
146-
let ds = ds_create "foo" Absolute ~mrhb:10.0 (VT_Float 0.0) in
147-
let ds2 = ds_create "bar" Absolute ~mrhb:10.0 (VT_Float 0.0) in
148-
let ds3 = ds_create "baz" Absolute ~mrhb:10.0 (VT_Float 0.0) in
149-
let ds4 = ds_create "boo" Absolute ~mrhb:10.0 (VT_Float 0.0) in
154+
let ds =
155+
ds_create "foo" Absolute ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
156+
in
157+
let ds2 =
158+
ds_create "bar" Absolute ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
159+
in
160+
let ds3 =
161+
ds_create "baz" Absolute ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
162+
in
163+
let ds4 =
164+
ds_create "boo" Absolute ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
165+
in
150166
let rrd = rrd_create [|ds; ds2; ds3; ds4|] [|rra; rra2; rra3; rra4|] 1L ts in
151167
let id = Identity in
152168
for i = 1 to 100000 do
@@ -181,10 +197,18 @@ let gauge_rrd_CA_404597 () =
181197
let rra3 = rra_create CF_Average 100 100 0.5 in
182198
let rra4 = rra_create CF_Average 100 1000 0.5 in
183199
let ts = 1000000000.0 in
184-
let ds = ds_create "foo" Gauge ~mrhb:10.0 (VT_Float 0.0) in
185-
let ds2 = ds_create "bar" Gauge ~mrhb:10.0 (VT_Float 0.0) in
186-
let ds3 = ds_create "baz" Gauge ~mrhb:10.0 (VT_Float 0.0) in
187-
let ds4 = ds_create "boo" Gauge ~mrhb:10.0 (VT_Float 0.0) in
200+
let ds =
201+
ds_create "foo" Gauge ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
202+
in
203+
let ds2 =
204+
ds_create "bar" Gauge ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
205+
in
206+
let ds3 =
207+
ds_create "baz" Gauge ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
208+
in
209+
let ds4 =
210+
ds_create "boo" Gauge ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
211+
in
188212
let rrd = rrd_create [|ds; ds2; ds3; ds4|] [|rra; rra2; rra3; rra4|] 1L ts in
189213
let id = Identity in
190214
for i = 1 to 100000 do
@@ -217,10 +241,18 @@ let gauge_rrd =
217241
let rra3 = rra_create CF_Average 100 100 0.5 in
218242
let rra4 = rra_create CF_Average 100 1000 0.5 in
219243
let ts = 1000000000.0 in
220-
let ds = ds_create "foo" Gauge ~mrhb:10.0 (VT_Float 0.0) in
221-
let ds2 = ds_create "bar" Gauge ~mrhb:10.0 (VT_Float 0.0) in
222-
let ds3 = ds_create "baz" Gauge ~mrhb:10.0 (VT_Float 0.0) in
223-
let ds4 = ds_create "boo" Gauge ~mrhb:10.0 (VT_Float 0.0) in
244+
let ds =
245+
ds_create "foo" Gauge ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
246+
in
247+
let ds2 =
248+
ds_create "bar" Gauge ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
249+
in
250+
let ds3 =
251+
ds_create "baz" Gauge ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
252+
in
253+
let ds4 =
254+
ds_create "boo" Gauge ~mrhb:10.0 ~min:0. ~max:infinity (VT_Float 0.0)
255+
in
224256
let rrd = rrd_create [|ds; ds2; ds3; ds4|] [|rra; rra2; rra3; rra4|] 1L ts in
225257
let id = Identity in
226258
for i = 1 to 100000 do
@@ -252,7 +284,9 @@ let _deserialize_verify_rrd =
252284
let rra1 = rra_create CF_Average 100 1 0.5 in
253285
let rra2 = rra_create CF_Min 100 1 0.5 in
254286
let rra3 = rra_create CF_Max 100 1 0.5 in
255-
let ds = ds_create "flip_flop" Derive (VT_Int64 0L) in
287+
let ds =
288+
ds_create "flip_flop" Derive ~min:0. ~max:infinity ~mrhb:5. (VT_Int64 0L)
289+
in
256290

257291
let rrd = rrd_create [|ds|] [|rra1; rra2; rra3|] 5L 0. in
258292

@@ -269,7 +303,9 @@ let ca_322008_rrd =
269303
let rra1 = rra_create CF_Average 100 1 0.5 in
270304
let rra2 = rra_create CF_Min 100 1 0.5 in
271305
let rra3 = rra_create CF_Max 100 1 0.5 in
272-
let ds = ds_create "even or zero" Derive ~min:0. (VT_Int64 0L) in
306+
let ds =
307+
ds_create "even or zero" Derive ~min:0. ~max:infinity ~mrhb:5. (VT_Int64 0L)
308+
in
273309

274310
let rrd = rrd_create [|ds|] [|rra1; rra2; rra3|] 5L 0. in
275311

@@ -287,7 +323,9 @@ let ca_329043_rrd_1 =
287323
let rra1 = rra_create CF_Average 3 1 0.5 in
288324
let rra2 = rra_create CF_Min 3 1 0.5 in
289325
let rra3 = rra_create CF_Max 3 1 0.5 in
290-
let ds = ds_create "derive_with_min" ~min:0. ~max:1. Derive VT_Unknown in
326+
let ds =
327+
ds_create "derive_with_min" ~min:0. ~max:1. ~mrhb:5. Derive VT_Unknown
328+
in
291329

292330
let rrd = rrd_create [|ds|] [|rra1; rra2; rra3|] 5L 0. in
293331

@@ -313,9 +351,10 @@ let create_rrd ?(rows = 2) values min max =
313351
let rra2 = rra_create CF_Min rows 10 0.5 in
314352
let rra3 = rra_create CF_Max rows 10 0.5 in
315353
let rra4 = rra_create CF_Last rows 10 0.5 in
316-
let ds1 = ds_create "derive" ~min ~max Derive VT_Unknown in
317-
let ds2 = ds_create "absolute" ~min ~max Derive VT_Unknown in
318-
let ds3 = ds_create "gauge" ~min ~max Derive VT_Unknown in
354+
let mrhb = 5. in
355+
let ds1 = ds_create "derive" ~min ~max ~mrhb Derive VT_Unknown in
356+
let ds2 = ds_create "absolute" ~min ~max ~mrhb Derive VT_Unknown in
357+
let ds3 = ds_create "gauge" ~min ~max ~mrhb Derive VT_Unknown in
319358

320359
let rrd =
321360
rrd_create [|ds1; ds2; ds3|] [|rra1; rra2; rra3; rra4|] 5L init_time
@@ -339,7 +378,9 @@ let ca_329043_rrd_2 =
339378

340379
let ca_329813_rrd =
341380
let rrd = create_rrd [0L; 5L; 10L] 0. 1. in
342-
let new_ds = ds_create "new!" Derive VT_Unknown in
381+
let new_ds =
382+
ds_create "new!" Derive VT_Unknown ~min:0. ~max:infinity ~mrhb:5.
383+
in
343384
Rrd.rrd_add_ds rrd rrd.last_updated new_ds
344385

345386
let test_ca_322008 () =

ocaml/xcp-rrdd/bin/rrdd/rrdd_monitor.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ let merge_new_dss rrdi dss =
7171
(* SAFETY: verified that these datasources aren't enabled above
7272
already, in a more efficient way than RRD does it *)
7373
rrd_add_ds_unsafe rrd timestamp
74-
(Rrd.ds_create ds.ds_name ds.Ds.ds_type ~mrhb:300.0 Rrd.VT_Unknown)
74+
(Rrd.ds_create ds.ds_name ds.Ds.ds_type ~mrhb:300.0 ~min:ds.ds_min
75+
~max:ds.ds_max Rrd.VT_Unknown
76+
)
7577
)
7678
new_enabled_dss rrdi.rrd
7779
)

ocaml/xcp-rrdd/bin/rrdd/rrdd_server.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,9 @@ let add_ds ~rrdi ~ds_name =
345345
fail_missing ds_name
346346
| Some (timestamp, ds) ->
347347
Rrd.rrd_add_ds rrdi.rrd timestamp
348-
(Rrd.ds_create ds.ds_name ds.ds_type ~mrhb:300.0 Rrd.VT_Unknown)
348+
(Rrd.ds_create ds.ds_name ds.ds_type ~min:ds.ds_min ~max:ds.ds_max
349+
~mrhb:300.0 Rrd.VT_Unknown
350+
)
349351

350352
let add rrds uuid domid ds_name rrdi =
351353
let rrd = add_ds ~rrdi ~ds_name in

0 commit comments

Comments
 (0)