diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /qa/src/torture_logmeta.c | |
download | pcp-47e6e7c84f008a53061e661f31ae96629bc694ef.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'qa/src/torture_logmeta.c')
-rw-r--r-- | qa/src/torture_logmeta.c | 350 |
1 files changed, 350 insertions, 0 deletions
diff --git a/qa/src/torture_logmeta.c b/qa/src/torture_logmeta.c new file mode 100644 index 0000000..0e74f20 --- /dev/null +++ b/qa/src/torture_logmeta.c @@ -0,0 +1,350 @@ +/* + * Copyright (c) 1995-2001 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2011 Ken McDonell. All Rights Reserved. + */ + +#include <pcp/pmapi.h> +#include <pcp/impl.h> + +int +main(int argc, char **argv) +{ + int c; + int i; + int sts = 0; /* pander to gcc */ + int fault = 0; + int errflag = 0; + char *offset = NULL; + pmLogLabel label; /* get hostname for archives */ + int tzh; /* initial timezone handle */ + char local[MAXHOSTNAMELEN]; + char *endnum; + struct timeval startTime; + struct timeval endTime; + struct timeval appStart; + struct timeval appEnd; + struct timeval appOffset; + int *instlist; + char **namelist; + char *name; + int xinst = -1; + char *xname = NULL; + char *xxname = NULL; + pmInDom indom[3]; /* null, good, bad */ + + /* trim cmd name of leading directory components */ + __pmSetProgname(argv[0]); + + while ((c = getopt(argc, argv, "fD:O:?")) != EOF) { + switch (c) { + + 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; + + case 'f': /* fault injection mode */ + fault = 1; + break; + + case 'O': /* sample offset time */ + offset = optarg; + break; + + case '?': + default: + errflag++; + break; + } + } + + if (errflag || optind != argc-4) { + fprintf(stderr, +"Usage: %s [options] archive domain good-serial bad-serial\n\ +\n\ +Options:\n\ + -f fault injection mode ... only do good archive ops\n\ + -O offset initial offset into the time window\n", + pmProgname); + exit(1); + } + indom[0] = PM_INDOM_NULL; + indom[1] = pmInDom_build(atoi(argv[optind+1]), atoi(argv[optind+2])); + indom[2] = pmInDom_build(atoi(argv[optind+1]), atoi(argv[optind+3])); + + /* + * once per context type ... invalid, localhost, archive + */ + for (c = 0; c < 3; c++) { + if (fault && c != 2) + continue; + if (c == 0) { + /* invalid context, none created yet */ + sts = -1; + } + else if (c == 1) { + /* pmcd on localhost */ + (void)gethostname(local, MAXHOSTNAMELEN); + local[MAXHOSTNAMELEN-1] = '\0'; + if ((sts = pmNewContext(PM_CONTEXT_HOST, local)) < 0) { + fprintf(stderr, "%s: Cannot connect to PMCD on host \"%s\": %s\n", + pmProgname, local, pmErrStr(sts)); + exit(1); + } + } + else if (c == 2) { + if ((sts = pmNewContext(PM_CONTEXT_ARCHIVE, argv[optind])) < 0) { + fprintf(stderr, "%s: Cannot open archive \"%s\": %s\n", + pmProgname, argv[optind], pmErrStr(sts)); + exit(1); + } + } + fprintf(stderr, "\n=== iteration %d context %d ===\n", c, sts); + + if (c == 2) { + if ((sts = pmGetArchiveLabel(&label)) < 0) { + fprintf(stderr, "%s: Cannot get archive label record: %s\n", + pmProgname, pmErrStr(sts)); + exit(1); + } + startTime = label.ll_start; + if ((sts = pmGetArchiveEnd(&endTime)) < 0) { + fprintf(stderr, "%s: Cannot locate end of archive: %s\n", + pmProgname, pmErrStr(sts)); + exit(1); + } + if ((tzh = pmNewContextZone()) < 0) { + fprintf(stderr, "%s: Cannot set context timezone: %s\n", + pmProgname, pmErrStr(tzh)); + exit(1); + } + sts = pmParseTimeWindow(NULL, NULL, NULL, offset, &startTime, + &endTime, &appStart, &appEnd, &appOffset, + &endnum); + if (sts < 0) { + fprintf(stderr, "%s: illegal time window specification\n%s", + pmProgname, endnum); + exit(1); + } + if ((sts = pmSetMode(PM_MODE_FORW, &appOffset, 0)) < 0) { + fprintf(stderr, "%s: pmSetMode: %s\n", + pmProgname, pmErrStr(sts)); + exit(1); + } + } + + /* + * routines to be tested ... + * + * PMAPI + * [y] pmGetInDomArchive + * [y] pmLookupInDomArchive + * [y] pmNameInDomArchive + * + * internal + * [ ] __pmLogPutDesc + * [ ] __pmLogPutInDom + * [ ] __pmLogPutIndex + * [ ] __pmLogLookupDesc + * [y] __pmLogGetInDom + * [y] __pmLogLookupInDom + * [y] __pmLogNameInDom + */ + + /* once per indom ... null, good and bad */ + for (i = 0; i < 3; i++) { + if (fault && i != 1) + continue; + if (i == 0) { + /* tests that do not use the indom ... */ + ; + } + + if ((sts = pmGetInDomArchive(indom[i], &instlist, &namelist)) < 0) { + fprintf(stderr, "pmGetInDomArchive(%s) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + int j; + fprintf(stderr, "pmGetInDomArchive(%s) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%d\n", sts); + for (j = 0; j < sts; j++) + fprintf(stderr, " [%d] %s\n", instlist[j], namelist[j]); + if (xname == NULL) { + char *q; + xname = strdup(namelist[0]); + for (q = xname; *q; q++) { + if (*q == ' ') { + xxname = strdup(xname); + xxname[q-xname] = '\0'; + break; + } + } + } + free(instlist); + free(namelist); + } + + if (!fault) { + if ((sts = pmLookupInDomArchive(indom[i], "foobar")) < 0) { + fprintf(stderr, "pmLookupInDomArchive(%s, foobar) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "pmLookupInDomArchive(%s, foobar) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%d\n", sts); + } + } + + if (xname != NULL) { + if ((sts = pmLookupInDomArchive(indom[i], xname)) < 0) { + fprintf(stderr, "pmLookupInDomArchive(%s, %s) -> ", pmInDomStr(indom[i]), xname); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "pmLookupInDomArchive(%s, %s) -> ", pmInDomStr(indom[i]), xname); + fprintf(stderr, "%d\n", sts); + if (xinst == -1) + xinst = sts; + } + } + + if (xxname != NULL) { + if ((sts = pmLookupInDomArchive(indom[i], xxname)) < 0) { + fprintf(stderr, "pmLookupInDomArchive(%s, %s) -> ", pmInDomStr(indom[i]), xxname); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "pmLookupInDomArchive(%s, %s) -> ", pmInDomStr(indom[i]), xxname); + fprintf(stderr, "%d\n", sts); + } + } + + if (!fault) { + if ((sts = pmNameInDomArchive(indom[i], 1234567, &name)) < 0) { + fprintf(stderr, "pmNameInDomArchive(%s, 1234567) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "pmNameInDomArchive(%s, 1234567) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%s\n", name); + free(name); + } + } + + if (xinst != -1) { + if ((sts = pmNameInDomArchive(indom[i], xinst, &name)) < 0) { + fprintf(stderr, "pmNameInDomArchive(%s, %d) -> ", pmInDomStr(indom[i]), xinst); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "pmNameInDomArchive(%s, %d) -> ", pmInDomStr(indom[i]), xinst); + fprintf(stderr, "%s\n", name); + free(name); + } + } + + if ((sts = pmWhichContext()) >= 0) { + __pmContext *ctxp; + ctxp = __pmHandleToPtr(sts); + if (ctxp != NULL && ctxp->c_archctl != NULL) { + __pmTimeval now; + int iter; + for (iter=0; iter < 2; iter++) { + /* + * use -O time (defaults to start time) on first + * iteration, then half the time between there + * and the end + */ + if (fault && iter != 1) + continue; + if (iter == 0) { + now.tv_sec = appOffset.tv_sec; + now.tv_usec = appOffset.tv_usec; + } + else { + /* + * danger! need to promote arithmetic to 64-bit + * for platforms where tv_sec is 32-bit and + * tv_sec + tv_sec => overflow + */ + now.tv_sec = ((__int64_t)appOffset.tv_sec+(__int64_t)appEnd.tv_sec)/2; + now.tv_usec = ((__int64_t)appOffset.tv_usec+(__int64_t)appEnd.tv_usec)/2; + } + if ((sts = __pmLogGetInDom(ctxp->c_archctl->ac_log, indom[i], &now, &instlist, &namelist)) < 0) { + fprintf(stderr, "__pmLogGetInDom(%s) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + int j; + fprintf(stderr, "__pmLogGetInDom(%s) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%d\n", sts); + for (j = 0; j < sts; j++) + fprintf(stderr, " [%d] %s\n", instlist[j], namelist[j]); + } + if (!fault) { + if ((sts = __pmLogLookupInDom(ctxp->c_archctl->ac_log, indom[i], &now, "foobar")) < 0) { + fprintf(stderr, "__pmLogLookupInDom(%s, foobar) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "__pmLogLookupInDom(%s, foobar) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%d\n", sts); + } + } + if (xname != NULL) { + if ((sts = __pmLogLookupInDom(ctxp->c_archctl->ac_log, indom[i], &now, xname)) < 0) { + fprintf(stderr, "__pmLogLookupInDom(%s, %s) -> ", pmInDomStr(indom[i]), xname); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "__pmLogLookupInDom(%s, %s) -> ", pmInDomStr(indom[i]), xname); + fprintf(stderr, "%d\n", sts); + } + } + if (xxname != NULL) { + if ((sts = __pmLogLookupInDom(ctxp->c_archctl->ac_log, indom[i], &now, xxname)) < 0) { + fprintf(stderr, "__pmLogLookupInDom(%s, %s) -> ", pmInDomStr(indom[i]), xxname); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "__pmLogLookupInDom(%s, %s) -> ", pmInDomStr(indom[i]), xxname); + fprintf(stderr, "%d\n", sts); + } + } + if (!fault) { + if ((sts = __pmLogNameInDom(ctxp->c_archctl->ac_log, indom[i], &now, 1234567, &name)) < 0) { + fprintf(stderr, "__pmLogNameInDom(%s, 1234567) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "__pmLogNameInDom(%s, 1234567) -> ", pmInDomStr(indom[i])); + fprintf(stderr, "%s\n", name); + } + } + if (xinst != -1) { + if ((sts = __pmLogNameInDom(ctxp->c_archctl->ac_log, indom[i], &now, xinst, &name)) < 0) { + fprintf(stderr, "__pmLogNameInDom(%s, %d) -> ", pmInDomStr(indom[i]), xinst); + fprintf(stderr, "%s\n", pmErrStr(sts)); + } + else { + fprintf(stderr, "__pmLogNameInDom(%s, %d) -> ", pmInDomStr(indom[i]), xinst); + fprintf(stderr, "%s\n", name); + } + } + } + } + } + + } + + } + + return 0; +} |