Author: stack
Date: Wed Sep 9 22:19:22 2009
New Revision: 813138
URL: http://svn.apache.org/viewvc?rev=813138&view=rev
Log:
HBASE-1818 HFile code review and refinement
Modified:
hadoop/hbase/trunk/CHANGES.txt
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/io/hfile/HFile.java
Modified: hadoop/hbase/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=813138&r1=813137&r2=813138&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Wed Sep 9 22:19:22 2009
@@ -34,6 +34,7 @@
HBASE-1800 Too many ZK connections
HBASE-1819 Update to 0.20.1 hadoop and zk 3.2.1
HBASE-1820 Update jruby from 1.2 to 1.3.1
+ HBASE-1818 HFile code review and refinement (Shubert Zhang via Stack)
OPTIMIZATIONS
Modified:
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/io/hfile/HFile.java
URL:
http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/io/hfile/HFile.java?rev=813138&r1=813137&r2=813138&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/io/hfile/HFile.java
(original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/io/hfile/HFile.java Wed
Sep 9 22:19:22 2009
@@ -168,7 +168,7 @@
protected String name;
// Total uncompressed bytes, maybe calculate a compression ratio later.
- private int totalBytes = 0;
+ private long totalBytes = 0;
// Total # of key/value entries, ie: how many times add() was called.
private int entryCount = 0;
@@ -320,13 +320,12 @@
*/
private void finishBlock() throws IOException {
if (this.out == null) return;
- long size = releaseCompressingStream(this.out);
+ int size = releaseCompressingStream(this.out);
this.out = null;
blockKeys.add(firstKey);
- int written = longToInt(size);
blockOffsets.add(Long.valueOf(blockBegin));
- blockDataSizes.add(Integer.valueOf(written));
- this.totalBytes += written;
+ blockDataSizes.add(Integer.valueOf(size));
+ this.totalBytes += size;
}
/*
@@ -335,10 +334,10 @@
*/
private void newBlock() throws IOException {
// This is where the next block begins.
- blockBegin = outputStream.getPos();
+ this.blockBegin = outputStream.getPos();
this.out = getCompressingStream();
this.out.write(DATABLOCKMAGIC);
- firstKey = null;
+ this.firstKey = null;
}
/*
@@ -513,7 +512,7 @@
}
if (this.lastKeyBuffer != null) {
if (this.comparator.compare(this.lastKeyBuffer, this.lastKeyOffset,
- this.lastKeyLength, key, offset, length) > 0) {
+ this.lastKeyLength, key, offset, length) >= 0) {
throw new IOException("Added a key not lexically larger than" +
" previous key=" + Bytes.toString(key, offset, length) +
", lastkey=" + Bytes.toString(this.lastKeyBuffer,
this.lastKeyOffset,
@@ -620,7 +619,7 @@
appendFileInfo(this.fileinfo, FileInfo.AVG_KEY_LEN,
Bytes.toBytes(avgKeyLen), false);
int avgValueLen = this.entryCount == 0? 0:
- (int)(this.keylength/this.entryCount);
+ (int)(this.valuelength/this.entryCount);
appendFileInfo(this.fileinfo, FileInfo.AVG_VALUE_LEN,
Bytes.toBytes(avgValueLen), false);
appendFileInfo(this.fileinfo, FileInfo.COMPARATOR,
@@ -860,7 +859,7 @@
if (trailer.metaIndexCount == 0) {
return null; // there are no meta blocks
}
- if (metaIndex == null) {
+ if ((metaIndex == null) || (metaIndex.count == 0)) {
throw new IOException("Meta index not loaded");
}
byte [] mbname = Bytes.toBytes(metaBlockName);
@@ -876,16 +875,14 @@
ByteBuffer buf = decompress(metaIndex.blockOffsets[block],
longToInt(blockSize), metaIndex.blockDataSizes[block]);
+ if (buf == null)
+ return null;
byte [] magic = new byte[METABLOCKMAGIC.length];
buf.get(magic, 0, magic.length);
if (! Arrays.equals(magic, METABLOCKMAGIC)) {
throw new IOException("Meta magic is bad in block " + block);
}
- // Toss the header. May have to remove later due to performance.
- buf.compact();
- buf.limit(buf.limit() - METABLOCKMAGIC.length);
- buf.rewind();
return buf;
}
/**
@@ -898,7 +895,7 @@
if (blockIndex == null) {
throw new IOException("Block index not loaded");
}
- if (block < 0 || block > blockIndex.count) {
+ if (block < 0 || block >= blockIndex.count) {
throw new IOException("Requested block is out of range: " + block +
", max: " + blockIndex.count);
}
@@ -935,16 +932,15 @@
}
ByteBuffer buf = decompress(blockIndex.blockOffsets[block],
longToInt(onDiskBlockSize), this.blockIndex.blockDataSizes[block]);
+ if (buf == null) {
+ throw new IOException("Decompress block failure " + block);
+ }
byte [] magic = new byte[DATABLOCKMAGIC.length];
buf.get(magic, 0, magic.length);
if (!Arrays.equals(magic, DATABLOCKMAGIC)) {
throw new IOException("Data magic is bad in block " + block);
}
- // Toss the header. May have to remove later due to performance.
- buf.compact();
- buf.limit(buf.limit() - DATABLOCKMAGIC.length);
- buf.rewind();
// Cache the block
if(cacheBlock && cache != null) {
@@ -1249,8 +1245,10 @@
}
if (block != null && currBlock == 0) {
block.rewind();
+ block.position(DATABLOCKMAGIC.length);
currKeyLen = block.getInt();
currValueLen = block.getInt();
+ return true;
}
currBlock = 0;
block = reader.readBlock(currBlock, cacheBlocks);
@@ -1273,6 +1271,7 @@
} else {
// we are already in the same block, just rewind to seek again.
block.rewind();
+ block.position(DATABLOCKMAGIC.length);
}
}
}
@@ -1366,7 +1365,7 @@
}
/*
- * The block index for a RFile.
+ * The block index for a HFile.
* Used reading.
*/
static class BlockIndex implements HeapSize {