You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ns...@apache.org on 2011/10/11 04:04:22 UTC
svn commit: r1181387 -
/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java
Author: nspiegelberg
Date: Tue Oct 11 02:04:21 2011
New Revision: 1181387
URL: http://svn.apache.org/viewvc?rev=1181387&view=rev
Log:
apply HBASE 3040: BlockIndex readIndex too slowly in heavy write scenario
Summary:
Applied patches from HBASE 3040.
Test Plan:
going to fire unit tests
DiffCamp Revision: 163501
Reviewed By: kannan
CC: kannan, subbu
Revert Plan:
OK
Modified:
hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java
Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java?rev=1181387&r1=1181386&r2=1181387&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java Tue Oct 11 02:04:21 2011
@@ -23,6 +23,7 @@ import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.DataInputStream;
import java.io.DataOutputStream;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -832,6 +833,16 @@ public class HFile {
return this.inMemory;
}
+ private byte[] readAllIndex(final FSDataInputStream in, final long indexOffset,
+ final int indexSize) throws IOException
+ {
+ byte[] allIndex = new byte[indexSize];
+ in.seek(indexOffset);
+ IOUtils.readFully(in, allIndex, 0, allIndex.length);
+
+ return allIndex;
+ }
+
/**
* Read in the index and file info.
* @return A map of fileinfo data.
@@ -852,16 +863,28 @@ public class HFile {
String clazzName = Bytes.toString(fi.get(FileInfo.COMPARATOR));
this.comparator = getComparator(clazzName);
+ int allIndexSize = (int)(this.fileSize - this.trailer.dataIndexOffset - FixedFileTrailer.trailerSize());
+ byte[] dataAndMetaIndex = readAllIndex(this.istream, this.trailer.dataIndexOffset, allIndexSize);
+
+ ByteArrayInputStream bis = new ByteArrayInputStream(dataAndMetaIndex);
+ DataInputStream dis = new DataInputStream(bis);
+
// Read in the data index.
- this.blockIndex = BlockIndex.readIndex(this.comparator, this.istream,
- this.trailer.dataIndexOffset, this.trailer.dataIndexCount);
+ this.blockIndex =
+ BlockIndex.readIndex(this.comparator, dis, this.trailer.dataIndexCount);
// Read in the metadata index.
if (trailer.metaIndexCount > 0) {
- this.metaIndex = BlockIndex.readIndex(Bytes.BYTES_RAWCOMPARATOR,
- this.istream, this.trailer.metaIndexOffset, trailer.metaIndexCount);
+ this.metaIndex = BlockIndex.readIndex(Bytes.BYTES_RAWCOMPARATOR,
+ dis, this.trailer.metaIndexCount);
}
this.fileInfoLoaded = true;
+
+ if (null != dis)
+ {
+ dis.close();
+ }
+
return fi;
}
@@ -1684,12 +1707,13 @@ public class HFile {
/*
* Read in the index that is at <code>indexOffset</code>
* Must match what was written by writeIndex in the Writer.close.
+ * @param c Comparator to use.
* @param in
- * @param indexOffset
+ * @param indexSize
* @throws IOException
*/
static BlockIndex readIndex(final RawComparator<byte []> c,
- final FSDataInputStream in, final long indexOffset, final int indexSize)
+ DataInputStream in, final int indexSize)
throws IOException {
BlockIndex bi = new BlockIndex(c);
bi.blockOffsets = new long[indexSize];
@@ -1697,9 +1721,8 @@ public class HFile {
bi.blockDataSizes = new int[indexSize];
// If index size is zero, no index was written.
if (indexSize > 0) {
- in.seek(indexOffset);
byte [] magic = new byte[INDEXBLOCKMAGIC.length];
- IOUtils.readFully(in, magic, 0, magic.length);
+ in.readFully(magic);
if (!Arrays.equals(magic, INDEXBLOCKMAGIC)) {
throw new IOException("Index block magic is wrong: " +
Arrays.toString(magic));