[DTrace-devel] [PATCH 1/2] test: Account for unreliable tick firing

eugene.loh at oracle.com eugene.loh at oracle.com
Tue Jan 11 02:11:34 UTC 2022


From: Eugene Loh <eugene.loh at oracle.com>

As mentioned in commit 3e380b35cbcc "Change trigger for rand() test",
the tick-* probe is unreliable on some kernels, depending on how their
timers subsystem is configured (CONFIG*_HZ*).  Some tests depend on
many probe firings and use tick-* probes.  They are susceptible to
taking unnecessarily long and timing out rather than passing.  Such
intermittent failures have been observed.

Fix tests accordingly.  Specifically, one add bogus-ioctl as a trigger
and then use syscall::ioctl:entry as the probe to fire repeatedly.

For tst.substrminate.d, simply cut down the excessive iteration count.
For the time being, this test XFAILs anyhow.

Add some tick quality-of-service tests to expose the underlying
problem.  For now, mark these tests as "unstable".

Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
 test/unittest/aggs/tst.llquantincr.d          |  7 +--
 test/unittest/aggs/tst.llquantize.d           |  7 +--
 test/unittest/aggs/tst.llquantneg.d           |  9 ++--
 test/unittest/aggs/tst.llquantstep.d          |  7 +--
 test/unittest/funcs/substr/tst.substrminate.d |  4 +-
 test/unittest/speculation/tst.SingleCPU.d     | 21 ++++----
 test/unittest/tick-n/tst.tickquality-100ms.d  | 54 +++++++++++++++++++
 test/unittest/tick-n/tst.tickquality-10ms.d   | 54 +++++++++++++++++++
 8 files changed, 136 insertions(+), 27 deletions(-)
 create mode 100644 test/unittest/tick-n/tst.tickquality-100ms.d
 create mode 100644 test/unittest/tick-n/tst.tickquality-10ms.d

diff --git a/test/unittest/aggs/tst.llquantincr.d b/test/unittest/aggs/tst.llquantincr.d
index 8bc3113c..27755050 100644
--- a/test/unittest/aggs/tst.llquantincr.d
+++ b/test/unittest/aggs/tst.llquantincr.d
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -10,15 +10,16 @@
  *
  * SECTION: Aggregations/Aggregations
  */
+/* @@trigger: bogus-ioctl */
 
 #pragma D option quiet
 
-tick-1ms
+syscall::ioctl:entry
 {
 	@ = llquantize(i++, 10, 0, 6, 20, 2);
 }
 
