From 7cfb9ff3dc6c0542493a55aa34a99a7804874111 Mon Sep 17 00:00:00 2001 From: aaron Date: Tue, 18 May 2010 19:34:45 +0000 Subject: [PATCH] updates for Tribble 82, fixes for Ryans case where multiple processes would attempt to read/write to the same index, and a couple other Tribble-centric bug fixes. git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@3382 348d0f76-0448-11de-a6fe-93d51630548a --- .../ReferenceOrderedDataSource.java | 10 +- .../refdata/tracks/FeatureReaderTrack.java | 4 + .../builders/TribbleRMDTrackBuilder.java | 95 +++++++++++------- .../sting/utils/file/FSLock.java | 69 +++++++++++++ .../sting/utils/genotype/vcf/VCFReader.java | 37 ++----- .../TribbleRMDTrackBuilderUnitTest.java | 12 ++- settings/repository/org.broad/tribble-80.xml | 3 - .../{tribble-80.jar => tribble-82.jar} | Bin 197063 -> 216505 bytes settings/repository/org.broad/tribble-82.xml | 3 + 9 files changed, 155 insertions(+), 78 deletions(-) create mode 100644 java/src/org/broadinstitute/sting/utils/file/FSLock.java delete mode 100644 settings/repository/org.broad/tribble-80.xml rename settings/repository/org.broad/{tribble-80.jar => tribble-82.jar} (69%) create mode 100644 settings/repository/org.broad/tribble-82.xml diff --git a/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ReferenceOrderedDataSource.java b/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ReferenceOrderedDataSource.java index 55f4d1f3f..cd2880f91 100755 --- a/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ReferenceOrderedDataSource.java +++ b/java/src/org/broadinstitute/sting/gatk/datasources/simpleDataSources/ReferenceOrderedDataSource.java @@ -3,6 +3,7 @@ package org.broadinstitute.sting.gatk.datasources.simpleDataSources; import org.broad.tribble.FeatureReader; import org.broadinstitute.sting.gatk.datasources.shards.Shard; import org.broadinstitute.sting.gatk.refdata.SeekableRODIterator; +import org.broadinstitute.sting.gatk.refdata.tracks.FeatureReaderTrack; import org.broadinstitute.sting.gatk.refdata.tracks.RMDTrack; import org.broadinstitute.sting.gatk.refdata.tracks.builders.TribbleRMDTrackBuilder; import org.broadinstitute.sting.gatk.refdata.utils.FeatureToGATKFeatureIterator; @@ -51,7 +52,7 @@ public class ReferenceOrderedDataSource implements SimpleDataSource { public ReferenceOrderedDataSource( Walker walker, RMDTrack rod) { this.rod = rod; if (rod.supportsQuery()) - iteratorPool = new ReferenceOrderedQueryDataPool(new TribbleRMDTrackBuilder(), rod); + iteratorPool = new ReferenceOrderedQueryDataPool(new TribbleRMDTrackBuilder(), (FeatureReaderTrack)rod); else iteratorPool = new ReferenceOrderedDataPool( walker, rod ); } @@ -186,9 +187,11 @@ class ReferenceOrderedQueryDataPool extends ResourcePool implemen */ @Override public RMDTrack createInstanceOfTrack(Class targetClass, String name, File inputFile) throws RMDTrackCreationException { - // make a feature reader - FeatureReader reader; - reader = createFeatureReader(targetClass, inputFile); // return a feature reader track - return new FeatureReaderTrack(targetClass, name, inputFile, reader); + return new FeatureReaderTrack(targetClass, name, inputFile, createFeatureReader(targetClass, inputFile)); } /** @@ -106,15 +106,8 @@ public class TribbleRMDTrackBuilder extends PluginManager implemen public FeatureReader createFeatureReader(Class targetClass, File inputFile) { FeatureReader reader = null; try { - // check to see if the input file has an index - if (requireIndex(inputFile)) { - logger.warn("Creating Tribble Index for file " + inputFile); - LinearIndex index = createIndex(inputFile, this.createByType(targetClass), true); - reader = new BasicFeatureReader(inputFile,index, this.createByType(targetClass)); - } - else { - reader = new BasicFeatureReader(inputFile,this.createByType(targetClass)); - } + Index index = loadIndex(inputFile, this.createByType(targetClass), true); + reader = new BasicFeatureReader(inputFile.getAbsolutePath(), index, this.createByType(targetClass)); } catch (FileNotFoundException e) { throw new StingException("Unable to create reader with file " + inputFile, e); } catch (IOException e) { @@ -131,38 +124,62 @@ public class TribbleRMDTrackBuilder extends PluginManager implemen * @return a linear index for the specified type * @throws IOException if we cannot write the index file */ - public static LinearIndex createIndex(File inputFile, FeatureCodec codec, boolean onDisk) throws IOException { - LinearIndexCreator create = new LinearIndexCreator(inputFile, codec); - - // if we can write the index, we should, but if not just create it in memory + public static Index loadIndex(File inputFile, FeatureCodec codec, boolean onDisk) throws IOException { + + // our return index + LinearIndex returnIndex = null; + + // create the index file name, locking on the index file name File indexFile = new File(inputFile.getAbsoluteFile() + linearIndexExtension); - if (indexFile.getParentFile().canWrite() && (!indexFile.exists() || indexFile.canWrite()) && onDisk) - return create.createIndex(); - else { - if (onDisk) logger.info("Unable to write to location " + indexFile + " for index file, creating index in memory only"); - return create.createIndex(null); + FSLock lock = new FSLock(indexFile); + + // acquire a lock on the file + boolean obtainedLock = lock.lock(); + try { + // if the file exists, and we can read it, load the index from disk + if (indexFile.exists() && indexFile.canRead() && obtainedLock) { + logger.info("Loading Tribble index from disk for file " + inputFile); + return LinearIndex.createIndex(indexFile); + } + // else we need to create the index, and write it to disk if we can + else + return writeIndexToDisk(inputFile, codec, onDisk, indexFile, obtainedLock); + } + finally { + lock.unlock(); } } /** - * this function checks if we need to make an index file. There are three cases: - * 1. The index file doesn't exist; return true - * 2. The index does exist, but is older than the file. We delete the index and return true - * 3. else return false; - * @param inputFile the target file to make an index for - * @return true if we need to create an index, false otherwise + * attempt to create the index, and to disk + * @param inputFile the input file + * @param codec the codec to use + * @param onDisk if they asked for disk storage or now + * @param indexFile the index file location + * @param obtainedLock did we obtain the lock on the file? + * @return the index object + * @throws IOException */ - public static boolean requireIndex(File inputFile) { - // can we read the index? if not, create an index - File indexFile = new File(inputFile.getAbsolutePath() + linearIndexExtension); - if (!(indexFile.canRead())) return true; - if (inputFile.lastModified() > indexFile.lastModified()) { - logger.warn("Removing out of date (index file date older than target file ) index file " + indexFile); - indexFile.delete(); - return true; + private static LinearIndex writeIndexToDisk(File inputFile, FeatureCodec codec, boolean onDisk, File indexFile, boolean obtainedLock) throws IOException { + LinearIndexCreator create = new LinearIndexCreator(inputFile, codec); + LinearIndex index = create.createIndex(); + + // if the index doesn't exist, and we can write to the directory, and we got a lock, write to the disk + if (indexFile.getParentFile().canWrite() && + (!indexFile.exists() || indexFile.canWrite()) && + onDisk && + obtainedLock) { + logger.info("Creating Tribble Index on disk for file " + inputFile); + index.write(indexFile); + return index; + } + // we can't write it to disk, just store it in memory + else { + // if they wanted to write, let them know we couldn't + if (onDisk) logger.warn("Unable to write to " + indexFile + " for the index file, creating index in memory only"); + return index; } - return false; } } @@ -177,7 +194,7 @@ class FakeTribbleTrack implements FeatureCodec { } @Override - public int headerLineCount(File file) { - return 0; + public int readHeader(LineReader reader) { + return 0; // the basics } } \ No newline at end of file diff --git a/java/src/org/broadinstitute/sting/utils/file/FSLock.java b/java/src/org/broadinstitute/sting/utils/file/FSLock.java new file mode 100644 index 000000000..503b99c6a --- /dev/null +++ b/java/src/org/broadinstitute/sting/utils/file/FSLock.java @@ -0,0 +1,69 @@ +package org.broadinstitute.sting.utils.file; + +import org.broadinstitute.sting.utils.StingException; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; + +/** + * a quick implementation of a file based lock, using the Java NIO classes + */ +public class FSLock { + private static final String lockString = ".lock"; + private final File lockFile; + private FileLock lock = null; + FileChannel fc = null; + + /** + * create a file system, given a base file to which a lock string gets appended. + * @param baseLocation the base file location + */ + public FSLock(File baseLocation) { + lockFile = new File(baseLocation.getAbsoluteFile() + lockString); + lockFile.deleteOnExit(); + } + + /** + * lock the file + * + * @return boolean true if we obtained a lock + */ + public boolean lock() { + if (lock != null) throw new IllegalStateException("Unable to lock on file " + lockFile + " there is already a lock active"); + if (lockFile.exists()) { + System.err.println("exits!!"); + return false; + } + try { + fc = new RandomAccessFile(lockFile,"rw").getChannel(); + lock = fc.lock(); + return lock != null && lock.isValid(); + } catch (FileNotFoundException e) { + throw new StingException("Unable to create lock file named " + lockFile,e); + } catch (IOException e) { + throw new StingException("Unable to create lock file named " + lockFile,e); + } + } + + /** + * unlock the file + * + * note: this allows unlocking a file that failed to lock (no required user checks on null locks). + */ + public void unlock() { + try { + if (lock != null) + lock.release(); + if (fc != null) + fc.close(); + if (lockFile.exists()) + lockFile.delete(); + } catch (IOException e) { + throw new StingException("Unable to create lock file named " + lockFile,e); + } + } +} diff --git a/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFReader.java b/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFReader.java index 109fd0dcc..34180f66b 100644 --- a/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFReader.java +++ b/java/src/org/broadinstitute/sting/utils/genotype/vcf/VCFReader.java @@ -1,32 +1,16 @@ package org.broadinstitute.sting.utils.genotype.vcf; -import java.io.BufferedReader; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.zip.GZIPInputStream; import org.broad.tribble.FeatureReader; -import org.broad.tribble.index.linear.LinearIndex; +import org.broad.tribble.index.Index; import org.broad.tribble.readers.BasicFeatureReader; import org.broad.tribble.vcf.*; import org.broadinstitute.sting.gatk.refdata.tracks.builders.TribbleRMDTrackBuilder; import org.broadinstitute.sting.utils.StingException; -import org.broadinstitute.sting.utils.Utils; /** The VCFReader class, which given a valid vcf file, parses out the header and VCF records */ public class VCFReader implements Iterator, Iterable { @@ -75,10 +59,10 @@ public class VCFReader implements Iterator, Iterable { */ private void initialize(File vcfFile, VCFCodec.LineTransform transform, boolean createIndexOnDisk) { VCFCodec codec = new VCFCodec(); - LinearIndex index = createIndex(vcfFile, createIndexOnDisk); + Index index = createIndex(vcfFile, createIndexOnDisk); if (transform != null) codec.setTransformer(transform); try { - vcfReader = new BasicFeatureReader(vcfFile,index,codec); + vcfReader = new BasicFeatureReader(vcfFile.getAbsolutePath(),index,codec); iterator= vcfReader.iterator(); } catch (FileNotFoundException e) { throw new StingException("Unable to read VCF File from " + vcfFile, e); @@ -94,15 +78,14 @@ public class VCFReader implements Iterator, Iterable { * @param createIndexOnDisk do we create the index on disk (or only in memory?) * @return an instance of an index */ - private LinearIndex createIndex(File vcfFile, boolean createIndexOnDisk) { - LinearIndex index = null; - if (TribbleRMDTrackBuilder.requireIndex(vcfFile)) { - try { - index = TribbleRMDTrackBuilder.createIndex(vcfFile, new VCFCodec(), createIndexOnDisk); - } catch (IOException e) { - throw new StingException("Unable to make required index for file " + vcfFile + " do you have write permissions to the directory?"); - } + private Index createIndex(File vcfFile, boolean createIndexOnDisk) { + Index index = null; + try { + index = TribbleRMDTrackBuilder.loadIndex(vcfFile, new VCFCodec(), createIndexOnDisk); + } catch (IOException e) { + throw new StingException("Unable to make required index for file " + vcfFile + " do you have write permissions to the directory?"); } + return index; } diff --git a/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java b/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java index 0c99bd9f2..f0a272d10 100644 --- a/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java +++ b/java/test/org/broadinstitute/sting/gatk/refdata/tracks/builders/TribbleRMDTrackBuilderUnitTest.java @@ -30,6 +30,7 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.io.EOFException; import java.io.File; import java.io.IOException; import java.util.Map; @@ -59,14 +60,15 @@ public class TribbleRMDTrackBuilderUnitTest extends BaseTest { @Test public void testBuilderIndexUnwriteable() { - File vcfFile = new File(validationDataLocation + "/ROD_validation/mixedup.vcf"); + File vcfFile = new File(validationDataLocation + "/ROD_validation/relic.vcf"); try { - builder.createIndex(vcfFile,new VCFCodec(), true); + builder.loadIndex(vcfFile,new VCFCodec(), true); } catch (IOException e) { - Assert.fail("Unable to make index because of IO exception " + e.getMessage()); + e.printStackTrace(); + Assert.fail("IO exception unexpected" + e.getMessage()); } - // make sure we didn't write the file (check that it's length is zero) - Assert.assertEquals(0,new File(vcfFile + TribbleRMDTrackBuilder.linearIndexExtension).length()); + // make sure we didn't write the file (check that it's timestamp is within bounds) + Assert.assertTrue(Math.abs(1274210993000l - new File(vcfFile + TribbleRMDTrackBuilder.linearIndexExtension).lastModified()) < 100); } } diff --git a/settings/repository/org.broad/tribble-80.xml b/settings/repository/org.broad/tribble-80.xml deleted file mode 100644 index e5bc6a855..000000000 --- a/settings/repository/org.broad/tribble-80.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/settings/repository/org.broad/tribble-80.jar b/settings/repository/org.broad/tribble-82.jar similarity index 69% rename from settings/repository/org.broad/tribble-80.jar rename to settings/repository/org.broad/tribble-82.jar index dba37922ddcc0f2ab973d64163f56ccd1a4fa01e..e274afd047390621b15a35489e66d19bc8a782df 100644 GIT binary patch delta 39273 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 diff --git a/settings/repository/org.broad/tribble-82.xml b/settings/repository/org.broad/tribble-82.xml new file mode 100644 index 000000000..c1a4960bd --- /dev/null +++ b/settings/repository/org.broad/tribble-82.xml @@ -0,0 +1,3 @@ + + +