2 * Copyright (c) 2012 Red Hat. All Rights Reserved.
3 * Copyright (c) 1997-2001 Silicon Graphics, Inc. All Rights Reserved.
7 * ping pmcd 4 times, kill off pmcd, ping 4 more times, restart pmcd,
8 * ping 4 more times ... and some reconnect attempts for good measure ...
9 * and some more pings ...
10 * sleep 10 seconds after change of state for pmcd
12 * Has to be run as root to control pmcd
16 #include <pcp/pmapi.h>
19 #include "localconfig.h"
21 static pmResult
*_store
;
24 static int *_instlist
;
25 static char **_inamelist
;
27 static int _indom_text
;
34 int pid
= PM_LOG_PRIMARY_PID
;
35 int port
= PM_LOG_NO_PORT
;
37 if ((n
= __pmConnectLogger("localhost", &pid
, &port
)) < 0) {
38 printf("Cannot connect to primary pmlogger on \"localhost\": %s\n", pmErrStr(n
));
55 if ((numinst
= pmGetInDom(_desc
.indom
, &instlist
, &inamelist
)) < 0) {
56 fprintf(stderr
, "pmGetInDom: %s", pmErrStr(numinst
));
58 fprintf(stderr
, " -- error expected\n");
60 fprintf(stderr
, "\n");
71 if ((n
= pmNameInDom(_desc
.indom
, _instlist
[j
], &name
)) < 0) {
72 fprintf(stderr
, "pmNameInDom: %s", pmErrStr(n
));
74 fprintf(stderr
, " -- error expected\n");
76 fprintf(stderr
, "\n");
81 if ((n
= pmLookupInDom(_desc
.indom
, name
)) < 0) {
82 fprintf(stderr
, "pmLookupInDom: %s", pmErrStr(n
));
84 fprintf(stderr
, " -- error expected\n");
86 fprintf(stderr
, "\n");
91 if (n
!= _instlist
[j
]) {
93 fprintf(stderr
, "botch: pmLookupInDom returns 0x%x, expected 0x%x\n",
103 exer(int numpmid
, pmID
*pmidlist
, int xpecterr
)
111 pmResult
*resp
, *lresp
;
113 for (i
= 0; i
< 4; i
++) {
117 if ((n
= pmLookupDesc(pmidlist
[0], &desc
)) < 0) {
118 fprintf(stderr
, "pmLookupDesc: %s", pmErrStr(n
));
120 fprintf(stderr
, " -- error expected\n");
122 fprintf(stderr
, "\n");
129 err
+= x_indom(xpecterr
);
131 if ((n
= pmLookupText(pmidlist
[1], PM_TEXT_HELP
, &buf
)) < 0) {
132 fprintf(stderr
, "pmLookupText: %s", pmErrStr(n
));
134 fprintf(stderr
, " -- error expected\n");
136 fprintf(stderr
, "\n");
144 fprintf(stderr
, "Text: %s\n", buf
);
150 if ((n
= pmLookupInDomText(_desc
.indom
, PM_TEXT_HELP
, &buf
)) < 0) {
151 fprintf(stderr
, "pmLookupInDomText: %s", pmErrStr(n
));
153 fprintf(stderr
, " -- error expected\n");
155 fprintf(stderr
, "\n");
163 fprintf(stderr
, "InDomText: %s\n", buf
);
169 if ((n
= pmFetch(numpmid
, pmidlist
, &resp
)) < 0) {
170 fprintf(stderr
, "pmFetch: %s", pmErrStr(n
));
172 fprintf(stderr
, " -- error expected\n");
174 fprintf(stderr
, "\n");
181 if (resp
->numpmid
!= numpmid
) {
183 __pmDumpResult(stderr
, resp
);
185 else for (j
= 0; j
< resp
->numpmid
; j
++) {
186 if (resp
->vset
[j
]->numval
< 1) {
188 __pmDumpResult(stderr
, resp
);
195 if ((n
= pmStore(_store
)) < 0) {
196 fprintf(stderr
, "pmStore: %s", pmErrStr(n
));
198 fprintf(stderr
, " -- error expected\n");
200 fprintf(stderr
, "\n");
207 if ((n
= __pmControlLog(ctlport
, _store
, PM_LOG_ENQUIRE
, 0, 0, &lresp
)) < 0) {
208 fprintf(stderr
, "__pmControlLog: %s", pmErrStr(n
));
210 fprintf(stderr
, " -- error expected\n");
212 fprintf(stderr
, "\n");
229 main(int argc
, char **argv
)
243 char *binadm
= pmGetConfig("PCP_BINADM_DIR");
244 char path
[MAXPATHLEN
];
246 __pmSetProgname(argv
[0]);
248 while ((c
= getopt(argc
, argv
, "D:")) != EOF
) {
250 case 'D': /* debug flag */
251 sts
= __pmParseDebug(optarg
);
253 fprintf(stderr
, "%s: unrecognized debug flag specification (%s)\n",
270 "Usage: %s options ...\n\
273 -D N set pmDebug debugging flag to N\n",
279 if ((n
= geteuid()) != 0) {
280 fprintf(stderr
, "pmcdgone: Must be run as root, not uid %d!\n", n
);
285 if ((n
= pmLoadNameSpace(PM_NS_DEFAULT
)) < 0) {
286 fprintf(stderr
, "pmLoadNameSpace: %s\n", pmErrStr(n
));
290 if ((ctx0
= pmNewContext(PM_CONTEXT_HOST
, "localhost")) < 0) {
291 fprintf(stderr
, "pmNewContext: %s\n", pmErrStr(ctx0
));
294 if ((ctx1
= pmNewContext(PM_CONTEXT_HOST
, "localhost")) < 0) {
295 fprintf(stderr
, "pmNewContext: %s\n", pmErrStr(ctx1
));
301 namelist
[i
++] = "sample.long.write_me";
302 namelist
[i
++] = "sample.colour";
303 namelist
[i
++] = "sampledso.bin";
305 n
= pmLookupName(numpmid
, namelist
, pmidlist
);
307 fprintf(stderr
, "pmLookupName: %s\n", pmErrStr(n
));
308 for (i
= 0; i
< numpmid
; i
++) {
309 if (pmidlist
[i
] == PM_ID_NULL
)
310 fprintf(stderr
, " %s - not known\n", namelist
[i
]);
314 if ((n
= pmFetch(1, pmidlist
, &_store
)) < 0) {
315 fprintf(stderr
, "initial pmFetch failed: %s\n", pmErrStr(n
));
318 if ((n
= pmLookupDesc(pmidlist
[1], &_desc
)) < 0) {
319 fprintf(stderr
, "initial pmLookupDesc failed: %s\n", pmErrStr(n
));
322 if ((_numinst
= pmGetInDom(_desc
.indom
, &_instlist
, &_inamelist
)) < 0) {
323 fprintf(stderr
, "initial pmGetInDom failed: %s\n", pmErrStr(n
));
327 err
+= exer(numpmid
, pmidlist
, 0);
329 fprintf(stderr
, "Kill off pmcd ...\n");
330 sts
= system(". $PCP_DIR/etc/pcp.env; $PCP_RC_DIR/pcp stop");
332 fprintf(stderr
, "Warning: stop script returns %d\n", sts
);
334 _text
= _indom_text
= 0;
335 __pmCloseSocket(ctlport
);
337 err
+= exer(numpmid
, pmidlist
, 1);
339 for (j
= 0; j
< 2; j
++) {
344 fprintf(stderr
, "Reconnect to pmcd context %d ...\n", i
);
345 if ((n
= pmReconnectContext(i
)) < 0) {
346 fprintf(stderr
, "pmReconnectContext: %s -- error expected\n", pmErrStr(n
));
349 fprintf(stderr
, "pmReconnectContext: success after pmcd killed!?\n");
353 err
+= exer(numpmid
, pmidlist
, 1);
357 * tricky part begins ...
358 * 1. get rid of the archive folio to avoid timestamp clashes with last
361 * 3. wait for pmcd to be accepting connections
362 * 4. wait for pmlogger to be accepting connections from pmlc
363 * 5. connect to pmlogger
365 fprintf(stderr
, "Restart pmcd ...\n");
366 sts
= system(". $PCP_DIR/etc/pcp.env; path_opt=''; if [ $PCP_PLATFORM = linux ]; then path_opt=pmlogger/; fi; pmafm $PCP_LOG_DIR/$path_opt`hostname`/Latest remove 2>/dev/null | sh");
368 fprintf(stderr
, "Warning: folio removal script %d\n", sts
);
369 __pmCloseSocket(ctlport
);
370 sts
= system(". $PCP_DIR/etc/pcp.env; $PCP_RC_DIR/pcp start");
372 fprintf(stderr
, "Warning: stop script returns %d\n", sts
);
374 sprintf(path
, "%s/pmcd_wait", binadm
);
375 if(access(path
, X_OK
) == 0) {
376 sts
= system(". $PCP_DIR/etc/pcp.env; [ -x $PCP_BINADM_DIR/pmcd_wait ] && $PCP_BINADM_DIR/pmcd_wait");
378 fprintf(stderr
, "Warning: pmcd_wait script returns %d\n", sts
);
381 sts
= system(". $PCP_DIR/etc/pcp.env; ( cat common.check; echo _wait_for_pmlogger -P $PCP_LOG_DIR/pmlogger/`hostname`/pmlogger.log ) | sh");
383 fprintf(stderr
, "Warning: _wait_for_pmlogger script returns %d\n", sts
);
386 err
+= exer(numpmid
, pmidlist
, 1);
390 * need to sleep here for at least 1 second so that timestamp of
391 * IPC failure above is more than 1 second ago, so we wait long enough
392 * that pmReconnectContext() really does the connect() attempt, rather
393 * than returning -ETIMEDOUT immediately ... but sleep(1) is unreliable,
398 for (j
= 0; j
< 2; j
++) {
403 fprintf(stderr
, "Reconnect to pmcd context %d ...\n", i
);
404 if ((n
= pmReconnectContext(i
)) < 0) {
405 fprintf(stderr
, "pmReconnectContext: %s\n", pmErrStr(n
));
409 err
+= exer(numpmid
, pmidlist
, 0);
412 fprintf(stderr
, "%d unexpected errors.\n", err
);