-tick-1ms
+syscall::ioctl:entry
 /i == 1500/
 {
 	exit(0);
diff --git a/test/unittest/aggs/tst.llquantize.d b/test/unittest/aggs/tst.llquantize.d
index 0080abe3..3161ac97 100644
--- a/test/unittest/aggs/tst.llquantize.d
+++ b/test/unittest/aggs/tst.llquantize.d
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -10,15 +10,16 @@
  *
  * SECTION: Aggregations/Aggregations
  */
+/* @@trigger: bogus-ioctl */
 
 #pragma D option quiet
 
-tick-1ms
+syscall::ioctl:entry
 {
 	@ = llquantize(i++, 10, 0, 6, 20);
 }
 
-tick-1ms
+syscall::ioctl:entry
 /i == 1500/
 {
 	exit(0);
diff --git a/test/unittest/aggs/tst.llquantneg.d b/test/unittest/aggs/tst.llquantneg.d
index 3c69839c..61d6686c 100644
--- a/test/unittest/aggs/tst.llquantneg.d
+++ b/test/unittest/aggs/tst.llquantneg.d
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2022, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -10,22 +10,23 @@
  *
  * SECTION: Aggregations/Aggregations
  */
+/* @@trigger: bogus-ioctl */
 
 #pragma D option quiet
 
-tick-1ms
+syscall::ioctl:entry
 /i % 2 == 0/
 {
 	@ = llquantize(i++, 10, 0, 6, 20);
 }
 
-tick-1ms
+syscall::ioctl:entry
 /i % 2 != 0/
 {
 	@ = llquantize(i++, 10, 0, 6, 20, -1);
 }
 
-tick-1ms
+syscall::ioctl:entry
 /i == 1500/
 {
 	exit(0);
diff --git a/test/unittest/aggs/tst.llquantstep.d b/test/unittest/aggs/tst.llquantstep.d
index 4c055bf0..1420ebe4 100644
--- a/test/unittest/aggs/tst.llquantstep.d
+++ b/test/unittest/aggs/tst.llquantstep.d
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2014, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -11,15 +11,16 @@
  *
  * SECTION: Aggregations/Aggregations
  */
+/* @@trigger: bogus-ioctl */
 
 #pragma D option quiet
 
-tick-1ms
+syscall::ioctl:entry
 {
 	@ = llquantize(i++, 3, 3, 5, 27);
 }
 
-tick-1ms
+syscall::ioctl:entry
 /i == 1500/
 {
 	exit(0);
diff --git a/test/unittest/funcs/substr/tst.substrminate.d b/test/unittest/funcs/substr/tst.substrminate.d
index 94ccfacb..84aa60c7 100644
--- a/test/unittest/funcs/substr/tst.substrminate.d
+++ b/test/unittest/funcs/substr/tst.substrminate.d
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2008, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -15,7 +15,7 @@
  */
 
 tick-1ms
-/i++ > 1000/
+/i++ > 10/
 {
 	exit(0);
 }
diff --git a/test/unittest/speculation/tst.SingleCPU.d b/test/unittest/speculation/tst.SingleCPU.d
index a1cb4612..0a96b47d 100644
--- a/test/unittest/speculation/tst.SingleCPU.d
+++ b/test/unittest/speculation/tst.SingleCPU.d
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2021, 2022, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -10,59 +10,56 @@
  *
  * SECTION: Speculative Tracing
  */
+/* @@trigger: bogus-ioctl */
 
 #pragma D option quiet
 
-/* This test should take only 10s, but is taking much longer than the 10s
-   one would expect (48s here).  Boosting timeout temporarily.  */
-/* @@timeout: 120 */
-
 BEGIN
 {
 	n = 0;
 }
 
 /*
- * Each tick, n is incremented.  Which clause is used rotates modulo 4.
+ * Each firing, n is incremented.  Which clause is used rotates modulo 4.
  *   0: get a specid
  *   1: speculate some output
  *   2: speculate some other output
  *   3: commit (sometimes) or discard (usually)
  */
 
-tick-10ms
+syscall::ioctl:entry
 / (n & 3) == 0 /
 {
 	i = speculation();
 }
 
-tick-10ms
+syscall::ioctl:entry
 / (n & 3) == 1 /
 {
 	speculate(i);
 	printf("%4d %4d", n, i);
 }
 
-tick-10ms
+syscall::ioctl:entry
 / (n & 3) == 2 /
 {
 	speculate(i);
 	printf("%4d hello world\n", n);
 }
 
-tick-10ms
+syscall::ioctl:entry
 / (n & 3) == 3 && (n & 63) == 3 /
 {
 	commit(i);
 }
 
-tick-10ms
+syscall::ioctl:entry
 / (n & 3) == 3 && (n & 63) != 3 /
 {
 	discard(i);
 }
 
-tick-10ms
+syscall::ioctl:entry
 / n++ >= 1000 /
 {
 	exit(0);
diff --git a/test/unittest/tick-n/tst.tickquality-100ms.d b/test/unittest/tick-n/tst.tickquality-100ms.d
new file mode 100644
index 00000000..6407245e
--- /dev/null
+++ b/test/unittest/tick-n/tst.tickquality-100ms.d
@@ -0,0 +1,54 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: tick-* fires with approximately the correct period.
+ *
+ * SECTION: profile Provider/tick-n probes
+ */
+/* @@tags: unstable */
+
+#pragma D option quiet
+
+BEGIN
+{
+	last = timestamp;
+
+	expected = 100 * 1000 * 1000; /* nsecs */
+	low = expected / 2;
+	high = expected * 2;
+	toohigh = expected * 20;
+
+	ntotal = 0;
+	ngood = 0;
+	nbad = 0;
+}
+tick-100msec
+{
+	t = timestamp;
+	delta = t - last;
+	last = t;
+	ntotal++;
+
+	/* delta between low and high is good */
+	ngood += delta < low ? 0 : (delta > high ? 0 : 1);
+
+	/* delta above toohigh is bad */
+	nbad += delta < toohigh ? 0 : 1;
+}
+tick-100msec
+/delta > toohigh/
+{
+	printf("too high:\n%15d (observed)\n%15d (tolerated)\n",
+	   delta, toohigh);
+}
+tick-25sec
+{
+	printf("%d counts; %d good and %d bad\n", ntotal, ngood, nbad);
+	printf("%s\n", nbad ? "ERROR" : "success");
+	exit(nbad != 0);
+}
diff --git a/test/unittest/tick-n/tst.tickquality-10ms.d b/test/unittest/tick-n/tst.tickquality-10ms.d
new file mode 100644
index 00000000..60c90103
--- /dev/null
+++ b/test/unittest/tick-n/tst.tickquality-10ms.d
@@ -0,0 +1,54 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * Licensed under the Universal Permissive License v 1.0 as shown at
+ * http://oss.oracle.com/licenses/upl.
+ */
+
+/*
+ * ASSERTION: tick-* fires with approximately the correct period.
+ *
+ * SECTION: profile Provider/tick-n probes
+ */
+/* @@tags: unstable */
+
+#pragma D option quiet
+
+BEGIN
+{
+	last = timestamp;
+
+	expected = 10 * 1000 * 1000; /* nsecs */
+	low = expected / 2;
+	high = expected * 2;
+	toohigh = expected * 20;
+
+	ntotal = 0;
+	ngood = 0;
+	nbad = 0;
+}
+tick-10msec
+{
+	t = timestamp;
+	delta = t - last;
+	last = t;
+	ntotal++;
+
+	/* delta between low and high is good */
+	ngood += delta < low ? 0 : (delta > high ? 0 : 1);
+
+	/* delta above toohigh is bad */
+	nbad += delta < toohigh ? 0 : 1;
+}
+tick-10msec
+/delta > toohigh/
+{
+	printf("too high:\n%15d (observed)\n%15d (tolerated)\n",
+	   delta, toohigh);
+}
+tick-25sec
+{
+	printf("%d counts; %d good and %d bad\n", ntotal, ngood, nbad);
+	printf("%s\n", nbad ? "ERROR" : "success");
+	exit(nbad != 0);
+}
-- 
2.18.4




More information about the DTrace-devel mailing list