49208fc971d214da618be9cc0108a2acb7340613 kent Thu Jan 9 21:53:17 2014 -0800 Moving pmSendStringWithRetries and pmHubSingleLineQuery from para application to library, so the edwAnalysisDaemon can use it too. diff --git src/parasol/lib/paraMessage.c src/parasol/lib/paraMessage.c index db0d6e5..eb3b738 100644 --- src/parasol/lib/paraMessage.c +++ src/parasol/lib/paraMessage.c @@ -1,23 +1,24 @@ /* paraMessage - routines to pack and unpack messages in * the parasol system, and also to send them via sockets. */ #include "paraCommon.h" #include "paraLib.h" #include "internet.h" #include "rudp.h" #include "paraMessage.h" +#include "errabort.h" #include "log.h" void pmInit(struct paraMessage *pm, rudpHost ipAddress, bits16 port) /* Initialize message (that might be on stack). ipAddress is in host * order. */ { ZeroVar(pm); pm->ipAddress.sin_family = AF_INET; pm->ipAddress.sin_port = htons(port); pm->ipAddress.sin_addr.s_addr = htonl(ipAddress); } void pmInitFromName(struct paraMessage *pm, char *hostName, bits16 port) /* Initialize message with ascii ip address. */ { @@ -236,15 +237,55 @@ void pmFetchFile(char *host, char *sourceName, char *destName) /* Fetch small file. */ { struct rudp *ru = rudpOpen(); struct paraMessage pm; if (ru != NULL) { pmInitFromName(&pm, host, paraNodePort); pmPrintf(&pm, "fetch %s %s", getUser(), sourceName); if (pmSend(&pm, ru)) pmFetchOpenFile(&pm, ru, destName); rudpClose(&ru); } } +boolean pmSendStringWithRetries(struct paraMessage *pm, struct rudp *ru, char *string) +/* Send out given message strng. Print warning message and return FALSE if + * there is a problem. Try up to 5 times sleeping for 60 seconds in between. + * This is an attempt to help automated processes. */ +{ +int tries = 0; +#define PMSENDSLEEP 60 +#define PMSENDMAXTRIES 5 +boolean result = FALSE; +while (TRUE) + { + result = pmSendString(pm, ru, string); + if (result) + break; + warn("pmSendString timed out!"); + ++tries; + if (tries >= PMSENDMAXTRIES) + break; + warn("pmSendString: will sleep %d seconds and retry", PMSENDSLEEP); + sleep(PMSENDSLEEP); + } +return result; +} + +char *pmHubSingleLineQuery(char *query, char *host) +/* Send message to hub and get single line response. + * This should be freeMem'd when done. */ +{ +struct rudp *ru = rudpMustOpen(); +struct paraMessage pm; + +pmInitFromName(&pm, host, paraHubPort); +if (!pmSendStringWithRetries(&pm, ru, query)) + noWarnAbort(); +if (!pmReceive(&pm, ru)) + noWarnAbort(); +rudpClose(&ru); +return cloneString(pm.data); +} +