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);
+}
+