From 2c1a7e47336c8f8d14dd6c65d53925a9e0e87c66 Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Mon, 9 Oct 2017 22:23:31 -0400 Subject: [PATCH] xstat: add xstat_*_Wait functions Add the xstat_cm_Wait and xstat_fs_Wait functions and move the code to wait for the xstat data collection to complete from the applications down to the xstat library. This is a non-functional change in anticipation of converting the xstat library and programs to pthreads. Change-Id: Ifd1d6bcda618c89b4ce46e1e64f33b0b30a89a72 Reviewed-on: https://gerrit.openafs.org/12746 Tested-by: BuildBot Reviewed-by: Benjamin Kaduk --- src/afsmonitor/afsmonitor.c | 21 +---------- src/xstat/xstat_cm.c | 73 +++++++++++++++++++++++++++++++++++++ src/xstat/xstat_cm.h | 13 +++++++ src/xstat/xstat_cm_test.c | 46 +---------------------- src/xstat/xstat_fs.c | 73 +++++++++++++++++++++++++++++++++++++ src/xstat/xstat_fs.h | 13 +++++++ src/xstat/xstat_fs_test.c | 46 +---------------------- 7 files changed, 178 insertions(+), 107 deletions(-) diff --git a/src/afsmonitor/afsmonitor.c b/src/afsmonitor/afsmonitor.c index a6a9e97417..6c45843ac7 100644 --- a/src/afsmonitor/afsmonitor.c +++ b/src/afsmonitor/afsmonitor.c @@ -3723,7 +3723,6 @@ afsmon_execute(void) int FSinitFlags = 0; /* flags for xstat_fs_Init */ int CMinitFlags = 0; /* flags for xstat_cm_Init */ int code; /* function return code */ - struct timeval tv; /* time structure */ int i; short index; @@ -3897,24 +3896,8 @@ afsmon_execute(void) /* This part of the code is reached only if the input server is not started * for debugging purposes */ - - /* sleep forever */ - tv.tv_sec = 24 * 60; - tv.tv_usec = 0; - fprintf(stderr, "[ %s ] going to sleep ...\n", rn); - while (1) { - code = IOMGR_Select(0, /*Num fds */ - 0, /*Descriptors ready for reading */ - 0, /*Descriptors ready for writing */ - 0, /*Descriptors with exceptional conditions */ - &tv); /*Timeout structure */ - if (code) { - fprintf(stderr, - "[ %s ] IOMGR_Select() returned non-zero value %d\n", rn, - code); - afsmon_Exit(145); - } - } /* while sleep */ + xstat_cm_Wait(0); /* sleep forever */ + return 0; } diff --git a/src/xstat/xstat_cm.c b/src/xstat/xstat_cm.c index d8600c1244..34fe72c2ce 100644 --- a/src/xstat/xstat_cm.c +++ b/src/xstat/xstat_cm.c @@ -642,3 +642,76 @@ xstat_cm_ForceProbeNow(void) */ return (0); } + +/* + * Wait for the collection to complete. Returns after one cycle if running in + * one-shot mode, otherwise wait for a given amount of time. + * + * Args: + * int sleep_secs : time to wait in seconds when running + * in continuous mode. 0 means wait forever. + * + * Returns: + * 0 on success + */ +int +xstat_cm_Wait(int sleep_secs) +{ + static char rn[] = "xstat_cm_Wait"; /*Routine name */ + int code; + struct timeval tv; /*Time structure */ + + if (xstat_cm_oneShot) { + /* + * One-shot operation; just wait for the collection to be done. + */ + if (xstat_cm_debug) + printf("[%s] Calling LWP_WaitProcess() on event %" AFS_PTR_FMT + "\n", rn, &terminationEvent); + code = LWP_WaitProcess(&terminationEvent); + if (xstat_cm_debug) + printf("[%s] Returned from LWP_WaitProcess()\n", rn); + if (code) { + fprintf(stderr, + "[%s] Error %d encountered by LWP_WaitProcess()\n", + rn, code); + } + } else if (sleep_secs == 0) { + /* Sleep forever. */ + tv.tv_sec = 24 * 60; + tv.tv_usec = 0; + if (xstat_cm_debug) + fprintf(stderr, "[ %s ] going to sleep ...\n", rn); + while (1) { + code = IOMGR_Select(0, /*Num fds */ + 0, /*Descriptors ready for reading */ + 0, /*Descriptors ready for writing */ + 0, /*Descriptors with exceptional conditions */ + &tv); /*Timeout structure */ + if (code) { + fprintf(stderr, + "[ %s ] IOMGR_Select() returned non-zero value %d\n", + rn, code); + break; + } + } + } else { + /* Let's just fall asleep while. */ + if (xstat_cm_debug) + printf + ("xstat_cm service started, main thread sleeping for %d secs.\n", + sleep_secs); + tv.tv_sec = sleep_secs; + tv.tv_usec = 0; + code = IOMGR_Select(0, /*Num fds */ + 0, /*Descriptors ready for reading */ + 0, /*Descriptors ready for writing */ + 0, /*Descriptors with exceptional conditions */ + &tv); /*Timeout structure */ + if (code) + fprintf(stderr, + "[%s] IOMGR_Select() returned non-zero value: %d\n", rn, + code); + } + return code; +} diff --git a/src/xstat/xstat_cm.h b/src/xstat/xstat_cm.h index efbba531c5..cba285e832 100644 --- a/src/xstat/xstat_cm.h +++ b/src/xstat/xstat_cm.h @@ -145,4 +145,17 @@ extern int xstat_cm_Cleanup(int); * with the xstat_cm connection array. */ +extern int xstat_cm_Wait(int sleep_secs); + /* + * Summary: + * Wait for the collection to complete. + * + * Args: + * int sleep_secs : time to wait in seconds when running + * in continuous mode. 0 means wait forever. + * + * Returns: + * 0 on success + */ + #endif /* _xstat_cm_h_ */ diff --git a/src/xstat/xstat_cm_test.c b/src/xstat/xstat_cm_test.c index b284237aa9..c146172390 100644 --- a/src/xstat/xstat_cm_test.c +++ b/src/xstat/xstat_cm_test.c @@ -747,10 +747,7 @@ RunTheTest(struct cmd_syndesc *a_s, void *arock) struct cmd_item *curr_item; /*Current CM cmd line record */ struct sockaddr_in *CMSktArray; /*Cache Manager socket array */ struct hostent *he; /*Host entry */ - struct timeval tv; /*Time structure */ - int sleep_secs; /*Number of seconds to sleep */ int initFlags; /*Flags passed to the init fcn */ - int waitCode; /*Result of LWP_WaitProcess() */ int freq; /*Frequency of polls */ int period; /*Time in minutes of data collection */ @@ -875,47 +872,8 @@ RunTheTest(struct cmd_syndesc *a_s, void *arock) exit(-1); } - if (one_shot) { - /* - * One-shot operation; just wait for the collection to be done. - */ - if (debugging_on) - printf("[%s] Calling LWP_WaitProcess() on event %" AFS_PTR_FMT - "\n", rn, &terminationEvent); - waitCode = LWP_WaitProcess(&terminationEvent); - if (debugging_on) - printf("[%s] Returned from LWP_WaitProcess()\n", rn); - if (waitCode) { - if (debugging_on) - fprintf(stderr, - "[%s] Error %d encountered by LWP_WaitProcess()\n", - rn, waitCode); - } - } else { - /* - * Continuous operation. - */ - sleep_secs = 60 * period; /*length of data collection */ - printf - ("xstat_cm service started, main thread sleeping for %d secs.\n", - sleep_secs); - - /* - * Let's just fall asleep for a while, then we'll clean up. - */ - tv.tv_sec = sleep_secs; - tv.tv_usec = 0; - code = IOMGR_Select(0, /*Num fds */ - 0, /*Descriptors ready for reading */ - 0, /*Descriptors ready for writing */ - 0, /*Descriptors with exceptional conditions */ - &tv); /*Timeout structure */ - if (code) { - fprintf(stderr, - "[%s] IOMGR_Select() returned non-zero value: %d\n", rn, - code); - } - } + /* Wait for the collection complete. */ + xstat_cm_Wait(60 * period); /* * We're all done. Clean up, put the last nail in Rx, then diff --git a/src/xstat/xstat_fs.c b/src/xstat/xstat_fs.c index f588d0f8ce..e4f72b8346 100644 --- a/src/xstat/xstat_fs.c +++ b/src/xstat/xstat_fs.c @@ -840,3 +840,76 @@ xstat_fs_DecodeFullPerfStats(struct fs_stats_FullPerfStats **aout, return 0; #undef DECODE_TV } + +/* + * Wait for the collection to complete. Returns after one cycle if running in + * one-shot mode, otherwise wait for a given amount of time. + * + * Args: + * int sleep_secs : time to wait in seconds when running + * in continuous mode. 0 means wait forever. + * + * Returns: + * 0 on success + */ +int +xstat_fs_Wait(int sleep_secs) +{ + static char rn[] = "xstat_fs_Wait"; /*Routine name */ + int code; + struct timeval tv; /*Time structure */ + + if (xstat_fs_oneShot) { + /* + * One-shot operation; just wait for the collection to be done. + */ + if (xstat_fs_debug) + printf("[%s] Calling LWP_WaitProcess() on event %" AFS_PTR_FMT + "\n", rn, &terminationEvent); + code = LWP_WaitProcess(&terminationEvent); + if (xstat_fs_debug) + printf("[%s] Returned from LWP_WaitProcess()\n", rn); + if (code) { + fprintf(stderr, + "[%s] Error %d encountered by LWP_WaitProcess()\n", + rn, code); + } + } else if (sleep_secs == 0) { + /* Sleep forever. */ + tv.tv_sec = 24 * 60; + tv.tv_usec = 0; + if (xstat_fs_debug) + fprintf(stderr, "[ %s ] going to sleep ...\n", rn); + while (1) { + code = IOMGR_Select(0, /*Num fds */ + 0, /*Descriptors ready for reading */ + 0, /*Descriptors ready for writing */ + 0, /*Descriptors with exceptional conditions */ + &tv); /*Timeout structure */ + if (code) { + fprintf(stderr, + "[ %s ] IOMGR_Select() returned non-zero value %d\n", + rn, code); + break; + } + } + } else { + /* Let's just fall asleep while. */ + if (xstat_fs_debug) + printf + ("xstat_fs service started, main thread sleeping for %d secs.\n", + sleep_secs); + tv.tv_sec = sleep_secs; + tv.tv_usec = 0; + code = IOMGR_Select(0, /*Num fds */ + 0, /*Descriptors ready for reading */ + 0, /*Descriptors ready for writing */ + 0, /*Descriptors with exceptional conditions */ + &tv); /*Timeout structure */ + if (code) + fprintf(stderr, + "[%s] IOMGR_Select() returned non-zero value: %d\n", rn, + code); + } + return code; +} diff --git a/src/xstat/xstat_fs.h b/src/xstat/xstat_fs.h index 6e2b77b858..8ad3882ce5 100644 --- a/src/xstat/xstat_fs.h +++ b/src/xstat/xstat_fs.h @@ -145,6 +145,19 @@ extern int xstat_fs_Cleanup(int); * with the xstat_fs connection array. */ +extern int xstat_fs_Wait(int sleep_secs); + /* + * Summary: + * Wait for the collection to complete. + * + * Args: + * int sleep_secs : time to wait in seconds when running + * in continuous mode. 0 means wait forever. + * + * Returns: + * 0 on success + */ + /* * Decode the full performance statistics collection data. */ diff --git a/src/xstat/xstat_fs_test.c b/src/xstat/xstat_fs_test.c index 853c2121e7..59ec162a40 100644 --- a/src/xstat/xstat_fs_test.c +++ b/src/xstat/xstat_fs_test.c @@ -660,10 +660,7 @@ RunTheTest(struct cmd_syndesc *a_s, void *dummy) struct cmd_item *curr_item; /*Current FS cmd line record */ struct sockaddr_in FSSktArray[20]; /*File Server socket array - FIX! */ struct hostent *he; /*Host entry */ - struct timeval tv; /*Time structure */ - int sleep_secs; /*Number of seconds to sleep */ int initFlags; /*Flags passed to the init fcn */ - int waitCode; /*Result of LWP_WaitProcess() */ int freq; /*Frequency of polls */ int period; /*Time in minutes of data collection */ @@ -772,47 +769,8 @@ RunTheTest(struct cmd_syndesc *a_s, void *dummy) exit(-1); } - if (one_shot) { - /* - * One-shot operation; just wait for the collection to be done. - */ - if (debugging_on) - printf("[%s] Calling LWP_WaitProcess() on event %" AFS_PTR_FMT "\n", rn, - &terminationEvent); - waitCode = LWP_WaitProcess(&terminationEvent); - if (debugging_on) - printf("[%s] Returned from LWP_WaitProcess()\n", rn); - if (waitCode) { - if (debugging_on) - fprintf(stderr, - "[%s] Error %d encountered by LWP_WaitProcess()\n", - rn, waitCode); - } - } else { - /* - * Continuous operation. - */ - sleep_secs = 60 * period; /*length of data collection */ - printf - ("xstat_fs service started, main thread sleeping for %d secs.\n", - sleep_secs); - - /* - * Let's just fall asleep for a while, then we'll clean up. - */ - tv.tv_sec = sleep_secs; - tv.tv_usec = 0; - code = IOMGR_Select(0, /*Num fds */ - 0, /*Descriptors ready for reading */ - 0, /*Descriptors ready for writing */ - 0, /*Descriptors with exceptional conditions */ - &tv); /*Timeout structure */ - if (code) { - fprintf(stderr, - "[%s] IOMGR_Select() returned non-zero value: %d\n", rn, - code); - } - } + /* Wait for the collection complete. */ + xstat_fs_Wait(60 * period); /* * We're all done. Clean up, put the last nail in Rx, then