diff options
Diffstat (limited to 'qa/src/xlog.c')
-rw-r--r-- | qa/src/xlog.c | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/qa/src/xlog.c b/qa/src/xlog.c new file mode 100644 index 0000000..918c7fe --- /dev/null +++ b/qa/src/xlog.c @@ -0,0 +1,230 @@ +/* + * Copyright (c) 1995-2001 Silicon Graphics, Inc. All Rights Reserved. + */ + +/* + * exercise meta-Data services for an archive + */ + +#include <ctype.h> +#include <pcp/pmapi.h> +#include <pcp/impl.h> + +static int vflag; +static int numpmid; +static pmID pmidlist[20]; +static char *namelist[20]; + +static void +grind(void) +{ + int sts; + int i; + int *instlist; + char **inamelist; + pmDesc desc; + + for (i = 0; i < numpmid; i++) { + if (pmidlist[i] != PM_ID_NULL) { + printf("\npmid: 0x%x name: %s", pmidlist[i], namelist[i]); + if ((sts = pmLookupDesc(pmidlist[i], &desc)) < 0) { + printf("\npmLookupDesc: %s\n", pmErrStr(sts)); + } + else { + printf(" indom: 0x%x", desc.indom); + if (vflag) { + const char *u = pmUnitsStr(&desc.units); + printf("\ndesc: type=%d indom=0x%x sem=%d units=%s", + desc.type, desc.indom, desc.sem, + *u == '\0' ? "none" : u); + } + if (desc.indom == PM_INDOM_NULL) { + printf("\n"); + continue; + } + if (vflag) + putchar('\n'); + if ((sts = pmGetInDomArchive(desc.indom, &instlist, &inamelist)) < 0) { + printf("pmGetInDomArchive: %s\n", pmErrStr(sts)); + } + else { + int j; + int numinst = sts; + char *name; + printf(" numinst: %d\n", numinst); + for (j = 0; j < numinst; j++) { + if (vflag) + printf(" instance id: 0x%x ", instlist[j]); + if ((sts = pmNameInDomArchive(desc.indom, instlist[j], &name)) < 0) { + printf("pmNameInDomArchive: %s\n", pmErrStr(sts)); + } + else { + if (vflag) + printf("%s (== %s?)", name, inamelist[j]); + if ((sts = pmLookupInDomArchive(desc.indom, name)) < 0) { + printf(" pmLookupInDomArchive: %s\n", pmErrStr(sts)); + } + else { + if (sts != instlist[j]) { + printf(" botch: pmLookupInDom returns 0x%x, expected 0x%x\n", + sts, instlist[j]); + } + else if (vflag) + putchar('\n'); + } + free(name); + } + } + free(instlist); + free(inamelist); + } + } + } + } +} + +int +main(int argc, char **argv) +{ + int c; + int sts; + int ctx[2]; + int errflag = 0; + char *archive = "foo"; + char *namespace = PM_NS_DEFAULT; +#ifdef PCP_DEBUG + static char *debug = "[-D N]"; +#else + static char *debug = ""; +#endif + static char *usage = "[-D N] [-a archive] [-n namespace] [-v]"; + int i; + pmLogLabel loglabel; + pmLogLabel duplabel; + + __pmSetProgname(argv[0]); + + while ((c = getopt(argc, argv, "a:D:n:v")) != EOF) { + switch (c) { + + case 'a': /* archive */ + archive = optarg; + break; + +#ifdef PCP_DEBUG + case 'D': /* debug flag */ + sts = __pmParseDebug(optarg); + if (sts < 0) { + fprintf(stderr, "%s: unrecognized debug flag specification (%s)\n", + pmProgname, optarg); + errflag++; + } + else + pmDebug |= sts; + break; +#endif + + case 'n': /* alternative name space file */ + namespace = optarg; + break; + + case 'v': /* verbose output */ + vflag++; + break; + + case '?': + default: + errflag++; + break; + } + } + + if (errflag) { + printf("Usage: %s %s%s\n", pmProgname, debug, usage); + exit(1); + } + + if ((sts = pmLoadNameSpace(namespace)) < 0) { + printf("%s: Cannot load namespace from \"%s\": %s\n", pmProgname, namespace, pmErrStr(sts)); + exit(1); + } + + if ((ctx[0] = pmNewContext(PM_CONTEXT_ARCHIVE, archive)) < 0) { + printf("%s: Cannot connect to archive \"%s\": %s\n", pmProgname, archive, pmErrStr(ctx[0])); + exit(1); + } + if ((sts = pmGetArchiveLabel(&loglabel)) < 0) { + printf("%s: pmGetArchiveLabel(%d): %s\n", pmProgname, ctx[0], pmErrStr(sts)); + exit(1); + } + if ((sts = pmSetMode(PM_MODE_INTERP, &loglabel.ll_start, 5)) < 0) { + printf("%s: pmSetMode: %s\n", pmProgname, pmErrStr(sts)); + exit(1); + } + if ((ctx[1] = pmDupContext()) < 0) { + printf("%s: Cannot dup context: %s\n", pmProgname, pmErrStr(ctx[1])); + exit(1); + } + if ((sts = pmGetArchiveLabel(&duplabel)) < 0) { + printf("%s: pmGetArchiveLabel(%d): %s\n", pmProgname, ctx[1], pmErrStr(sts)); + exit(1); + } + if (loglabel.ll_magic != duplabel.ll_magic || + loglabel.ll_pid != duplabel.ll_pid || + loglabel.ll_start.tv_sec != duplabel.ll_start.tv_sec || + loglabel.ll_start.tv_usec != duplabel.ll_start.tv_usec || + strcmp(loglabel.ll_hostname, duplabel.ll_hostname) != 0 || + strcmp(loglabel.ll_tz, duplabel.ll_tz) != 0) { + printf("Error: pmLogLabel mismatch\n"); + printf("First context: magic=0x%x pid=%" FMT_PID " start=%ld.%06ld\n", + loglabel.ll_magic, loglabel.ll_pid, + (long)loglabel.ll_start.tv_sec, + (long)loglabel.ll_start.tv_usec); + printf("host=%s TZ=%s\n", loglabel.ll_hostname, loglabel.ll_tz); + printf("Error: pmLogLabel mismatch\n"); + printf("Dup context: magic=0x%x pid=%" FMT_PID " start=%ld.%06ld\n", + duplabel.ll_magic, duplabel.ll_pid, + (long)duplabel.ll_start.tv_sec, + (long)duplabel.ll_start.tv_usec); + printf("host=%s TZ=%s\n", duplabel.ll_hostname, duplabel.ll_tz); + exit(1); + } + + /* + * metrics biased towards log "foo" + */ + i = 0; + namelist[i++] = "sample.seconds"; + namelist[i++] = "sample.bin"; + namelist[i++] = "sample.colour"; + namelist[i++] = "sample.drift"; + namelist[i++] = "sample.lights"; + namelist[i++] = "sampledso.milliseconds"; + namelist[i++] = "sampledso.bin"; + numpmid = i; + + + for (c = 0; c < 2; c++) { + printf("\n=== Context %d ===\n", ctx[c]); + pmUseContext(ctx[c]); + __pmDumpContext(stdout, ctx[c], PM_INDOM_NULL); + + pmTrimNameSpace(); + + sts = pmLookupName(numpmid, namelist, pmidlist); + if (sts != numpmid) { + if (sts < 0) + printf("pmLookupName: %s\n", pmErrStr(sts)); + else + printf("pmLookupName: Warning: some metrics unknown\n"); + + for (i = 0; i < numpmid; i++) { + if (pmidlist[i] == PM_ID_NULL) + printf(" %s - not known\n", namelist[i]); + } + } + + grind(); + } + exit(0); +} |