HBASE-3040 BlockIndex readIndex too slowly in heavy write scenario; add in fix to address kannan review

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1002310 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Stack 2010-09-28 18:29:53 +00:00
parent d3a8c97ad8
commit 1334d5187b
1 changed files with 6 additions and 37 deletions

View File

@ -830,11 +830,12 @@ public class HFile {
DataInputStream dis = new DataInputStream(bis); DataInputStream dis = new DataInputStream(bis);
// Read in the data index. // Read in the data index.
this.blockIndex = BlockIndex.readIndexEx(this.comparator, dis, this.trailer.dataIndexCount); this.blockIndex =
BlockIndex.readIndex(this.comparator, dis, this.trailer.dataIndexCount);
// Read in the metadata index. // Read in the metadata index.
if (trailer.metaIndexCount > 0) { if (trailer.metaIndexCount > 0) {
this.metaIndex = BlockIndex.readIndexEx(Bytes.BYTES_RAWCOMPARATOR, dis, this.metaIndex = BlockIndex.readIndex(Bytes.BYTES_RAWCOMPARATOR, dis,
this.trailer.metaIndexCount); this.trailer.metaIndexCount);
} }
this.fileInfoLoaded = true; this.fileInfoLoaded = true;
@ -1670,45 +1671,13 @@ public class HFile {
/* /*
* Read in the index that is at <code>indexOffset</code> * Read in the index that is at <code>indexOffset</code>
* Must match what was written by writeIndex in the Writer.close. * Must match what was written by writeIndex in the Writer.close.
* @param c Comparator to use.
* @param in * @param in
* @param indexOffset * @param indexSize
* @throws IOException * @throws IOException
*/ */
static BlockIndex readIndex(final RawComparator<byte []> c, 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];
bi.blockKeys = new byte[indexSize][];
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);
if (!Arrays.equals(magic, INDEXBLOCKMAGIC)) {
throw new IOException("Index block magic is wrong: " +
Arrays.toString(magic));
}
for (int i = 0; i < indexSize; ++i ) {
long offset = in.readLong();
int dataSize = in.readInt();
byte [] key = Bytes.readByteArray(in);
bi.add(key, offset, dataSize);
}
}
return bi;
}
/*
* Read in the index that is at <code>indexOffset</code>
* Must match what was written by writeIndex in the Writer.close.
* @param in
* @param indexOffset
* @throws IOException
*/
static BlockIndex readIndexEx(final RawComparator<byte []> c, DataInputStream in,
final int indexSize)
throws IOException { throws IOException {
BlockIndex bi = new BlockIndex(c); BlockIndex bi = new BlockIndex(c);
bi.blockOffsets = new long[indexSize]; bi.blockOffsets = new long[indexSize];