bf0f2a64192b5c80db6ff314a3fa66266976ea8f
braney
  Tue Jun 11 12:57:07 2019 -0700
ongoing work on trackDb caching

diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c
index 08a8f09..21f63de 100644
--- src/hg/lib/hubConnect.c
+++ src/hg/lib/hubConnect.c
@@ -696,47 +696,62 @@
     {
     int dbCount = 0;
     char *dbList = getDbList(tHub, &dbCount);
     // users may include quotes in their hub names requiring escaping
     sqlSafef(query, sizeof(query),
 	"update %s set shortLabel=\"%s\",longLabel=\"%s\",dbCount=\"%d\",dbList=\"%s\",errorMessage=\"\",lastOkTime=now() where id=%d",
 	getHubStatusTableName(), tHub->shortLabel, tHub->longLabel, 
 	dbCount, dbList,
 	hub->id);
     sqlUpdate(conn, query);
     }
 hDisconnectCentral(&conn);
 }
 
 struct trackDb *hubAddTracks(struct hubConnectStatus *hub, char *database)
-/* Load up stuff from data hub and append to list. The hubUrl points to
- * a trackDb.ra format file.  */
+/* Load up stuff from data hub and return list. */
 {
 /* Load trackDb.ra file and make it into proper trackDb tree */
 struct trackDb *tdbList = NULL;
 struct trackHub *trackHub = hub->trackHub;
 
 if (trackHub != NULL)
     {
     struct trackHubGenome *hubGenome = trackHubFindGenome(trackHub, database);
     if (hubGenome != NULL)
 	{
+        boolean doCache = FALSE;
+        if (sameOk(cfgOption("cacheTrackDb"), "on"))
+            doCache = TRUE;
+        if (doCache)
+            {
+            struct trackDb *cacheTdb = trackDbHubCache(hub->hubUrl, hubGenome->name);
+
+            if (cacheTdb != NULL)
+                return cacheTdb;
+
+            memCheckPoint(); // we want to know how much memory is used to build the tdbList
+            }
+
         tdbList = trackHubTracksForGenome(trackHub, hubGenome);
         tdbList = trackDbLinkUpGenerations(tdbList);
         tdbList = trackDbPolishAfterLinkup(tdbList, database);
         trackDbPrioritizeContainerItems(tdbList);
         trackHubPolishTrackNames(trackHub, tdbList);
+
+        if (doCache)
+            trackDbHubCloneTdbListToSharedMem(hub->hubUrl, hubGenome->name, tdbList, memCheckPoint());
 	}
     }
 return tdbList;
 }
 
 static struct grp *grpFromHub(struct hubConnectStatus *hub)
 /* Make up a grp structur from hub */
 {
 struct grp *grp;
 AllocVar(grp);
 char name[16];
 safef(name, sizeof(name), "hub_%d", hub->id);
 grp->name = cloneString(name);
 grp->label = cloneString(hub->trackHub->shortLabel);
 return grp;