From 8032206236b3045526217933cdb76a904888fac0 Mon Sep 17 00:00:00 2001 From: Michael Stack Date: Tue, 28 Sep 2010 05:29:29 +0000 Subject: [PATCH] HBASE-2646 Compaction requests should be prioritized to prevent blocking; remove of hbase-3038 added by mistake git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1002020 13f79535-47bb-0310-9956-ffa450edef68 --- .../wal/SequenceFileLogReader.java | 43 ++++--------------- 1 file changed, 9 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/apache/hadoop/hbase/regionserver/wal/SequenceFileLogReader.java b/src/main/java/org/apache/hadoop/hbase/regionserver/wal/SequenceFileLogReader.java index 114a8ef2ddd..4332f9382b8 100644 --- a/src/main/java/org/apache/hadoop/hbase/regionserver/wal/SequenceFileLogReader.java +++ b/src/main/java/org/apache/hadoop/hbase/regionserver/wal/SequenceFileLogReader.java @@ -20,7 +20,7 @@ package org.apache.hadoop.hbase.regionserver.wal; -import java.io.FilterInputStream; +import java.io.EOFException; import java.io.IOException; import java.lang.Class; import java.lang.reflect.Constructor; @@ -78,43 +78,18 @@ public class SequenceFileLogReader implements HLog.Reader { this.length = l; } - // This section can be confusing. It is specific to how HDFS works. - // Let me try to break it down. This is the problem: - // - // 1. HDFS DataNodes update the NameNode about a filename's length - // on block boundaries or when a file is closed. Therefore, - // if an RS dies, then the NN's fs.getLength() can be out of date - // 2. this.in.available() would work, but it returns int & - // therefore breaks for files > 2GB (happens on big clusters) - // 3. DFSInputStream.getFileLength() gets the actual length from the DNs - // 4. DFSInputStream is wrapped 2 levels deep : this.in.in - // - // So, here we adjust getPos() using getFileLength() so the - // SequenceFile.Reader constructor (aka: first invocation) comes out - // with the correct end of the file: - // this.end = in.getPos() + length; @Override public long getPos() throws IOException { if (this.firstGetPosInvocation) { this.firstGetPosInvocation = false; - long adjust = 0; - - try { - Field fIn = FilterInputStream.class.getDeclaredField("in"); - fIn.setAccessible(true); - Object realIn = fIn.get(this.in); - long realLength = ((Long)realIn.getClass(). - getMethod("getFileLength", new Class []{}). - invoke(realIn, new Object []{})).longValue(); - assert(realLength >= this.length); - adjust = realLength - this.length; - } catch(Exception e) { - SequenceFileLogReader.LOG.warn( - "Error while trying to get accurate file length. " + - "Truncation / data loss may occur if RegionServers die.", e); - } - - return adjust + super.getPos(); + // Tell a lie. We're doing this just so that this line up in + // SequenceFile.Reader constructor comes out with the correct length + // on the file: + // this.end = in.getPos() + length; + long available = this.in.available(); + // Length gets added up in the SF.Reader constructor so subtract the + // difference. If available < this.length, then return this.length. + return available >= this.length? available - this.length: this.length; } return super.getPos(); }