pcp/SOURCES/redhat-bugzilla-1913782.patch

1085 lines
32 KiB
Diff
Raw Normal View History

2021-02-16 07:42:08 +00:00
From 2b5232bf3913ab3d9a6d57582a06dd4d5e4b126d Mon Sep 17 00:00:00 2001
From: Ken McDonell <kenj@kenj.id.au>
Date: Fri, 4 Sep 2020 16:05:26 +1000
Subject: [PATCH] src/pmlogger/src/fetch.c: improve -Dfetch diagnostics
For most (everyhting except the prologue and epilogue), pmlogger
uses a provide myFetch() routine instead of pmFetch().
This change lifts the pmFetch() -Dfetch diagnostics from libpcp
and splices them into pmlogger, so pmlogger -Dfetch shows all the
pmResults coming back from pmcd.
There is no functional code change in this commit.
---
src/pmlogger/src/fetch.c | 97 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 97 insertions(+)
diff --git a/src/pmlogger/src/fetch.c b/src/pmlogger/src/fetch.c
index 6554698ba..baacb2cd1 100644
--- a/src/pmlogger/src/fetch.c
+++ b/src/pmlogger/src/fetch.c
@@ -52,6 +52,30 @@ myLocalFetch(__pmContext *ctxp, int numpmid, pmID pmidlist[], __pmPDU **pdup)
return __pmEncodeResult(0, result, pdup);
}
+/*
+ * from libpcp/src/p_result.c ... used for -Dfetch output
+ */
+typedef struct {
+ pmID pmid;
+ int numval; /* no. of vlist els to follow, or error */
+ int valfmt; /* insitu or pointer */
+ __pmValue_PDU vlist[1]; /* zero or more */
+} vlist_t;
+typedef struct {
+ __pmPDUHdr hdr;
+ pmTimeval timestamp; /* when returned */
+ int numpmid; /* no. of PMIDs to follow */
+ __pmPDU data[1]; /* zero or more */
+} result_t;
+/*
+ * from libpcp/src/internal.h ... used for -Dfetch output
+ */
+#ifdef HAVE_NETWORK_BYTEORDER
+#define __ntohpmID(a) (a)
+#else
+#define __ntohpmID(a) htonl(a)
+#endif
+
int
myFetch(int numpmid, pmID pmidlist[], __pmPDU **pdup)
{
@@ -131,6 +155,76 @@ myFetch(int numpmid, pmID pmidlist[], __pmPDU **pdup)
* < 0 (local error or IPC problem)
* other (bogus PDU)
*/
+
+ if (pmDebugOptions.fetch) {
+ fprintf(stderr, "myFetch returns ...\n");
+ if (n == PDU_ERROR) {
+ int flag = 0;
+
+ fprintf(stderr, "PMCD state changes: ");
+ if (n & PMCD_AGENT_CHANGE) {
+ fprintf(stderr, "agent(s)");
+ if (n & PMCD_ADD_AGENT) fprintf(stderr, " added");
+ if (n & PMCD_RESTART_AGENT) fprintf(stderr, " restarted");
+ if (n & PMCD_DROP_AGENT) fprintf(stderr, " dropped");
+ flag++;
+ }
+ if (n & PMCD_LABEL_CHANGE) {
+ if (flag++)
+ fprintf(stderr, ", ");
+ fprintf(stderr, "label change");
+ }
+ if (n & PMCD_NAMES_CHANGE) {
+ if (flag++)
+ fprintf(stderr, ", ");
+ fprintf(stderr, "names change");
+ }
+ fputc('\n', stderr);
+ }
+ else if (n == PDU_RESULT) {
+ /*
+ * not safe to decode result here, so have to make
+ * do with a shallow dump of the PDU using logic
+ * from libpcp/__pmDecodeResult()
+ */
+ int numpmid;
+ int numval;
+ int i;
+ int vsize;
+ pmID pmid;
+ struct timeval timestamp;
+ char *name;
+ result_t *pp;
+ vlist_t *vlp;
+ pp = (result_t *)pb;
+ /* assume PDU is valid ... it comes from pmcd */
+ numpmid = ntohl(pp->numpmid);
+ timestamp.tv_sec = ntohl(pp->timestamp.tv_sec);
+ timestamp.tv_usec = ntohl(pp->timestamp.tv_usec);
+ fprintf(stderr, "pmResult timestamp: %d.%06d numpmid: %d\n", (int)timestamp.tv_sec, (int)timestamp.tv_usec, numpmid);
+ vsize = 0;
+ for (i = 0; i < numpmid; i++) {
+ vlp = (vlist_t *)&pp->data[vsize/sizeof(__pmPDU)];
+ pmid = __ntohpmID(vlp->pmid);
+ numval = ntohl(vlp->numval);
+ fprintf(stderr, " %s", pmIDStr(pmid));
+ if (pmNameID(pmid, &name) == 0) {
+ fprintf(stderr, " (%s)", name);
+ free(name);
+ }
+ fprintf(stderr, ": numval: %d", numval);
+ if (numval > 0)
+ fprintf(stderr, " valfmt: %d", ntohl(vlp->valfmt));
+ fputc('\n', stderr);
+ vsize += sizeof(vlp->pmid) + sizeof(vlp->numval);
+ if (numval > 0)
+ vsize += sizeof(vlp->valfmt) + ntohl(vlp->numval) * sizeof(__pmValue_PDU);
+ }
+ }
+ else
+ fprintf(stderr, "__pmGetPDU: Error: %s\n", pmErrStr(n));
+ }
+
if (n == PDU_RESULT) {
/*
* Success with a pmResult in a pdubuf.
@@ -240,6 +334,9 @@ myFetch(int numpmid, pmID pmidlist[], __pmPDU **pdup)
}
}
}
+ else {
+ fprintf(stderr, "Error: __pmSendFetch: %s\n", pmErrStr(n));
+ }
if (newlist != NULL)
free(newlist);
}
--
2.29.2
From dc1edae0b8e4bf332dccf824bd9808d5ad81b2d2 Mon Sep 17 00:00:00 2001
From: Ken McDonell <kenj@kenj.id.au>
Date: Fri, 4 Sep 2020 16:09:14 +1000
Subject: [PATCH] src/pmlogger/src/gram.y: fix for repeated metric problem
If we were really lucky and had a pmlogger config like:
.... {
...[A]
metric-a
...[B]
metric-a
}
then metric-a could end up in two fetchctl_t groups, meaning it
would be fetched twice as often as expected, in back-to-back fetches
each time the associated upper-level task was run.
The critical issue is that if the metrics in the [B] group cause
optFetch to split the task's work into two (or more) fetchctl_t
groups, we "lose" track of the first metric-a, and when the second
metric-a is encountered we feed it to optFetch again instead of
skipping it.
This part of the fix ensures that after calling __pmOptFetchAdd() we
then call linkback(tp) to ensure _all_ of the fetchctl_t groups
are linked back to the associated upper level task (tp).
There is also an additional diagnostic here to dump out all of the
fetchctl_t groups after calling __pmOptFetchAdd() when -Doptfetch
and -Ddesperate are in play.
---
src/pmlogger/src/gram.y | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/pmlogger/src/gram.y b/src/pmlogger/src/gram.y
index b31927e52..7e51d2bfe 100644
--- a/src/pmlogger/src/gram.y
+++ b/src/pmlogger/src/gram.y
@@ -549,10 +549,17 @@ activate_cached_metric(const char *name, int index)
skip = 1;
}
+ else if (sts == 1)
+ skip = 1;
}
if (!skip) {
__pmOptFetchAdd(&tp->t_fetch, rqp);
+ linkback(tp);
+ if (pmDebugOptions.optfetch && pmDebugOptions.desperate) {
+ fprintf(stderr, "Task " PRINTF_P_PFX "%p -> t_fetch ...\n", tp);
+ __pmOptFetchDump(stderr, tp->t_fetch);
+ }
if ((sts = __pmHashAdd(pmid, (void *)rqp, &pm_hash)) < 0) {
pmsprintf(emess, sizeof(emess), "__pmHashAdd failed "
"for metric \"%s\" ... logging not activated", name);
--
2.29.2
From 824e9ef51a1a85dcb980f281ef7367eb9d200125 Mon Sep 17 00:00:00 2001
From: Ken McDonell <kenj@kenj.id.au>
Date: Fri, 4 Sep 2020 16:20:23 +1000
Subject: [PATCH] src/pmlogger/src/checks.c: fix for repeated metric problem
In this part of the fix, chk_one() and chk_all() are given
a make over.
chk_one() had a small "same group" logic error (benign I think),
but was missing any useful diagnostics.
chk_all() had the useful diagnostics, but the logic was grossly incomplete
(as in missing) ... this in the code
/*TODO, not right!*/
should have been a warning! Arrrgh.
So the routine has been rewritten ... and in so doing now returns 1
correctly for a replicated metric (and no instances specified) in the
same config file logging group, which means we don't call optFetch()
again back in the caller.
---
src/pmlogger/src/checks.c | 122 ++++++++++++++++++++++++++++++--------
1 file changed, 97 insertions(+), 25 deletions(-)
diff --git a/src/pmlogger/src/checks.c b/src/pmlogger/src/checks.c
index 6c3aa4062..e7f3aa5d0 100644
--- a/src/pmlogger/src/checks.c
+++ b/src/pmlogger/src/checks.c
@@ -91,13 +91,36 @@ chk_one(task_t *tp, pmID pmid, int inst)
return 0;
ctp = rqp->r_fetch->f_aux;
- if (ctp == NULL || ctp == tp)
+ if (ctp == NULL)
+ return 0;
+ if (ctp == tp)
/*
* can only happen if same metric+inst appears more than once
* in the same group ... this can never be a conflict
+ * return 1 => skip this one
*/
return 1;
+ if (pmDebugOptions.log) {
+ fprintf(stderr, "chk_one: pmid=%s task=" PRINTF_P_PFX "%p state=%s%s%s%s delta=%d.%06d\n",
+ pmIDStr(pmid), tp,
+ PMLC_GET_INLOG(tp->t_state) ? " " : "N",
+ PMLC_GET_AVAIL(tp->t_state) ? " " : "N",
+ PMLC_GET_MAND(tp->t_state) ? "M" : "A",
+ PMLC_GET_ON(tp->t_state) ? "Y" : "N",
+ (int)tp->t_delta.tv_sec, (int)tp->t_delta.tv_usec);
+ if (ctp == NULL)
+ fprintf(stderr, "compared to: NULL\n");
+ else
+ fprintf(stderr, "compared to: optreq task=" PRINTF_P_PFX "%p state=%s%s%s%s delta=%d.%06d\n",
+ ctp,
+ PMLC_GET_INLOG(ctp->t_state) ? " " : "N",
+ PMLC_GET_AVAIL(ctp->t_state) ? " " : "N",
+ PMLC_GET_MAND(ctp->t_state) ? "M" : "A",
+ PMLC_GET_ON(ctp->t_state) ? "Y" : "N",
+ (int)ctp->t_delta.tv_sec, (int)ctp->t_delta.tv_usec);
+ }
+
if (PMLC_GET_MAND(ctp->t_state)) {
if (PMLC_GET_ON(ctp->t_state)) {
if (PMLC_GET_MAND(tp->t_state) == 0 && PMLC_GET_MAYBE(tp->t_state) == 0) {
@@ -130,37 +153,86 @@ chk_one(task_t *tp, pmID pmid, int inst)
return 0;
}
+/*
+ * like chk_one() but we have to deal with the possibility that numinst
+ * (number of instances in the logging request) is 0 (=> all instances)
+ * in either this task, or some other task
+ */
int
chk_all(task_t *tp, pmID pmid)
{
- optreq_t *rqp;
- task_t *ctp;
+ optreq_t *rqp;
+ task_t *ctp;
+ __pmHashNode *hp;
- rqp = findoptreq(pmid, 0); /*TODO, not right!*/
- if (rqp == NULL)
- return 0;
-
- ctp = rqp->r_fetch->f_aux;
+ for (hp = __pmHashSearch(pmid, &pm_hash); hp != NULL; hp = hp->next) {
+ if (pmid != (pmID)hp->key)
+ continue;
+ rqp = (optreq_t *)hp->data;
+ if (rqp == NULL)
+ continue;
- if (pmDebugOptions.log) {
- fprintf(stderr, "chk_all: pmid=%s task=" PRINTF_P_PFX "%p state=%s%s%s%s delta=%d.%06d\n",
- pmIDStr(pmid), tp,
- PMLC_GET_INLOG(tp->t_state) ? " " : "N",
- PMLC_GET_AVAIL(tp->t_state) ? " " : "N",
- PMLC_GET_MAND(tp->t_state) ? "M" : "A",
- PMLC_GET_ON(tp->t_state) ? "Y" : "N",
- (int)tp->t_delta.tv_sec, (int)tp->t_delta.tv_usec);
+ ctp = rqp->r_fetch->f_aux;
if (ctp == NULL)
- fprintf(stderr, "compared to: NULL\n");
- else
- fprintf(stderr, "compared to: optreq task=" PRINTF_P_PFX "%p state=%s%s%s%s delta=%d.%06d\n",
- ctp,
- PMLC_GET_INLOG(ctp->t_state) ? " " : "N",
- PMLC_GET_AVAIL(ctp->t_state) ? " " : "N",
- PMLC_GET_MAND(ctp->t_state) ? "M" : "A",
- PMLC_GET_ON(ctp->t_state) ? "Y" : "N",
- (int)ctp->t_delta.tv_sec, (int)ctp->t_delta.tv_usec);
+ continue;
+ if (ctp == tp)
+ /*
+ * can only happen if same metric w/o instances appears more
+ * than once in the same group ... this can never be a conflict
+ * return 1 => skip this one
+ */
+ return 1;
+
+ if (pmDebugOptions.log) {
+ fprintf(stderr, "chk_all: pmid=%s task=" PRINTF_P_PFX "%p state=%s%s%s%s delta=%d.%06d\n",
+ pmIDStr(pmid), tp,
+ PMLC_GET_INLOG(tp->t_state) ? " " : "N",
+ PMLC_GET_AVAIL(tp->t_state) ? " " : "N",
+ PMLC_GET_MAND(tp->t_state) ? "M" : "A",
+ PMLC_GET_ON(tp->t_state) ? "Y" : "N",
+ (int)tp->t_delta.tv_sec, (int)tp->t_delta.tv_usec);
+ if (ctp == NULL)
+ fprintf(stderr, "compared to: NULL\n");
+ else
+ fprintf(stderr, "compared to: optreq task=" PRINTF_P_PFX "%p state=%s%s%s%s delta=%d.%06d\n",
+ ctp,
+ PMLC_GET_INLOG(ctp->t_state) ? " " : "N",
+ PMLC_GET_AVAIL(ctp->t_state) ? " " : "N",
+ PMLC_GET_MAND(ctp->t_state) ? "M" : "A",
+ PMLC_GET_ON(ctp->t_state) ? "Y" : "N",
+ (int)ctp->t_delta.tv_sec, (int)ctp->t_delta.tv_usec);
+ }
+
+ if (PMLC_GET_MAND(ctp->t_state)) {
+ if (PMLC_GET_ON(ctp->t_state)) {
+ if (PMLC_GET_MAND(tp->t_state) == 0 && PMLC_GET_MAYBE(tp->t_state) == 0) {
+ if (PMLC_GET_ON(tp->t_state))
+ return -1;
+ else
+ return -2;
+ }
+ }
+ else {
+ if (PMLC_GET_MAND(tp->t_state) == 0 && PMLC_GET_MAYBE(tp->t_state) == 0) {
+ if (PMLC_GET_ON(tp->t_state))
+ return -3;
+ else
+ return -4;
+ }
+ }
+ /*
+ * new mandatory, over-rides the old mandatory
+ */
+ undo(ctp, rqp, PM_IN_NULL);
+ }
+ else {
+ /*
+ * new anything, over-rides the old advisory
+ */
+ undo(ctp, rqp, PM_IN_NULL);
+ }
}
+
return 0;
}
--
2.29.2
From b243df50acecc98f43c477b506dbfc080cc876ee Mon Sep 17 00:00:00 2001
From: Ken McDonell <kenj@kenj.id.au>
Date: Mon, 7 Sep 2020 11:06:30 +1000
Subject: [PATCH] src/pmlogger: couple of corner cases for repeated metrics
Note this is for metrics repeated in the same { ...} logging
control group from the config file.
These ones were exposed by the (new) qa/1273.
---
src/pmlogger/src/checks.c | 26 ++++++++++++++++++++++----
src/pmlogger/src/gram.y | 2 +-
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/src/pmlogger/src/checks.c b/src/pmlogger/src/checks.c
index e7f3aa5d0..5e132dc49 100644
--- a/src/pmlogger/src/checks.c
+++ b/src/pmlogger/src/checks.c
@@ -175,13 +175,31 @@ chk_all(task_t *tp, pmID pmid)
ctp = rqp->r_fetch->f_aux;
if (ctp == NULL)
continue;
- if (ctp == tp)
+ if (ctp == tp) {
/*
- * can only happen if same metric w/o instances appears more
- * than once in the same group ... this can never be a conflict
- * return 1 => skip this one
+ * can only happen if same metric appears more than once
+ * in the same group ... this can never be a conflict
+ * return 1 => skip this one, but first we may need to
+ * expand the profile for the existing fetch to include
+ * all instances
*/
+ if (rqp->r_numinst != 0) {
+ indomctl_t *idp;
+ for (idp = rqp->r_fetch->f_idp; idp != (indomctl_t *)0; idp = idp->i_next) {
+ if (idp->i_indom == rqp->r_desc->indom) {
+
+ if (idp->i_numinst > 0) {
+ idp->i_numinst = 0;
+ free(idp->i_instlist);
+ }
+ break;
+ }
+ }
+ rqp->r_numinst = 0;
+ free(rqp->r_instlist);
+ }
return 1;
+ }
if (pmDebugOptions.log) {
fprintf(stderr, "chk_all: pmid=%s task=" PRINTF_P_PFX "%p state=%s%s%s%s delta=%d.%06d\n",
diff --git a/src/pmlogger/src/gram.y b/src/pmlogger/src/gram.y
index 7e51d2bfe..35ef688f5 100644
--- a/src/pmlogger/src/gram.y
+++ b/src/pmlogger/src/gram.y
@@ -536,7 +536,7 @@ activate_cached_metric(const char *name, int index)
else if (sts == 0)
rqp->r_instlist[j++] = inst;
else /* already have this instance */
- skip = 1;
+ rqp->r_numinst--;
}
if (rqp->r_numinst == 0)
skip = 1;
--
2.29.2
From 95a3a5456fefa315270dbfaf93333e597580fb56 Mon Sep 17 00:00:00 2001
From: Ken McDonell <kenj@kenj.id.au>
Date: Mon, 7 Sep 2020 11:10:14 +1000
Subject: [PATCH] qa/1273: (new) exercise corner-cases of the same metric
repeated
"repeated" => appearing more than once in the same { ... } pmlogger
configuration clause.
---
Note: patch to qa/group didn't apply cleanly, added manually
qa/1273 | 193 +++++++++++++++++++++++++
qa/1273.out | 398 ++++++++++++++++++++++++++++++++++++++++++++++++++++
qa/group | 1 +
3 files changed, 592 insertions(+)
create mode 100755 qa/1273
create mode 100644 qa/1273.out
diff --git a/qa/1273 b/qa/1273
new file mode 100755
index 000000000..586995b6e
--- /dev/null
+++ b/qa/1273
@@ -0,0 +1,193 @@
+#!/bin/sh
+# PCP QA Test No. 1273
+# optFetch and pmlogger interraction for repeated metric in a logging
+# group
+#
+# Copyright (c) 2020 Ken McDonell. All Rights Reserved.
+#
+
+seq=`basename $0`
+if [ $# -eq 0 ]
+then
+ echo "QA output created by $seq"
+else
+ echo "QA output created by $seq $*"
+fi
+
+# get standard environment, filters and checks
+. ./common.product
+. ./common.filter
+. ./common.check
+
+_cleanup()
+{
+ cd $here
+ $sudo rm -rf $tmp $tmp.*
+}
+
+status=0 # success is the default!
+$sudo rm -rf $tmp $tmp.* $seq.full
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+_do_it()
+{
+ rm -f $tmp.0 $tmp.meta $tmp.index $tmp.log
+ pmlogger -D optfetch,desperate -l $tmp.log -c $tmp.config -s 2 -t 0.25sec $tmp
+ echo >>$seq.full
+ cat $tmp.config >>$seq.full
+ cat $tmp.log >>$seq.full
+
+ # delete log down to last "Task 0x5608ac112100 -> t_fetch ..." line
+ # then summarize
+ # Fetch Control @ 0x5608ac1127d0: cost=20 state=NEW PMID PROFILE
+ # ...
+ # PMID 60.0.4 Control @ 0x5608ac112810:
+ # ...
+ #
+ line=`$PCP_AWK_PROG <$tmp.log '/ t_fetch/ { print NR }' | tail -1`
+ if [ -z "$line" ]
+ then
+ echo "Arrgh, no t_fetch line in log file ... see $seq.full"
+ else
+ $PCP_AWK_PROG <$tmp.log '
+BEGIN { i = 0 }
+NR < '$line' { next }
+/^Fetch Control / { print "Fetch Control [" i "]"; i++; next }
+$1 == "PMID" { print " " $1,$2; next }'
+ fi
+
+ pmdumplog $tmp "$1" \
+ | _filter_pmdumplog
+}
+
+# real QA test starts here
+echo "sample.bin - simple - sample.bin"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sample.bin
+ simple
+ sample.bin
+}
+End-of-File
+_do_it sample.bin
+
+echo
+echo "sample.bin - simple - disk.dev.read - sample.bin"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sample.bin
+ simple
+ disk.dev.read
+ sample.bin
+}
+End-of-File
+_do_it sample.bin
+
+echo
+echo "sample.bin - simple - disk.dev.read - sampledso.long - sample.bin"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sample.bin
+ simple
+ disk.dev.read
+ sampledso.long
+ sample.bin
+}
+End-of-File
+_do_it sample.bin
+
+echo
+echo "sampledso.long - sample.bin - simple - disk.dev.read - sample.bin"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sampledso.long
+ sample.bin
+ simple
+ disk.dev.read
+ sample.bin
+}
+End-of-File
+_do_it sample.bin
+
+echo
+echo "sample.bin - sampledso.long - simple - disk.dev.read - sample.bin - sampledso.longlong"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sample.bin
+ sampledso.long
+ simple
+ disk.dev.read
+ sample.bin
+ sampledso.longlong
+}
+End-of-File
+_do_it sample.bin
+
+echo
+echo "sample.bin[i1] - simple - sample.bin[i2]"
+echo "i1 and i2 disjoint"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sample.bin["bin-100","bin-300","bin-500"]
+ simple
+ sample.bin["bin-200","bin-400","bin-600"]
+}
+End-of-File
+_do_it sample.bin
+
+echo
+echo "sample.bin[i1] - sampledso.long - simple - disk.dev.read - sample.bin[i2]"
+echo "i1 and i2 disjoint"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sample.bin["bin-100","bin-300","bin-500"]
+ sampledso.long
+ simple
+ disk.dev.read
+ sample.bin["bin-200","bin-400","bin-600"]
+}
+End-of-File
+_do_it sample.bin
+
+echo
+echo "sample.bin[i1] - sampledso.long - simple - disk.dev.read - sample.bin[i2]"
+echo "i1 and i2 overlap"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sample.bin["bin-100","bin-200","bin-300"]
+ sampledso.long
+ simple
+ disk.dev.read
+ sample.bin["bin-200","bin-300","bin-400","bin-500"]
+}
+End-of-File
+_do_it sample.bin
+
+echo
+echo "sample.bin - sampledso.long - simple - disk.dev.read - sample.bin[i2]"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sample.bin
+ sampledso.long
+ simple
+ disk.dev.read
+ sample.bin["bin-200","bin-300","bin-400","bin-500"]
+}
+End-of-File
+_do_it sample.bin
+
+echo
+echo "sample.bin[i1] - sampledso.long - simple - disk.dev.read - sample.bin"
+cat <<End-of-File >$tmp.config
+log mandatory on default {
+ sample.bin["bin-100","bin-200","bin-300"]
+ sampledso.long
+ simple
+ disk.dev.read
+ sample.bin
+}
+End-of-File
+_do_it sample.bin
+
+# success, all done
+exit
diff --git a/qa/1273.out b/qa/1273.out
new file mode 100644
index 000000000..aa5e3c62c
--- /dev/null
+++ b/qa/1273.out
@@ -0,0 +1,398 @@
+QA output created by 1273
+sample.bin - simple - sample.bin
+Fetch Control [0]
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 29.0.6
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+sample.bin - simple - disk.dev.read - sample.bin
+Fetch Control [0]
+ PMID 60.0.4
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 29.0.6
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+sample.bin - simple - disk.dev.read - sampledso.long - sample.bin
+Fetch Control [0]
+ PMID 30.0.104
+ PMID 30.0.103
+ PMID 30.0.14
+ PMID 30.0.13
+ PMID 30.0.12
+ PMID 30.0.11
+ PMID 30.0.10
+Fetch Control [1]
+ PMID 60.0.4
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 29.0.6
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+sampledso.long - sample.bin - simple - disk.dev.read - sample.bin
+Fetch Control [0]
+ PMID 60.0.4
+Fetch Control [1]
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 29.0.6
+ PMID 30.0.104
+ PMID 30.0.103
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 30.0.14
+ PMID 30.0.13
+ PMID 30.0.12
+ PMID 30.0.11
+ PMID 30.0.10
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+sample.bin - sampledso.long - simple - disk.dev.read - sample.bin - sampledso.longlong
+Fetch Control [0]
+ PMID 30.0.110
+ PMID 30.0.109
+ PMID 30.0.24
+ PMID 30.0.23
+ PMID 30.0.22
+ PMID 30.0.21
+ PMID 30.0.20
+ PMID 60.0.4
+Fetch Control [1]
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 30.0.104
+ PMID 30.0.103
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 30.0.14
+ PMID 30.0.13
+ PMID 30.0.12
+ PMID 30.0.11
+ PMID 30.0.10
+ PMID 29.0.6
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+sample.bin[i1] - simple - sample.bin[i2]
+i1 and i2 disjoint
+Fetch Control [0]
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 29.0.6
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+
+sample.bin[i1] - sampledso.long - simple - disk.dev.read - sample.bin[i2]
+i1 and i2 disjoint
+Fetch Control [0]
+ PMID 29.0.6
+ PMID 60.0.4
+Fetch Control [1]
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 30.0.104
+ PMID 30.0.103
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 30.0.14
+ PMID 30.0.13
+ PMID 30.0.12
+ PMID 30.0.11
+ PMID 30.0.10
+ PMID 29.0.6
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [200 or "bin-200"] value 200
+ inst [400 or "bin-400"] value 400
+ inst [600 or "bin-600"] value 600
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [300 or "bin-300"] value 300
+ inst [500 or "bin-500"] value 500
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [200 or "bin-200"] value 200
+ inst [400 or "bin-400"] value 400
+ inst [600 or "bin-600"] value 600
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [300 or "bin-300"] value 300
+ inst [500 or "bin-500"] value 500
+
+sample.bin[i1] - sampledso.long - simple - disk.dev.read - sample.bin[i2]
+i1 and i2 overlap
+Fetch Control [0]
+ PMID 29.0.6
+ PMID 60.0.4
+Fetch Control [1]
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 30.0.104
+ PMID 30.0.103
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 30.0.14
+ PMID 30.0.13
+ PMID 30.0.12
+ PMID 30.0.11
+ PMID 30.0.10
+ PMID 29.0.6
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+
+sample.bin - sampledso.long - simple - disk.dev.read - sample.bin[i2]
+Fetch Control [0]
+ PMID 60.0.4
+Fetch Control [1]
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 30.0.104
+ PMID 30.0.103
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 30.0.14
+ PMID 30.0.13
+ PMID 30.0.12
+ PMID 30.0.11
+ PMID 30.0.10
+ PMID 29.0.6
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+sample.bin[i1] - sampledso.long - simple - disk.dev.read - sample.bin
+Fetch Control [0]
+ PMID 60.0.4
+Fetch Control [1]
+ PMID 253.2.4
+ PMID 253.0.1
+ PMID 30.0.104
+ PMID 30.0.103
+ PMID 253.1.3
+ PMID 253.1.2
+ PMID 253.0.0
+ PMID 30.0.14
+ PMID 30.0.13
+ PMID 30.0.12
+ PMID 30.0.11
+ PMID 30.0.10
+ PMID 29.0.6
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
+
+TIMESTAMP 1 metric
+ 29.0.6 (sample.dupnames.three.bin or sample.dupnames.two.bin or sample.bin):
+ inst [100 or "bin-100"] value 100
+ inst [200 or "bin-200"] value 200
+ inst [300 or "bin-300"] value 300
+ inst [400 or "bin-400"] value 400
+ inst [500 or "bin-500"] value 500
+ inst [600 or "bin-600"] value 600
+ inst [700 or "bin-700"] value 700
+ inst [800 or "bin-800"] value 800
+ inst [900 or "bin-900"] value 900
diff -auNr a/qa/group b/qa/group
--- a/qa/group 2021-01-08 09:49:05.341806489 +1100
+++ b/qa/group 2021-01-08 09:53:14.887828998 +1100
@@ -1634,6 +1634,7 @@
1266 atop pcp local
1267 pmlogrewrite labels help pmdumplog local
1269 libpcp local kernel
+1273 pmlogger fetch local
1274 pmlogextract pmdumplog labels help local sanity
1276 pmmgr containers local
1287 pmda.install pmda.openmetrics local python
--
2.29.2