From 2b5232bf3913ab3d9a6d57582a06dd4d5e4b126d Mon Sep 17 00:00:00 2001 From: Ken McDonell 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 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 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 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 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 <$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 <$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 <$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 <$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 <$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 <$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 <$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 <$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 <$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 <$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