e72cf0100e06d6fadb7282d4e7eb2c592f320951
galt
  Mon Jul 4 13:08:35 2011 -0700
Adding parallel-fetch loading of remote bigDataUrl tracks using pthreads
diff --git src/hg/hgTracks/vcfTrack.c src/hg/hgTracks/vcfTrack.c
index 429a863..5361607 100644
--- src/hg/hgTracks/vcfTrack.c
+++ src/hg/hgTracks/vcfTrack.c
@@ -552,65 +552,75 @@
 tg->lineHeight = tg->heightPer + 1;
 tg->drawItems = vcfHapClusterDraw;
 tg->totalHeight = vcfHapClusterTotalHeight;
 tg->itemHeight = tgFixedItemHeight;
 tg->itemName = vcfHapClusterTrackName;
 tg->mapItemName = vcfHapClusterTrackName;
 tg->itemStart = tgItemNoStart;
 tg->itemEnd = tgItemNoEnd;
 tg->mapsSelf = TRUE;
 tg->extraUiData = vcff;
 }
 
 static void vcfTabixLoadItems(struct track *tg)
 /* Load items in window from VCF file using its tabix index file. */
 {
+char *fileOrUrl = NULL;
+/* Figure out url or file name. */
+if (tg->parallelLoading)
+    {
+    /* do not use mysql uring parallel-fetch load */
+    fileOrUrl = trackDbSetting(tg->tdb, "bigDataUrl");
+    }
+else
+    {
+    // TODO: may need to handle per-chrom files like bam, maybe fold bamFileNameFromTable into this:
 struct sqlConnection *conn = hAllocConnTrack(database, tg->tdb);
-// TODO: may need to handle per-chrom files like bam, maybe fold bamFileNameFromTable into this::
-char *fileOrUrl = bbiNameFromSettingOrTable(tg->tdb, conn, tg->table);
+    fileOrUrl = bbiNameFromSettingOrTable(tg->tdb, conn, tg->table);
 hFreeConn(&conn);
+    }
 int vcfMaxErr = 100;
 struct vcfFile *vcff = NULL;
 /* protect against temporary network error */
 struct errCatch *errCatch = errCatchNew();
 if (errCatchStart(errCatch))
     {
     vcff = vcfTabixFileMayOpen(fileOrUrl, chromName, winStart, winEnd, vcfMaxErr);
-    }
-errCatchEnd(errCatch);
-if (errCatch->gotError)
-    {
-    if (isNotEmpty(errCatch->message->string))
-	tg->networkErrMsg = cloneString(errCatch->message->string);
-    tg->drawItems = bigDrawWarning;
-    tg->totalHeight = bigWarnTotalHeight;
-    }
-errCatchFree(&errCatch);
 if (vcff != NULL)
     {
     if (doHapClusterDisplay && vcff->genotypeCount > 0 && vcff->genotypeCount < 3000 &&
 	(tg->visibility == tvPack || tg->visibility == tvSquish))
 	vcfHapClusterOverloadMethods(tg, vcff);
     else
 	{
 	tg->items = vcfFileToPgSnp(vcff);
 	// pgSnp bases coloring/display decision on count of items:
 	tg->customInt = slCount(tg->items);
 	}
     // Don't vcfFileFree here -- we are using its string pointers!
     }
 }
+errCatchEnd(errCatch);
+if (errCatch->gotError)
+    {
+    if (isNotEmpty(errCatch->message->string))
+	tg->networkErrMsg = cloneString(errCatch->message->string);
+    tg->drawItems = bigDrawWarning;
+    tg->totalHeight = bigWarnTotalHeight;
+    }
+errCatchFree(&errCatch);
+}
 
 void vcfTabixMethods(struct track *track)
 /* Methods for VCF + tabix files. */
 {
 pgSnpMethods(track);
 track->loadItems = vcfTabixLoadItems;
 track->canPack = TRUE;
 }
 
 #else // no USE_TABIX:
 
 // If code was not built with USE_TABIX=1, but there are vcfTabix tracks, display a message
 // in place of the tracks (instead of annoying "No track handler" warning messages).
 
 static void drawUseVcfTabixWarning(struct track *tg, int seqStart, int seqEnd, struct hvGfx *hvg,