36f8f6fb024b20cc523cdf9ebde7491eca84fd7c
markd
  Sun Dec 6 20:33:20 2020 -0800
multiple request per connect works except hgBlat

diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c
index 28a6a51..2254fe8 100644
--- src/hg/hgBlat/hgBlat.c
+++ src/hg/hgBlat/hgBlat.c
@@ -993,60 +993,60 @@
     return;
 int qFactor = 3;
 int tFactor = 3;
 if (gH->isProt)
     qFactor = 1;
 struct gfResult *gfR = NULL;
 for(gfR=gH->gfList; gfR; gfR=gfR->next)
     {
     gfR->qStart = gfR->qStart * qFactor + gfR->qFrame;
     gfR->qEnd   = gfR->qEnd   * qFactor + gfR->qFrame;
     gfR->tStart = gfR->tStart * tFactor + gfR->tFrame;
     gfR->tEnd   = gfR->tEnd   * tFactor + gfR->tFrame;
     }
 }
 
-struct gfConnection *gfConnectEx(char *host, char *port)
+struct gfConnection *gfConnectEx(char *host, char *port, boolean isDynamic)
 /* Try to connect to gfServer */
 {
 if (allGenomes)
-    return gfMayConnect(host, port); // returns NULL on failure
+    return gfMayConnect(host, port, isDynamic); // returns NULL on failure
 else
-    return gfConnect(host, port);  // errAborts on failure.
+    return gfConnect(host, port, isDynamic);  // errAborts on failure.
 }
 
 
 void queryServerFinish(struct genomeHits *gH)
 /* Report results from gfServer. */
 {
 char buf[256];
 int matchCount = 0;
 
-gH->conn = gfConnectEx(gH->host, gH->port);
+gH->conn = gfConnectEx(gH->host, gH->port, gH->isDynamic);
 if (gH->conn == NULL)
     {
     gH->error = TRUE;
     gH->networkErrMsg = "Connection to gfServer failed.";
     return;
     }
 
 dyStringPrintf(gH->dbg,"query strand %s qsize %d<br>\n", gH->queryRC ? "-" : "+", gH->dnaSize);
 
 /* Put together query command. */
 if (gH->isDynamic)
-    safef(buf, sizeof buf, "%s%s %d %s %s", gfSignature(), gH->type, gH->dnaSize,
-          dynServerGenome(gH->db), gH->genomeDataDir);
+    safef(buf, sizeof buf, "%s%s %s %s %d", gfSignature(), gH->type,
+          dynServerGenome(gH->db), gH->genomeDataDir, gH->dnaSize);
 else
     safef(buf, sizeof buf, "%s%s %d", gfSignature(), gH->type, gH->dnaSize);
 mustWriteFd(gH->conn->fd, buf, strlen(buf));
 
 if (read(gH->conn->fd, buf, 1) < 0)
     errAbort("queryServerFinish: read failed: %s", strerror(errno));
 if (buf[0] != 'Y')
     errAbort("Expecting 'Y' from server, got %c", buf[0]);
 mustWriteFd(gH->conn->fd, gH->dna, gH->dnaSize);  // Cannot shifted earlier for speed. must wait for Y confirmation.
 
 if (gH->complex)
     {
     char *s = netRecieveString(gH->conn->fd, buf);
     if (!s)
 	errAbort("expected response from gfServer with tileSize");
@@ -1330,35 +1330,35 @@
     genomeSize += twoBitSeqSize(genome->tbf, index->name);
     }
 
 twoBitClose(&genome->tbf);
 
 return genomeSize;
 }
 
 
 int findGenomeParams(struct serverTable *serve)
 /* Send status message to server arnd report result.
  * Get tileSize stepSize and minMatch.
  */
 {
 char buf[256];
-struct gfConnection *conn = NULL;
 int ret = 0;
 
 /* Put together command. */
-conn = gfConnectEx(serve->host, serve->port);
+// FIXME: need to keep open
+struct gfConnection *conn = gfConnectEx(serve->host, serve->port, serve->isDynamic);
 if (serve->isDynamic)
     sprintf(buf, "%s%s %s %s", gfSignature(), (serve->isTrans ? "transInfo" : "untransInfo"),
             dynServerGenome(serve->db), serve->genomeDataDir);
 else
     sprintf(buf, "%sstatus", gfSignature());
 mustWriteFd(conn->fd, buf, strlen(buf));
 
 for (;;)
     {
     if (netGetString(conn->fd, buf) == NULL)
 	{
 	warn("Error reading status information from %s:%s",serve->host, serve->port);
 	ret = -1;
         break;
 	}
@@ -1630,79 +1630,79 @@
 	warn("Sequence %s would take us over the %d letter limit, stopping here.",
 	     seq->name, maxTotalSize);
 	break;
 	}
 
     if (isTx)
 	{
 	gvo->reportTargetStrand = TRUE;
 	if (isTxTx)
 	    {
 	    if (allGenomes)
 		queryServer(serve->host, serve->port, db, seq, "transQuery", xType, TRUE, FALSE, FALSE, seqNumber,
                             serve->genomeDataDir);
 	    else
 		{
-		conn = gfConnectEx(serve->host, serve->port);
+		conn = gfConnectEx(serve->host, serve->port, serve->isDynamic);
 		gfAlignTransTrans(conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth,
                                   dynServerGenome(serve->db), serve->genomeDataDir);
 		}
 	    if (txTxBoth)
 		{
 		reverseComplement(seq->dna, seq->size);
 		if (allGenomes)
 		    queryServer(serve->host, serve->port, db, seq, "transQuery", xType, TRUE, FALSE, TRUE, seqNumber,
                                      serve->genomeDataDir);
 		else
 		    {
-		    conn = gfConnectEx(serve->host, serve->port);
+		    conn = gfConnectEx(serve->host, serve->port, serve->isDynamic);
 		    gfAlignTransTrans(conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE,
                                       dynServerGenome(serve->db), serve->genomeDataDir);
 		    }
 		}
 	    }
 	else
 	    {
 	    if (allGenomes)
 		queryServer(serve->host, serve->port, db, seq, "protQuery", xType, TRUE, TRUE, FALSE, seqNumber,
                             serve->genomeDataDir);
 	    else
 		{
-		conn = gfConnectEx(serve->host, serve->port);
+		conn = gfConnectEx(serve->host, serve->port, serve->isDynamic);
 		gfAlignTrans(conn, serve->nibDir, seq, 5, tFileCache, gvo,
                              dynServerGenome(serve->db), serve->genomeDataDir);
 		}
 	    }
 	}
     else
 	{
 	if (allGenomes)
 	    queryServer(serve->host, serve->port, db, seq, "query", xType, FALSE, FALSE, FALSE, seqNumber,
                         serve->genomeDataDir);
 	else
 	    {
-	    conn = gfConnectEx(serve->host, serve->port);
+	    conn = gfConnectEx(serve->host, serve->port, serve->isDynamic);
 	    gfAlignStrand(conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo,
                           dynServerGenome(serve->db), serve->genomeDataDir);
 	    }
 	reverseComplement(seq->dna, seq->size);
 	if (allGenomes)
 	    queryServer(serve->host, serve->port, db, seq, "query", xType, FALSE, FALSE, TRUE, seqNumber,
                         serve->genomeDataDir);
 	else
 	    {
-	    conn = gfConnectEx(serve->host, serve->port);
+	    conn = gfConnectEx(serve->host, serve->port, serve->isDynamic);
 	    gfAlignStrand(conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo,
                           dynServerGenome(serve->db), serve->genomeDataDir);
 	    }
 	}
     gfOutputQuery(gvo, f);
     ++seqNumber;
     }
 carefulClose(&f);
 
 if (!allGenomes)
     {
     showAliPlaces(pslTn.forCgi, faTn.forCgi, NULL, serve->db, qType, tType, 
               organism, feelingLucky);
     }