[DTrace-devel] [PATCH] Aggregations are not data-recording actions
eugene.loh at oracle.com
eugene.loh at oracle.com
Tue May 4 15:34:14 PDT 2021
From: Eugene Loh <eugene.loh at oracle.com>
A clause like { @ = count() } should not be data-recording. The
whole point of aggregations is that we should not have to see output
for every probe firing, even if -q/quiet is turned off. Nevertheless,
we still have to vet clauses to make sure that, e.g., a clause does
not combine aggregations and speculation.
The reason this problem was not caught earlier is that testing is
typically done in "quiet" mode.
Add a new DT_CLSFLAG_AGGREGATION and split this case off of
DT_CLSFLAG_DATAREC in clause-flag processing. Add a test for
aggregations that does not use quiet mode.
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_cg.c | 6 +++---
libdtrace/dtrace.h | 1 +
test/unittest/aggs/tst.count_notquiet.d | 21 +++++++++++++++++++++
test/unittest/aggs/tst.count_notquiet.r | 6 ++++++
4 files changed, 31 insertions(+), 3 deletions(-)
create mode 100644 test/unittest/aggs/tst.count_notquiet.d
create mode 100644 test/unittest/aggs/tst.count_notquiet.r
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 797235be..8f33b7ea 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -794,7 +794,7 @@ dt_cg_clsflags(dt_pcb_t *pcb, dtrace_actkind_t kind, const dt_node_t *dnp)
if (*cfp & DT_CLSFLAG_COMMIT)
dnerror(dnp, D_COMM_COMM,
"commit( ) may not follow commit( )\n");
- if (*cfp & DT_CLSFLAG_DATAREC)
+ if (*cfp & (DT_CLSFLAG_DATAREC | DT_CLSFLAG_AGGREGATION))
dnerror(dnp, D_COMM_DREC, "commit( ) may "
"not follow data-recording action(s)\n");
@@ -811,7 +811,7 @@ dt_cg_clsflags(dt_pcb_t *pcb, dtrace_actkind_t kind, const dt_node_t *dnp)
dnerror(dnp, D_SPEC_COMM,
"speculate( ) may not follow commit( )\n");
- if (*cfp & DT_CLSFLAG_DATAREC)
+ if (*cfp & (DT_CLSFLAG_DATAREC | DT_CLSFLAG_AGGREGATION))
dnerror(dnp, D_SPEC_DREC, "speculate( ) may "
"not follow data-recording action(s)\n");
@@ -827,7 +827,7 @@ dt_cg_clsflags(dt_pcb_t *pcb, dtrace_actkind_t kind, const dt_node_t *dnp)
dnerror(dnp, D_AGG_SPEC, "aggregating actions "
"may not follow speculate( )\n");
- *cfp |= DT_CLSFLAG_DATAREC;
+ *cfp |= DT_CLSFLAG_AGGREGATION;
return;
}
diff --git a/libdtrace/dtrace.h b/libdtrace/dtrace.h
index 88c3eeec..ec3730f1 100644
--- a/libdtrace/dtrace.h
+++ b/libdtrace/dtrace.h
@@ -150,6 +150,7 @@ typedef struct dtrace_stmtdesc {
#define DT_CLSFLAG_COMMIT 4 /* commit */
#define DT_CLSFLAG_EXIT 8 /* exit */
#define DT_CLSFLAG_DESTRUCT 16 /* destructive */
+#define DT_CLSFLAG_AGGREGATION 32 /* aggregation */
typedef int dtrace_stmt_f(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,
dtrace_stmtdesc_t *sdp, void *data);
diff --git a/test/unittest/aggs/tst.count_notquiet.d b/test/unittest/aggs/tst.count_notquiet.d
new file mode 100644
index 00000000..a55e3b41
--- /dev/null
+++ b/test/unittest/aggs/tst.count_notquiet.d
@@ -0,0 +1,21 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2021, 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: Aggregations are not data-recording.
+ *
+ * SECTION: Aggregations/Aggregations
+ */
+
+tick-100ms
+{
+ @a = count();
+}
+tick-1005ms
+{
+ exit(0);
+}
diff --git a/test/unittest/aggs/tst.count_notquiet.r b/test/unittest/aggs/tst.count_notquiet.r
new file mode 100644
index 00000000..b6a14daa
--- /dev/null
+++ b/test/unittest/aggs/tst.count_notquiet.r
@@ -0,0 +1,6 @@
+ FUNCTION:NAME
+ :tick-1005ms
+
+ 10
+-- @@stderr --
+dtrace: script 'test/unittest/aggs/tst.count_notquiet.d' matched 2 probes
--
2.18.4
More information about the DTrace-devel
mailing list