http://git-wip-us.apache.org/repos/asf/hbase/blob/ec92a8a7/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.java index 5fe2061..86a3c3d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.java @@ -127,10 +127,7 @@ class FSWALEntry extends Entry { } } - // This has to stay in this order - WALKey key = getKey(); - key.setLogSeqNum(regionSequenceId); - key.setWriteEntry(we); + getKey().setWriteEntry(we); return regionSequenceId; }
http://git-wip-us.apache.org/repos/asf/hbase/blob/ec92a8a7/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogKey.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogKey.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogKey.java index c094ced..7c40323 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogKey.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogKey.java @@ -166,7 +166,7 @@ public class HLogKey extends WALKey implements Writable { this.tablename.getName().length, out, compressionContext.tableDict); } - out.writeLong(this.logSeqNum); + out.writeLong(getSequenceId()); out.writeLong(this.writeTime); // Don't need to write the clusters information as we are using protobufs from 0.95 // Writing only the first clusterId for testing the legacy read @@ -213,7 +213,7 @@ public class HLogKey extends WALKey implements Writable { tablenameBytes = Compressor.readCompressed(in, compressionContext.tableDict); } - this.logSeqNum = in.readLong(); + setSequenceId(in.readLong()); this.writeTime = in.readLong(); this.clusterIds.clear(); http://git-wip-us.apache.org/repos/asf/hbase/blob/ec92a8a7/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALUtil.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALUtil.java index c89a466..f268422 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALUtil.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/WALUtil.java @@ -37,9 +37,9 @@ import org.apache.hadoop.hbase.wal.WALKey; import com.google.protobuf.TextFormat; /** - * Helper methods to ease Region Server integration with the write ahead log. + * Helper methods to ease Region Server integration with the Write Ahead Log (WAL). * Note that methods in this class specifically should not require access to anything - * other than the API found in {@link WAL}. + * other than the API found in {@link WAL}. For internal use only. */ @InterfaceAudience.Private public class WALUtil { @@ -51,86 +51,108 @@ public class WALUtil { /** * Write the marker that a compaction has succeeded and is about to be committed. - * This provides info to the HMaster to allow it to recover the compaction if - * this regionserver dies in the middle (This part is not yet implemented). It also prevents - * the compaction from finishing if this regionserver has already lost its lease on the log. + * This provides info to the HMaster to allow it to recover the compaction if this regionserver + * dies in the middle. It also prevents the compaction from finishing if this regionserver has + * already lost its lease on the log. + * + * <p>This write is for internal use only. Not for external client consumption. * @param mvcc Used by WAL to get sequence Id for the waledit. */ - public static long writeCompactionMarker(WAL wal, HTableDescriptor htd, HRegionInfo hri, + public static WALKey writeCompactionMarker(WAL wal, HTableDescriptor htd, HRegionInfo hri, final CompactionDescriptor c, MultiVersionConcurrencyControl mvcc) throws IOException { - long trx = writeMarker(wal, htd, hri, WALEdit.createCompaction(hri, c), mvcc, true); + WALKey walKey = writeMarker(wal, htd, hri, WALEdit.createCompaction(hri, c), mvcc); if (LOG.isTraceEnabled()) { LOG.trace("Appended compaction marker " + TextFormat.shortDebugString(c)); } - return trx; + return walKey; } /** * Write a flush marker indicating a start / abort or a complete of a region flush + * + * <p>This write is for internal use only. Not for external client consumption. */ - public static long writeFlushMarker(WAL wal, HTableDescriptor htd, HRegionInfo hri, + public static WALKey writeFlushMarker(WAL wal, HTableDescriptor htd, HRegionInfo hri, final FlushDescriptor f, boolean sync, MultiVersionConcurrencyControl mvcc) throws IOException { - long trx = writeMarker(wal, htd, hri, WALEdit.createFlushWALEdit(hri, f), mvcc, sync); + WALKey walKey = + doFullAppendTransaction(wal, htd, hri, WALEdit.createFlushWALEdit(hri, f), mvcc, sync); if (LOG.isTraceEnabled()) { LOG.trace("Appended flush marker " + TextFormat.shortDebugString(f)); } - return trx; + return walKey; } /** - * Write a region open marker indicating that the region is opened + * Write a region open marker indicating that the region is opened. + * This write is for internal use only. Not for external client consumption. */ - public static long writeRegionEventMarker(WAL wal, HTableDescriptor htd, HRegionInfo hri, + public static WALKey writeRegionEventMarker(WAL wal, HTableDescriptor htd, HRegionInfo hri, final RegionEventDescriptor r, final MultiVersionConcurrencyControl mvcc) throws IOException { - long trx = writeMarker(wal, htd, hri, WALEdit.createRegionEventWALEdit(hri, r), mvcc, true); + WALKey walKey = writeMarker(wal, htd, hri, WALEdit.createRegionEventWALEdit(hri, r), mvcc); if (LOG.isTraceEnabled()) { LOG.trace("Appended region event marker " + TextFormat.shortDebugString(r)); } - return trx; + return walKey; } /** * Write a log marker that a bulk load has succeeded and is about to be committed. - * - * @param wal The log to write into. - * @param htd A description of the table that we are bulk loading into. - * @param hri A description of the region in the table that we are bulk loading into. + * This write is for internal use only. Not for external client consumption. + * @param wal The log to write into. + * @param htd A description of the table that we are bulk loading into. + * @param hri A description of the region in the table that we are bulk loading into. * @param desc A protocol buffers based description of the client's bulk loading request - * @return txid of this transaction or if nothing to do, the last txid + * @return walKey with sequenceid filled out for this bulk load marker * @throws IOException We will throw an IOException if we can not append to the HLog. */ - public static long writeBulkLoadMarkerAndSync(final WAL wal, final HTableDescriptor htd, + public static WALKey writeBulkLoadMarkerAndSync(final WAL wal, final HTableDescriptor htd, final HRegionInfo hri, final WALProtos.BulkLoadDescriptor desc, final MultiVersionConcurrencyControl mvcc) throws IOException { - long trx = writeMarker(wal, htd, hri, WALEdit.createBulkLoadEvent(hri, desc), mvcc, true); + WALKey walKey = writeMarker(wal, htd, hri, WALEdit.createBulkLoadEvent(hri, desc), mvcc); if (LOG.isTraceEnabled()) { LOG.trace("Appended Bulk Load marker " + TextFormat.shortDebugString(desc)); } - return trx; + return walKey; } - private static long writeMarker(final WAL wal, final HTableDescriptor htd, final HRegionInfo hri, - final WALEdit edit, final MultiVersionConcurrencyControl mvcc, final boolean sync) + private static WALKey writeMarker(final WAL wal, final HTableDescriptor htd, + final HRegionInfo hri, final WALEdit edit, final MultiVersionConcurrencyControl mvcc) + throws IOException { + // If sync == true in below, then timeout is not used; safe to pass UNSPECIFIED_TIMEOUT + return doFullAppendTransaction(wal, htd, hri, edit, mvcc, true); + } + + /** + * A 'full' WAL transaction involves starting an mvcc transaction followed by an append, + * an optional sync, and then a call to complete the mvcc transaction. This method does it all. + * Good for case of adding a single edit or marker to the WAL. + * + * <p>This write is for internal use only. Not for external client consumption. + * @return WALKey that was added to the WAL. + */ + public static WALKey doFullAppendTransaction(final WAL wal, final HTableDescriptor htd, + final HRegionInfo hri, final WALEdit edit, final MultiVersionConcurrencyControl mvcc, + final boolean sync) throws IOException { // TODO: Pass in current time to use? - WALKey key = - new HLogKey(hri.getEncodedNameAsBytes(), hri.getTable(), System.currentTimeMillis(), mvcc); - // Add it to the log but the false specifies that we don't need to add it to the memstore + WALKey walKey = + new WALKey(hri.getEncodedNameAsBytes(), hri.getTable(), System.currentTimeMillis(), mvcc); long trx = MultiVersionConcurrencyControl.NONE; try { - trx = wal.append(htd, hri, key, edit, false); - if (sync) wal.sync(trx); - } finally { - // If you get hung here, is it a real WAL or a mocked WAL? If the latter, you need to - // trip the latch that is inside in getWriteEntry up in your mock. See down in the append - // called from onEvent in FSHLog. - MultiVersionConcurrencyControl.WriteEntry we = key.getWriteEntry(); - if (mvcc != null && we != null) mvcc.complete(we); + trx = wal.append(htd, hri, walKey, edit, false); + if (sync) { + wal.sync(trx); + } + // Call complete only here because these are markers only. They are not for clients to read. + mvcc.complete(walKey.getWriteEntry()); + } catch (IOException ioe) { + mvcc.complete(walKey.getWriteEntry()); + throw ioe; } - return trx; + return walKey; } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hbase/blob/ec92a8a7/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALKey.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALKey.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALKey.java index 4091a82..09096fe 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALKey.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALKey.java @@ -30,52 +30,50 @@ import java.util.NavigableMap; import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl; -import org.apache.hadoop.hbase.util.ByteStringer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hbase.classification.InterfaceAudience; -import org.apache.hadoop.hbase.exceptions.TimeoutIOException; import org.apache.hadoop.hbase.HBaseInterfaceAudience; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos; import org.apache.hadoop.hbase.protobuf.generated.WALProtos.FamilyScope; import org.apache.hadoop.hbase.protobuf.generated.WALProtos.ScopeType; +import org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl; import org.apache.hadoop.hbase.regionserver.SequenceId; +// imports for things that haven't moved from regionserver.wal yet. +import org.apache.hadoop.hbase.regionserver.wal.CompressionContext; +import org.apache.hadoop.hbase.regionserver.wal.WALCellCodec; +import org.apache.hadoop.hbase.util.ByteStringer; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import com.google.common.annotations.VisibleForTesting; import com.google.protobuf.ByteString; -// imports for things that haven't moved from regionserver.wal yet. -import org.apache.hadoop.hbase.regionserver.wal.CompressionContext; -import org.apache.hadoop.hbase.regionserver.wal.WALCellCodec; - /** - * A Key for an entry in the change log. + * A Key for an entry in the WAL. * * The log intermingles edits to many tables and rows, so each log entry * identifies the appropriate table and row. Within a table and row, they're * also sorted. * - * <p>Some Transactional edits (START, COMMIT, ABORT) will not have an - * associated row. + * <p>Some Transactional edits (START, COMMIT, ABORT) will not have an associated row. * * Note that protected members marked @InterfaceAudience.Private are only protected * to support the legacy HLogKey class, which is in a different package. - * - * <p> */ // TODO: Key and WALEdit are never used separately, or in one-to-many relation, for practical // purposes. They need to be merged into WALEntry. -// TODO: Cleanup. We have logSeqNum and then WriteEntry, both are sequence id'ing. Fix. @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.REPLICATION) public class WALKey implements SequenceId, Comparable<WALKey> { private static final Log LOG = LogFactory.getLog(WALKey.class); + private final CountDownLatch sequenceIdAssignedLatch = new CountDownLatch(1); + /** + * Used to represent when a particular wal key doesn't know/care about the sequence ordering. + */ + public static final long NO_SEQUENCE_ID = -1; @InterfaceAudience.Private // For internal use only. public MultiVersionConcurrencyControl getMvcc() { @@ -83,25 +81,22 @@ public class WALKey implements SequenceId, Comparable<WALKey> { } /** - * Will block until a write entry has been assigned by they WAL subsystem. - * @return A WriteEntry gotten from local WAL subsystem. Must be completed by calling - * {@link MultiVersionConcurrencyControl#complete(MultiVersionConcurrencyControl.WriteEntry)} - * or - * {@link MultiVersionConcurrencyControl#complete(MultiVersionConcurrencyControl.WriteEntry)} + * Use it to complete mvcc transaction. This WALKey was part of + * (the transaction is started when you call append; see the comment on FSHLog#append). To + * complete call + * {@link MultiVersionConcurrencyControl#complete(MultiVersionConcurrencyControl.WriteEntry)} + * or {@link MultiVersionConcurrencyControl#complete(MultiVersionConcurrencyControl.WriteEntry)} + * @return A WriteEntry gotten from local WAL subsystem. * @see #setWriteEntry(MultiVersionConcurrencyControl.WriteEntry) */ @InterfaceAudience.Private // For internal use only. public MultiVersionConcurrencyControl.WriteEntry getWriteEntry() throws InterruptedIOException { try { - this.seqNumAssignedLatch.await(); + this.sequenceIdAssignedLatch.await(); } catch (InterruptedException ie) { - // If interrupted... clear out our entry else we can block up mvcc. MultiVersionConcurrencyControl mvcc = getMvcc(); - LOG.debug("mvcc=" + mvcc + ", writeEntry=" + this.writeEntry); - if (mvcc != null) { - if (this.writeEntry != null) { - mvcc.complete(this.writeEntry); - } + if (LOG.isDebugEnabled()) { + LOG.debug("mvcc=" + mvcc + ", writeEntry=" + this.writeEntry); } InterruptedIOException iie = new InterruptedIOException(); iie.initCause(ie); @@ -112,11 +107,19 @@ public class WALKey implements SequenceId, Comparable<WALKey> { @InterfaceAudience.Private // For internal use only. public void setWriteEntry(MultiVersionConcurrencyControl.WriteEntry writeEntry) { + if (this.writeEntry != null) { + throw new RuntimeException("Non-null!!!"); + } this.writeEntry = writeEntry; - this.seqNumAssignedLatch.countDown(); + // Set our sequenceid now using WriteEntry. + if (this.writeEntry != null) { + this.sequenceId = this.writeEntry.getWriteNumber(); + } + this.sequenceIdAssignedLatch.countDown(); } - // should be < 0 (@see HLogKey#readFields(DataInput)) + // REMOVE!!!! No more Writables!!!! + // Should be < 0 (@see HLogKey#readFields(DataInput)) // version 2 supports WAL compression // public members here are only public because of HLogKey @InterfaceAudience.Private @@ -163,21 +166,23 @@ public class WALKey implements SequenceId, Comparable<WALKey> { @InterfaceAudience.Private protected static final Version VERSION = Version.COMPRESSED; - /** Used to represent when a particular wal key doesn't know/care about the sequence ordering. */ - public static final long NO_SEQUENCE_ID = -1; - - // visible for deprecated HLogKey @InterfaceAudience.Private protected byte [] encodedRegionName; // visible for deprecated HLogKey @InterfaceAudience.Private protected TableName tablename; - // visible for deprecated HLogKey - @InterfaceAudience.Private - protected long logSeqNum; + /** + * SequenceId for this edit. Set post-construction at write-to-WAL time. Until then it is + * NO_SEQUENCE_ID. Change it so multiple threads can read it -- e.g. access is synchronized. + */ + private long sequenceId; + + /** + * Used during WAL replay; the sequenceId of the edit when it came into the system. + */ private long origLogSeqNum = 0; - private CountDownLatch seqNumAssignedLatch = new CountDownLatch(1); + // Time at which this edit was written. // visible for deprecated HLogKey @InterfaceAudience.Private @@ -193,6 +198,9 @@ public class WALKey implements SequenceId, Comparable<WALKey> { private long nonceGroup = HConstants.NO_NONCE; private long nonce = HConstants.NO_NONCE; private MultiVersionConcurrencyControl mvcc; + /** + * Set in a way visible to multiple threads; e.g. synchronized getter/setters. + */ private MultiVersionConcurrencyControl.WriteEntry writeEntry; public static final List<UUID> EMPTY_UUIDS = Collections.unmodifiableList(new ArrayList<UUID>()); @@ -215,10 +223,15 @@ public class WALKey implements SequenceId, Comparable<WALKey> { HConstants.NO_NONCE, HConstants.NO_NONCE, null); } + /** + * @deprecated Remove. Useless. + */ + @Deprecated // REMOVE public WALKey(final byte[] encodedRegionName, final TableName tablename) { this(encodedRegionName, tablename, System.currentTimeMillis()); } + // TODO: Fix being able to pass in sequenceid. public WALKey(final byte[] encodedRegionName, final TableName tablename, final long now) { init(encodedRegionName, tablename, @@ -257,6 +270,7 @@ public class WALKey implements SequenceId, Comparable<WALKey> { * @param now Time at which this edit was written. * @param clusterIds the clusters that have consumed the change(used in Replication) */ + // TODO: Fix being able to pass in sequenceid. public WALKey(final byte[] encodedRegionName, final TableName tablename, long logSeqNum, @@ -300,6 +314,7 @@ public class WALKey implements SequenceId, Comparable<WALKey> { * @param nonceGroup * @param nonce */ + // TODO: Fix being able to pass in sequenceid. public WALKey(final byte[] encodedRegionName, final TableName tablename, long logSeqNum, @@ -325,7 +340,7 @@ public class WALKey implements SequenceId, Comparable<WALKey> { long nonceGroup, long nonce, MultiVersionConcurrencyControl mvcc) { - this.logSeqNum = logSeqNum; + this.sequenceId = logSeqNum; this.writeTime = now; this.clusterIds = clusterIds; this.encodedRegionName = encodedRegionName; @@ -333,6 +348,15 @@ public class WALKey implements SequenceId, Comparable<WALKey> { this.nonceGroup = nonceGroup; this.nonce = nonce; this.mvcc = mvcc; + if (logSeqNum != NO_SEQUENCE_ID) { + setSequenceId(logSeqNum); + } + } + + // For HLogKey and deserialization. DO NOT USE. See setWriteEntry below. + @InterfaceAudience.Private + protected void setSequenceId(long sequenceId) { + this.sequenceId = sequenceId; } /** @@ -352,32 +376,24 @@ public class WALKey implements SequenceId, Comparable<WALKey> { return tablename; } - /** @return log sequence number */ - public long getLogSeqNum() { - return this.logSeqNum; - } - - /** - * Allow that the log sequence id to be set post-construction - * Only public for org.apache.hadoop.hbase.regionserver.wal.FSWALEntry - * @param sequence + /** @return log sequence number + * @deprecated Use {@link #getSequenceId()} */ - @InterfaceAudience.Private - public void setLogSeqNum(final long sequence) { - this.logSeqNum = sequence; - + @Deprecated + public long getLogSeqNum() { + return getSequenceId(); } /** - * Used to set original seq Id for WALKey during wal replay - * @param seqId + * Used to set original sequenceId for WALKey during WAL replay */ - public void setOrigLogSeqNum(final long seqId) { - this.origLogSeqNum = seqId; + public void setOrigLogSeqNum(final long sequenceId) { + this.origLogSeqNum = sequenceId; } /** - * Return a positive long if current WALKey is created from a replay edit + * Return a positive long if current WALKey is created from a replay edit; a replay edit is an + * edit that came in when replaying WALs of a crashed server. * @return original sequence number of the WALEdit */ public long getOrigLogSeqNum() { @@ -385,43 +401,14 @@ public class WALKey implements SequenceId, Comparable<WALKey> { } /** - * Wait for sequence number to be assigned & return the assigned value + * SequenceId is only available post WAL-assign. Calls before this will get you a + * {@link #NO_SEQUENCE_ID}. See the comment on FSHLog#append and #getWriteNumber in this method + * for more on when this sequenceId comes available. * @return long the new assigned sequence number - * @throws IOException */ @Override - public long getSequenceId() throws IOException { - return getSequenceId(-1); - } - - /** - * Wait for sequence number to be assigned & return the assigned value. - * @param maxWaitForSeqId maximum time to wait in milliseconds for sequenceid - * @return long the new assigned sequence number - * @throws IOException - */ - public long getSequenceId(final long maxWaitForSeqId) throws IOException { - // TODO: This implementation waiting on a latch is problematic because if a higher level - // determines we should stop or abort, there is no global list of all these blocked WALKeys - // waiting on a sequence id; they can't be cancelled... interrupted. See getNextSequenceId. - // - // UPDATE: I think we can remove the timeout now we are stamping all walkeys with sequenceid, - // even those that have failed (previously we were not... so they would just hang out...). - // St.Ack 20150910 - try { - if (maxWaitForSeqId < 0) { - this.seqNumAssignedLatch.await(); - } else if (!this.seqNumAssignedLatch.await(maxWaitForSeqId, TimeUnit.MILLISECONDS)) { - throw new TimeoutIOException("Failed to get sequenceid after " + maxWaitForSeqId + - "ms; WAL system stuck or has gone away?"); - } - } catch (InterruptedException ie) { - LOG.warn("Thread interrupted waiting for next log sequence number"); - InterruptedIOException iie = new InterruptedIOException(); - iie.initCause(ie); - throw iie; - } - return this.logSeqNum; + public long getSequenceId() { + return this.sequenceId; } /** @@ -495,7 +482,7 @@ public class WALKey implements SequenceId, Comparable<WALKey> { @Override public String toString() { return tablename + "/" + Bytes.toString(encodedRegionName) + "/" + - logSeqNum; + sequenceId; } /** @@ -509,7 +496,7 @@ public class WALKey implements SequenceId, Comparable<WALKey> { Map<String, Object> stringMap = new HashMap<String, Object>(); stringMap.put("table", tablename); stringMap.put("region", Bytes.toStringBinary(encodedRegionName)); - stringMap.put("sequence", logSeqNum); + stringMap.put("sequence", getSequenceId()); return stringMap; } @@ -527,7 +514,7 @@ public class WALKey implements SequenceId, Comparable<WALKey> { @Override public int hashCode() { int result = Bytes.hashCode(this.encodedRegionName); - result ^= this.logSeqNum; + result ^= getSequenceId(); result ^= this.writeTime; return result; } @@ -536,9 +523,11 @@ public class WALKey implements SequenceId, Comparable<WALKey> { public int compareTo(WALKey o) { int result = Bytes.compareTo(this.encodedRegionName, o.encodedRegionName); if (result == 0) { - if (this.logSeqNum < o.logSeqNum) { + long sid = getSequenceId(); + long otherSid = o.getSequenceId(); + if (sid < otherSid) { result = -1; - } else if (this.logSeqNum > o.logSeqNum) { + } else if (sid > otherSid) { result = 1; } if (result == 0) { @@ -592,7 +581,7 @@ public class WALKey implements SequenceId, Comparable<WALKey> { builder.setTableName(compressor.compress(this.tablename.getName(), compressionContext.tableDict)); } - builder.setLogSequenceNumber(this.logSeqNum); + builder.setLogSequenceNumber(getSequenceId()); builder.setWriteTime(writeTime); if (this.origLogSeqNum > 0) { builder.setOrigSequenceNumber(this.origLogSeqNum); @@ -658,10 +647,10 @@ public class WALKey implements SequenceId, Comparable<WALKey> { this.scopes.put(family, scope.getScopeType().getNumber()); } } - this.logSeqNum = walKey.getLogSequenceNumber(); + setSequenceId(walKey.getLogSequenceNumber()); this.writeTime = walKey.getWriteTime(); if(walKey.hasOrigSequenceNumber()) { this.origLogSeqNum = walKey.getOrigSequenceNumber(); } } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hbase/blob/ec92a8a7/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java index 60bc155..7add8a9 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java @@ -4765,12 +4765,12 @@ public class TestHRegion { durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true); // expect skip wal cases - durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, true, false, false); - durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, true, false, false); - durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, true, false, false); - durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, true, false, false); - durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, true, false, false); - durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, true, false, false); + durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false); + durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false); + durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false); + durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false); + durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false); + durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false); }
