http://git-wip-us.apache.org/repos/asf/hbase/blob/d4b82224/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/HBaseProtos.java ---------------------------------------------------------------------- diff --git a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/HBaseProtos.java b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/HBaseProtos.java index 9c0447e..1dbce4d 100644 --- a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/HBaseProtos.java +++ b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/HBaseProtos.java @@ -3687,6 +3687,16 @@ public final class HBaseProtos { * <code>optional bool split = 6;</code> */ boolean getSplit(); + + // optional int32 replica_id = 7 [default = 0]; + /** + * <code>optional int32 replica_id = 7 [default = 0];</code> + */ + boolean hasReplicaId(); + /** + * <code>optional int32 replica_id = 7 [default = 0];</code> + */ + int getReplicaId(); } /** * Protobuf type {@code RegionInfo} @@ -3782,6 +3792,11 @@ public final class HBaseProtos { split_ = input.readBool(); break; } + case 56: { + bitField0_ |= 0x00000040; + replicaId_ = input.readInt32(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -3924,6 +3939,22 @@ public final class HBaseProtos { return split_; } + // optional int32 replica_id = 7 [default = 0]; + public static final int REPLICA_ID_FIELD_NUMBER = 7; + private int replicaId_; + /** + * <code>optional int32 replica_id = 7 [default = 0];</code> + */ + public boolean hasReplicaId() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * <code>optional int32 replica_id = 7 [default = 0];</code> + */ + public int getReplicaId() { + return replicaId_; + } + private void initFields() { regionId_ = 0L; tableName_ = org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.TableName.getDefaultInstance(); @@ -3931,6 +3962,7 @@ public final class HBaseProtos { endKey_ = com.google.protobuf.ByteString.EMPTY; offline_ = false; split_ = false; + replicaId_ = 0; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -3974,6 +4006,9 @@ public final class HBaseProtos { if (((bitField0_ & 0x00000020) == 0x00000020)) { output.writeBool(6, split_); } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeInt32(7, replicaId_); + } getUnknownFields().writeTo(output); } @@ -4007,6 +4042,10 @@ public final class HBaseProtos { size += com.google.protobuf.CodedOutputStream .computeBoolSize(6, split_); } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(7, replicaId_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -4060,6 +4099,11 @@ public final class HBaseProtos { result = result && (getSplit() == other.getSplit()); } + result = result && (hasReplicaId() == other.hasReplicaId()); + if (hasReplicaId()) { + result = result && (getReplicaId() + == other.getReplicaId()); + } result = result && getUnknownFields().equals(other.getUnknownFields()); return result; @@ -4097,6 +4141,10 @@ public final class HBaseProtos { hash = (37 * hash) + SPLIT_FIELD_NUMBER; hash = (53 * hash) + hashBoolean(getSplit()); } + if (hasReplicaId()) { + hash = (37 * hash) + REPLICA_ID_FIELD_NUMBER; + hash = (53 * hash) + getReplicaId(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -4228,6 +4276,8 @@ public final class HBaseProtos { bitField0_ = (bitField0_ & ~0x00000010); split_ = false; bitField0_ = (bitField0_ & ~0x00000020); + replicaId_ = 0; + bitField0_ = (bitField0_ & ~0x00000040); return this; } @@ -4284,6 +4334,10 @@ public final class HBaseProtos { to_bitField0_ |= 0x00000020; } result.split_ = split_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + result.replicaId_ = replicaId_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -4318,6 +4372,9 @@ public final class HBaseProtos { if (other.hasSplit()) { setSplit(other.getSplit()); } + if (other.hasReplicaId()) { + setReplicaId(other.getReplicaId()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -4645,6 +4702,39 @@ public final class HBaseProtos { return this; } + // optional int32 replica_id = 7 [default = 0]; + private int replicaId_ ; + /** + * <code>optional int32 replica_id = 7 [default = 0];</code> + */ + public boolean hasReplicaId() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * <code>optional int32 replica_id = 7 [default = 0];</code> + */ + public int getReplicaId() { + return replicaId_; + } + /** + * <code>optional int32 replica_id = 7 [default = 0];</code> + */ + public Builder setReplicaId(int value) { + bitField0_ |= 0x00000040; + replicaId_ = value; + onChanged(); + return this; + } + /** + * <code>optional int32 replica_id = 7 [default = 0];</code> + */ + public Builder clearReplicaId() { + bitField0_ = (bitField0_ & ~0x00000040); + replicaId_ = 0; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:RegionInfo) } @@ -16234,43 +16324,43 @@ public final class HBaseProtos { "ingPair\"o\n\022ColumnFamilySchema\022\014\n\004name\030\001 " + "\002(\014\022#\n\nattributes\030\002 \003(\0132\017.BytesBytesPair" + "\022&\n\rconfiguration\030\003 \003(\0132\017.NameStringPair" + - "\"\203\001\n\nRegionInfo\022\021\n\tregion_id\030\001 \002(\004\022\036\n\nta", + "\"\232\001\n\nRegionInfo\022\021\n\tregion_id\030\001 \002(\004\022\036\n\nta", "ble_name\030\002 \002(\0132\n.TableName\022\021\n\tstart_key\030" + "\003 \001(\014\022\017\n\007end_key\030\004 \001(\014\022\017\n\007offline\030\005 \001(\010\022" + - "\r\n\005split\030\006 \001(\010\"1\n\014FavoredNodes\022!\n\014favore" + - "d_node\030\001 \003(\0132\013.ServerName\"\225\001\n\017RegionSpec" + - "ifier\0222\n\004type\030\001 \002(\0162$.RegionSpecifier.Re" + - "gionSpecifierType\022\r\n\005value\030\002 \002(\014\"?\n\023Regi" + - "onSpecifierType\022\017\n\013REGION_NAME\020\001\022\027\n\023ENCO" + - "DED_REGION_NAME\020\002\"%\n\tTimeRange\022\014\n\004from\030\001" + - " \001(\004\022\n\n\002to\030\002 \001(\004\"A\n\nServerName\022\021\n\thost_n" + - "ame\030\001 \002(\t\022\014\n\004port\030\002 \001(\r\022\022\n\nstart_code\030\003 ", - "\001(\004\"\033\n\013Coprocessor\022\014\n\004name\030\001 \002(\t\"-\n\016Name" + - "StringPair\022\014\n\004name\030\001 \002(\t\022\r\n\005value\030\002 \002(\t\"" + - ",\n\rNameBytesPair\022\014\n\004name\030\001 \002(\t\022\r\n\005value\030" + - "\002 \001(\014\"/\n\016BytesBytesPair\022\r\n\005first\030\001 \002(\014\022\016" + - "\n\006second\030\002 \002(\014\",\n\rNameInt64Pair\022\014\n\004name\030" + - "\001 \001(\t\022\r\n\005value\030\002 \001(\003\"\275\001\n\023SnapshotDescrip" + - "tion\022\014\n\004name\030\001 \002(\t\022\r\n\005table\030\002 \001(\t\022\030\n\rcre" + - "ation_time\030\003 \001(\003:\0010\022.\n\004type\030\004 \001(\0162\031.Snap" + - "shotDescription.Type:\005FLUSH\022\017\n\007version\030\005" + - " \001(\005\".\n\004Type\022\014\n\010DISABLED\020\000\022\t\n\005FLUSH\020\001\022\r\n", - "\tSKIPFLUSH\020\002\"}\n\024ProcedureDescription\022\021\n\t" + - "signature\030\001 \002(\t\022\020\n\010instance\030\002 \001(\t\022\030\n\rcre" + - "ation_time\030\003 \001(\003:\0010\022&\n\rconfiguration\030\004 \003" + - "(\0132\017.NameStringPair\"\n\n\010EmptyMsg\"\033\n\007LongM" + - "sg\022\020\n\010long_msg\030\001 \002(\003\"\037\n\tDoubleMsg\022\022\n\ndou" + - "ble_msg\030\001 \002(\001\"\'\n\rBigDecimalMsg\022\026\n\016bigdec" + - "imal_msg\030\001 \002(\014\"5\n\004UUID\022\026\n\016least_sig_bits" + - "\030\001 \002(\004\022\025\n\rmost_sig_bits\030\002 \002(\004\"K\n\023Namespa" + - "ceDescriptor\022\014\n\004name\030\001 \002(\014\022&\n\rconfigurat" + - "ion\030\002 \003(\0132\017.NameStringPair\"$\n\020RegionServ", - "erInfo\022\020\n\010infoPort\030\001 \001(\005*r\n\013CompareType\022" + - "\010\n\004LESS\020\000\022\021\n\rLESS_OR_EQUAL\020\001\022\t\n\005EQUAL\020\002\022" + - "\r\n\tNOT_EQUAL\020\003\022\024\n\020GREATER_OR_EQUAL\020\004\022\013\n\007" + - "GREATER\020\005\022\t\n\005NO_OP\020\006B>\n*org.apache.hadoo" + - "p.hbase.protobuf.generatedB\013HBaseProtosH" + - "\001\240\001\001" + "\r\n\005split\030\006 \001(\010\022\025\n\nreplica_id\030\007 \001(\005:\0010\"1\n" + + "\014FavoredNodes\022!\n\014favored_node\030\001 \003(\0132\013.Se" + + "rverName\"\225\001\n\017RegionSpecifier\0222\n\004type\030\001 \002" + + "(\0162$.RegionSpecifier.RegionSpecifierType" + + "\022\r\n\005value\030\002 \002(\014\"?\n\023RegionSpecifierType\022\017" + + "\n\013REGION_NAME\020\001\022\027\n\023ENCODED_REGION_NAME\020\002" + + "\"%\n\tTimeRange\022\014\n\004from\030\001 \001(\004\022\n\n\002to\030\002 \001(\004\"" + + "A\n\nServerName\022\021\n\thost_name\030\001 \002(\t\022\014\n\004port", + "\030\002 \001(\r\022\022\n\nstart_code\030\003 \001(\004\"\033\n\013Coprocesso" + + "r\022\014\n\004name\030\001 \002(\t\"-\n\016NameStringPair\022\014\n\004nam" + + "e\030\001 \002(\t\022\r\n\005value\030\002 \002(\t\",\n\rNameBytesPair\022" + + "\014\n\004name\030\001 \002(\t\022\r\n\005value\030\002 \001(\014\"/\n\016BytesByt" + + "esPair\022\r\n\005first\030\001 \002(\014\022\016\n\006second\030\002 \002(\014\",\n" + + "\rNameInt64Pair\022\014\n\004name\030\001 \001(\t\022\r\n\005value\030\002 " + + "\001(\003\"\275\001\n\023SnapshotDescription\022\014\n\004name\030\001 \002(" + + "\t\022\r\n\005table\030\002 \001(\t\022\030\n\rcreation_time\030\003 \001(\003:" + + "\0010\022.\n\004type\030\004 \001(\0162\031.SnapshotDescription.T" + + "ype:\005FLUSH\022\017\n\007version\030\005 \001(\005\".\n\004Type\022\014\n\010D", + "ISABLED\020\000\022\t\n\005FLUSH\020\001\022\r\n\tSKIPFLUSH\020\002\"}\n\024P" + + "rocedureDescription\022\021\n\tsignature\030\001 \002(\t\022\020" + + "\n\010instance\030\002 \001(\t\022\030\n\rcreation_time\030\003 \001(\003:" + + "\0010\022&\n\rconfiguration\030\004 \003(\0132\017.NameStringPa" + + "ir\"\n\n\010EmptyMsg\"\033\n\007LongMsg\022\020\n\010long_msg\030\001 " + + "\002(\003\"\037\n\tDoubleMsg\022\022\n\ndouble_msg\030\001 \002(\001\"\'\n\r" + + "BigDecimalMsg\022\026\n\016bigdecimal_msg\030\001 \002(\014\"5\n" + + "\004UUID\022\026\n\016least_sig_bits\030\001 \002(\004\022\025\n\rmost_si" + + "g_bits\030\002 \002(\004\"K\n\023NamespaceDescriptor\022\014\n\004n" + + "ame\030\001 \002(\014\022&\n\rconfiguration\030\002 \003(\0132\017.NameS", + "tringPair\"$\n\020RegionServerInfo\022\020\n\010infoPor" + + "t\030\001 \001(\005*r\n\013CompareType\022\010\n\004LESS\020\000\022\021\n\rLESS" + + "_OR_EQUAL\020\001\022\t\n\005EQUAL\020\002\022\r\n\tNOT_EQUAL\020\003\022\024\n" + + "\020GREATER_OR_EQUAL\020\004\022\013\n\007GREATER\020\005\022\t\n\005NO_O" + + "P\020\006B>\n*org.apache.hadoop.hbase.protobuf." + + "generatedB\013HBaseProtosH\001\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -16300,7 +16390,7 @@ public final class HBaseProtos { internal_static_RegionInfo_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_RegionInfo_descriptor, - new java.lang.String[] { "RegionId", "TableName", "StartKey", "EndKey", "Offline", "Split", }); + new java.lang.String[] { "RegionId", "TableName", "StartKey", "EndKey", "Offline", "Split", "ReplicaId", }); internal_static_FavoredNodes_descriptor = getDescriptor().getMessageTypes().get(4); internal_static_FavoredNodes_fieldAccessorTable = new
http://git-wip-us.apache.org/repos/asf/hbase/blob/d4b82224/hbase-protocol/src/main/protobuf/HBase.proto ---------------------------------------------------------------------- diff --git a/hbase-protocol/src/main/protobuf/HBase.proto b/hbase-protocol/src/main/protobuf/HBase.proto index 3e3d570..24941ff 100644 --- a/hbase-protocol/src/main/protobuf/HBase.proto +++ b/hbase-protocol/src/main/protobuf/HBase.proto @@ -64,6 +64,7 @@ message RegionInfo { optional bytes end_key = 4; optional bool offline = 5; optional bool split = 6; + optional int32 replica_id = 7 [default = 0]; } /** http://git-wip-us.apache.org/repos/asf/hbase/blob/d4b82224/hbase-server/src/main/java/org/apache/hadoop/hbase/catalog/MetaEditor.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/catalog/MetaEditor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/catalog/MetaEditor.java index 89fa0a9..5b5446b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/catalog/MetaEditor.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/catalog/MetaEditor.java @@ -19,7 +19,6 @@ package org.apache.hadoop.hbase.catalog; import java.io.IOException; import java.io.InterruptedIOException; -import java.net.ConnectException; import java.util.ArrayList; import java.util.List; @@ -47,11 +46,10 @@ import com.google.protobuf.ServiceException; /** * Writes region and assignment information to <code>hbase:meta</code>. - * TODO: Put MetaReader and MetaEditor together; doesn't make sense having - * them distinct. see HBASE-3475. */ @InterfaceAudience.Private -public class MetaEditor { +public class MetaEditor extends MetaReader { + // TODO: Strip CatalogTracker from this class. Its all over and in the end // its only used to get its Configuration so we can get associated // Connection. @@ -290,7 +288,7 @@ public class MetaEditor { Put put = new Put(regionInfo.getRegionName()); addRegionInfo(put, regionInfo); if (sn != null) { - addLocation(put, sn, openSeqNum); + addLocation(put, sn, openSeqNum, regionInfo.getReplicaId()); } putToMetaTable(catalogTracker, put); LOG.info("Added daughter " + regionInfo.getEncodedName() + @@ -327,7 +325,7 @@ public class MetaEditor { Delete deleteB = makeDeleteFromRegionInfo(regionB); // The merged is a new region, openSeqNum = 1 is fine. - addLocation(putOfMerged, sn, 1); + addLocation(putOfMerged, sn, 1, mergedRegion.getReplicaId()); byte[] tableRow = Bytes.toBytes(mergedRegion.getRegionNameAsString() + HConstants.DELIMITER); @@ -365,8 +363,8 @@ public class MetaEditor { Put putA = makePutFromRegionInfo(splitA); Put putB = makePutFromRegionInfo(splitB); - addLocation(putA, sn, 1); //these are new regions, openSeqNum = 1 is fine. - addLocation(putB, sn, 1); + addLocation(putA, sn, 1, splitA.getReplicaId()); //new regions, openSeqNum = 1 is fine. + addLocation(putB, sn, 1, splitB.getReplicaId()); byte[] tableRow = Bytes.toBytes(parent.getRegionNameAsString() + HConstants.DELIMITER); multiMutate(meta, tableRow, putParent, putA, putB); @@ -401,29 +399,6 @@ public class MetaEditor { } } - - /** - * Updates the location of the specified hbase:meta region in ROOT to be the - * specified server hostname and startcode. - * <p> - * Uses passed catalog tracker to get a connection to the server hosting - * ROOT and makes edits to that region. - * - * @param catalogTracker catalog tracker - * @param regionInfo region to update location of - * @param sn Server name - * @param openSeqNum the latest sequence number obtained when the region was open - * @throws IOException - * @throws ConnectException Usually because the regionserver carrying hbase:meta - * is down. - * @throws NullPointerException Because no -ROOT- server connection - */ - public static void updateMetaLocation(CatalogTracker catalogTracker, - HRegionInfo regionInfo, ServerName sn, long openSeqNum) - throws IOException, ConnectException { - updateLocation(catalogTracker, regionInfo, sn, openSeqNum); - } - /** * Updates the location of the specified region in hbase:meta to be the specified * server hostname and startcode. @@ -458,8 +433,9 @@ public class MetaEditor { private static void updateLocation(final CatalogTracker catalogTracker, HRegionInfo regionInfo, ServerName sn, long openSeqNum) throws IOException { - Put put = new Put(regionInfo.getRegionName()); - addLocation(put, sn, openSeqNum); + // region replicas are kept in the primary region's row + Put put = new Put(getMetaKeyForRegion(regionInfo)); + addLocation(put, sn, openSeqNum, regionInfo.getReplicaId()); putToCatalogTable(catalogTracker, put); LOG.info("Updated row " + regionInfo.getRegionNameAsString() + " with server=" + sn); @@ -568,12 +544,12 @@ public class MetaEditor { return p; } - private static Put addLocation(final Put p, final ServerName sn, long openSeqNum) { - p.addImmutable(HConstants.CATALOG_FAMILY, HConstants.SERVER_QUALIFIER, + private static Put addLocation(final Put p, final ServerName sn, long openSeqNum, int replicaId){ + p.addImmutable(HConstants.CATALOG_FAMILY, MetaReader.getServerColumn(replicaId), Bytes.toBytes(sn.getHostAndPort())); - p.addImmutable(HConstants.CATALOG_FAMILY, HConstants.STARTCODE_QUALIFIER, + p.addImmutable(HConstants.CATALOG_FAMILY, MetaReader.getStartCodeColumn(replicaId), Bytes.toBytes(sn.getStartcode())); - p.addImmutable(HConstants.CATALOG_FAMILY, HConstants.SEQNUM_QUALIFIER, + p.addImmutable(HConstants.CATALOG_FAMILY, MetaReader.getSeqNumColumn(replicaId), Bytes.toBytes(openSeqNum)); return p; } http://git-wip-us.apache.org/repos/asf/hbase/blob/d4b82224/hbase-server/src/main/java/org/apache/hadoop/hbase/client/CoprocessorHConnection.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/CoprocessorHConnection.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/CoprocessorHConnection.java index 85c86f9..cc0901f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/CoprocessorHConnection.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/CoprocessorHConnection.java @@ -85,6 +85,7 @@ public class CoprocessorHConnection implements ClusterConnection { this.delegate = delegate; } + @Override public org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ClientService.BlockingInterface getClient(ServerName serverName) throws IOException { // client is trying to reach off-server, so we can't do anything special @@ -96,262 +97,323 @@ public class CoprocessorHConnection implements ClusterConnection { return server.getRSRpcServices(); } + @Override public void abort(String why, Throwable e) { delegate.abort(why, e); } + @Override public boolean isAborted() { return delegate.isAborted(); } + @Override public Configuration getConfiguration() { return delegate.getConfiguration(); } + @Override public HTableInterface getTable(String tableName) throws IOException { return delegate.getTable(tableName); } + @Override public HTableInterface getTable(byte[] tableName) throws IOException { return delegate.getTable(tableName); } + @Override public HTableInterface getTable(TableName tableName) throws IOException { return delegate.getTable(tableName); } + @Override public HTableInterface getTable(String tableName, ExecutorService pool) throws IOException { return delegate.getTable(tableName, pool); } + @Override public HTableInterface getTable(byte[] tableName, ExecutorService pool) throws IOException { return delegate.getTable(tableName, pool); } + @Override public HTableInterface getTable(TableName tableName, ExecutorService pool) throws IOException { return delegate.getTable(tableName, pool); } + @Override public Admin getAdmin() throws IOException { return delegate.getAdmin(); } + @Override public boolean isMasterRunning() throws MasterNotRunningException, ZooKeeperConnectionException { return delegate.isMasterRunning(); } + @Override public boolean isTableEnabled(TableName tableName) throws IOException { return delegate.isTableEnabled(tableName); } + @Override public boolean isTableEnabled(byte[] tableName) throws IOException { return delegate.isTableEnabled(tableName); } + @Override public boolean isTableDisabled(TableName tableName) throws IOException { return delegate.isTableDisabled(tableName); } + @Override public boolean isTableDisabled(byte[] tableName) throws IOException { return delegate.isTableDisabled(tableName); } + @Override public boolean isTableAvailable(TableName tableName) throws IOException { return delegate.isTableAvailable(tableName); } + @Override public boolean isTableAvailable(byte[] tableName) throws IOException { return delegate.isTableAvailable(tableName); } + @Override public boolean isTableAvailable(TableName tableName, byte[][] splitKeys) throws IOException { return delegate.isTableAvailable(tableName, splitKeys); } + @Override public boolean isTableAvailable(byte[] tableName, byte[][] splitKeys) throws IOException { return delegate.isTableAvailable(tableName, splitKeys); } + @Override public HTableDescriptor[] listTables() throws IOException { return delegate.listTables(); } + @Override public String[] getTableNames() throws IOException { return delegate.getTableNames(); } + @Override public TableName[] listTableNames() throws IOException { return delegate.listTableNames(); } + @Override public HTableDescriptor getHTableDescriptor(TableName tableName) throws IOException { return delegate.getHTableDescriptor(tableName); } + @Override public HTableDescriptor getHTableDescriptor(byte[] tableName) throws IOException { return delegate.getHTableDescriptor(tableName); } + @Override public HRegionLocation locateRegion(TableName tableName, byte[] row) throws IOException { return delegate.locateRegion(tableName, row); } + @Override public HRegionLocation locateRegion(byte[] tableName, byte[] row) throws IOException { return delegate.locateRegion(tableName, row); } + @Override public void clearRegionCache() { delegate.clearRegionCache(); } + @Override public void clearRegionCache(TableName tableName) { delegate.clearRegionCache(tableName); } + @Override public void clearRegionCache(byte[] tableName) { delegate.clearRegionCache(tableName); } + @Override public HRegionLocation relocateRegion(TableName tableName, byte[] row) throws IOException { return delegate.relocateRegion(tableName, row); } + @Override public HRegionLocation relocateRegion(byte[] tableName, byte[] row) throws IOException { return delegate.relocateRegion(tableName, row); } - public void updateCachedLocations(TableName tableName, byte[] rowkey, Object exception, - ServerName source) { - delegate.updateCachedLocations(tableName, rowkey, exception, source); + @Override + public void updateCachedLocations(TableName tableName, byte[] regionName, byte[] rowkey, + Object exception, ServerName source) { + delegate.updateCachedLocations(tableName, regionName, rowkey, exception, source); } + @Override public void updateCachedLocations(TableName tableName, byte[] rowkey, Object exception, HRegionLocation source) { delegate.updateCachedLocations(tableName, rowkey, exception, source); } + @Override public void updateCachedLocations(byte[] tableName, byte[] rowkey, Object exception, HRegionLocation source) { delegate.updateCachedLocations(tableName, rowkey, exception, source); } + @Override public HRegionLocation locateRegion(byte[] regionName) throws IOException { return delegate.locateRegion(regionName); } + @Override public List<HRegionLocation> locateRegions(TableName tableName) throws IOException { return delegate.locateRegions(tableName); } + @Override public List<HRegionLocation> locateRegions(byte[] tableName) throws IOException { return delegate.locateRegions(tableName); } + @Override public List<HRegionLocation> locateRegions(TableName tableName, boolean useCache, boolean offlined) throws IOException { return delegate.locateRegions(tableName, useCache, offlined); } + @Override public List<HRegionLocation> locateRegions(byte[] tableName, boolean useCache, boolean offlined) throws IOException { return delegate.locateRegions(tableName, useCache, offlined); } + @Override public org.apache.hadoop.hbase.protobuf.generated.MasterProtos.MasterService.BlockingInterface getMaster() throws IOException { return delegate.getMaster(); } + @Override public org.apache.hadoop.hbase.protobuf.generated.AdminProtos.AdminService.BlockingInterface getAdmin(ServerName serverName) throws IOException { return delegate.getAdmin(serverName); } + @Override public org.apache.hadoop.hbase.protobuf.generated.AdminProtos.AdminService.BlockingInterface getAdmin(ServerName serverName, boolean getMaster) throws IOException { return delegate.getAdmin(serverName, getMaster); } + @Override public HRegionLocation getRegionLocation(TableName tableName, byte[] row, boolean reload) throws IOException { return delegate.getRegionLocation(tableName, row, reload); } + @Override public HRegionLocation getRegionLocation(byte[] tableName, byte[] row, boolean reload) throws IOException { return delegate.getRegionLocation(tableName, row, reload); } + @Override public void processBatch(List<? extends Row> actions, TableName tableName, ExecutorService pool, Object[] results) throws IOException, InterruptedException { delegate.processBatch(actions, tableName, pool, results); } + @Override public void processBatch(List<? extends Row> actions, byte[] tableName, ExecutorService pool, Object[] results) throws IOException, InterruptedException { delegate.processBatch(actions, tableName, pool, results); } + @Override public <R> void processBatchCallback(List<? extends Row> list, TableName tableName, ExecutorService pool, Object[] results, Callback<R> callback) throws IOException, InterruptedException { delegate.processBatchCallback(list, tableName, pool, results, callback); } + @Override public <R> void processBatchCallback(List<? extends Row> list, byte[] tableName, ExecutorService pool, Object[] results, Callback<R> callback) throws IOException, InterruptedException { delegate.processBatchCallback(list, tableName, pool, results, callback); } + @Override public void setRegionCachePrefetch(TableName tableName, boolean enable) { delegate.setRegionCachePrefetch(tableName, enable); } + @Override public void setRegionCachePrefetch(byte[] tableName, boolean enable) { delegate.setRegionCachePrefetch(tableName, enable); } + @Override public boolean getRegionCachePrefetch(TableName tableName) { return delegate.getRegionCachePrefetch(tableName); } + @Override public boolean getRegionCachePrefetch(byte[] tableName) { return delegate.getRegionCachePrefetch(tableName); } + @Override public int getCurrentNrHRS() throws IOException { return delegate.getCurrentNrHRS(); } + @Override public HTableDescriptor[] getHTableDescriptorsByTableName(List<TableName> tableNames) throws IOException { return delegate.getHTableDescriptorsByTableName(tableNames); } + @Override public HTableDescriptor[] getHTableDescriptors(List<String> tableNames) throws IOException { return delegate.getHTableDescriptors(tableNames); } + @Override public boolean isClosed() { return delegate.isClosed(); } + @Override public void clearCaches(ServerName sn) { delegate.clearCaches(sn); } + @Override public void close() throws IOException { delegate.close(); } + @Override public void deleteCachedRegionLocation(HRegionLocation location) { delegate.deleteCachedRegionLocation(location); } + @Override public MasterKeepAliveConnection getKeepAliveMasterService() throws MasterNotRunningException { return delegate.getKeepAliveMasterService(); } + @Override public boolean isDeadServer(ServerName serverName) { return delegate.isDeadServer(serverName); } http://git-wip-us.apache.org/repos/asf/hbase/blob/d4b82224/hbase-server/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java index 8597916..d4de6f8 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/catalog/TestMetaReaderEditor.java @@ -25,7 +25,7 @@ import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.List; - +import java.util.Random; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -35,11 +35,14 @@ import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.MediumTests; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; +import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -274,5 +277,100 @@ public class TestMetaReaderEditor { pair.getFirst().getEncodedName()); } + @Test + public void testParseReplicaIdFromServerColumn() { + String column1 = HConstants.SERVER_QUALIFIER_STR; + assertEquals(0, MetaReader.parseReplicaIdFromServerColumn(Bytes.toBytes(column1))); + String column2 = column1 + MetaReader.META_REPLICA_ID_DELIMITER; + assertEquals(-1, MetaReader.parseReplicaIdFromServerColumn(Bytes.toBytes(column2))); + String column3 = column2 + "00"; + assertEquals(-1, MetaReader.parseReplicaIdFromServerColumn(Bytes.toBytes(column3))); + String column4 = column3 + "2A"; + assertEquals(42, MetaReader.parseReplicaIdFromServerColumn(Bytes.toBytes(column4))); + String column5 = column4 + "2A"; + assertEquals(-1, MetaReader.parseReplicaIdFromServerColumn(Bytes.toBytes(column5))); + String column6 = HConstants.STARTCODE_QUALIFIER_STR; + assertEquals(-1, MetaReader.parseReplicaIdFromServerColumn(Bytes.toBytes(column6))); + } + + @Test + public void testMetaReaderGetColumnMethods() { + Assert.assertArrayEquals(HConstants.SERVER_QUALIFIER, MetaReader.getServerColumn(0)); + Assert.assertArrayEquals(Bytes.toBytes(HConstants.SERVER_QUALIFIER_STR + + MetaReader.META_REPLICA_ID_DELIMITER + "002A"), MetaReader.getServerColumn(42)); + + Assert.assertArrayEquals(HConstants.STARTCODE_QUALIFIER, MetaReader.getStartCodeColumn(0)); + Assert.assertArrayEquals(Bytes.toBytes(HConstants.STARTCODE_QUALIFIER_STR + + MetaReader.META_REPLICA_ID_DELIMITER + "002A"), MetaReader.getStartCodeColumn(42)); + + Assert.assertArrayEquals(HConstants.SEQNUM_QUALIFIER, MetaReader.getSeqNumColumn(0)); + Assert.assertArrayEquals(Bytes.toBytes(HConstants.SEQNUM_QUALIFIER_STR + + MetaReader.META_REPLICA_ID_DELIMITER + "002A"), MetaReader.getSeqNumColumn(42)); + } + + @Test + public void testMetaLocationsForRegionReplicas() throws IOException { + Random random = new Random(); + ServerName serverName0 = ServerName.valueOf("foo", 60010, random.nextLong()); + ServerName serverName1 = ServerName.valueOf("bar", 60010, random.nextLong()); + ServerName serverName100 = ServerName.valueOf("baz", 60010, random.nextLong()); + + long regionId = System.currentTimeMillis(); + HRegionInfo primary = new HRegionInfo(TableName.valueOf("table_foo"), + HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, false, regionId, 0); + HRegionInfo replica1 = new HRegionInfo(TableName.valueOf("table_foo"), + HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, false, regionId, 1); + HRegionInfo replica100 = new HRegionInfo(TableName.valueOf("table_foo"), + HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW, false, regionId, 100); + + long seqNum0 = random.nextLong(); + long seqNum1 = random.nextLong(); + long seqNum100 = random.nextLong(); + + + HTable meta = MetaReader.getMetaHTable(CT); + try { + MetaEditor.updateRegionLocation(CT, primary, serverName0, seqNum0); + + // assert that the server, startcode and seqNum columns are there for the primary region + assertMetaLocation(meta, primary.getRegionName(), serverName0, seqNum0, 0, true); + + // add replica = 1 + MetaEditor.updateRegionLocation(CT, replica1, serverName1, seqNum1); + // check whether the primary is still there + assertMetaLocation(meta, primary.getRegionName(), serverName0, seqNum0, 0, true); + // now check for replica 1 + assertMetaLocation(meta, primary.getRegionName(), serverName1, seqNum1, 1, true); + + // add replica = 1 + MetaEditor.updateRegionLocation(CT, replica100, serverName100, seqNum100); + // check whether the primary is still there + assertMetaLocation(meta, primary.getRegionName(), serverName0, seqNum0, 0, true); + // check whether the replica 1 is still there + assertMetaLocation(meta, primary.getRegionName(), serverName1, seqNum1, 1, true); + // now check for replica 1 + assertMetaLocation(meta, primary.getRegionName(), serverName100, seqNum100, 100, true); + } finally { + meta.close(); + } + } + + public static void assertMetaLocation(HTable meta, byte[] row, ServerName serverName, + long seqNum, int replicaId, boolean checkSeqNum) throws IOException { + Get get = new Get(row); + Result result = meta.get(get); + assertTrue(Bytes.equals( + result.getValue(HConstants.CATALOG_FAMILY, MetaReader.getServerColumn(replicaId)), + Bytes.toBytes(serverName.getHostAndPort()))); + assertTrue(Bytes.equals( + result.getValue(HConstants.CATALOG_FAMILY, MetaReader.getStartCodeColumn(replicaId)), + Bytes.toBytes(serverName.getStartcode()))); + if (checkSeqNum) { + assertTrue(Bytes.equals( + result.getValue(HConstants.CATALOG_FAMILY, MetaReader.getSeqNumColumn(replicaId)), + Bytes.toBytes(seqNum))); + } + } + } http://git-wip-us.apache.org/repos/asf/hbase/blob/d4b82224/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java index 2ac6e25..4c1fc43 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java @@ -26,6 +26,8 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; import java.io.IOException; import java.lang.reflect.Method; @@ -60,6 +62,7 @@ import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.LargeTests; import org.apache.hadoop.hbase.MiniHBaseCluster; +import org.apache.hadoop.hbase.RegionLocations; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.Waiter; @@ -95,6 +98,7 @@ import org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException; import org.apache.hadoop.hbase.regionserver.Store; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; +import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher; import org.apache.log4j.Level; import org.junit.After; @@ -260,7 +264,7 @@ public class TestFromClientSide { result = table.get(get); assertNull(result.getValue(FAMILY, COLUMN)); - // major compaction, purged future deletes + // major compaction, purged future deletes TEST_UTIL.getHBaseAdmin().flush(TABLENAME); TEST_UTIL.getHBaseAdmin().majorCompact(TABLENAME); @@ -284,7 +288,7 @@ public class TestFromClientSide { get = new Get(ROW); result = table.get(get); assertArrayEquals(VALUE, result.getValue(FAMILY, COLUMN)); - + table.close(); } @@ -6045,7 +6049,6 @@ public class TestFromClientSide { table.close(); } - /** * Tests reversed scan under multi regions */ @@ -6210,4 +6213,44 @@ public class TestFromClientSide { } assertEquals(4, count); // 003 004 005 006 } + + @Test + public void testGetStartEndKeysWithRegionReplicas() throws IOException { + HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testGetStartEndKeys")); + HColumnDescriptor fam = new HColumnDescriptor(FAMILY); + htd.addFamily(fam); + byte[][] KEYS = HBaseTestingUtility.KEYS_FOR_HBA_CREATE_TABLE; + TEST_UTIL.getHBaseAdmin().createTable(htd, KEYS); + List<HRegionInfo> regions = TEST_UTIL.getHBaseAdmin().getTableRegions(htd.getTableName()); + + for (int regionReplication = 1; regionReplication < 4 ; regionReplication++) { + List<RegionLocations> regionLocations = new ArrayList<RegionLocations>(); + + // mock region locations coming from meta with multiple replicas + for (HRegionInfo region : regions) { + HRegionLocation[] arr = new HRegionLocation[regionReplication]; + for (int i = 0; i < arr.length; i++) { + arr[i] = new HRegionLocation(RegionReplicaUtil.getRegionInfoForReplica(region, i), null); + } + regionLocations.add(new RegionLocations(arr)); + } + + HTable table = spy(new HTable(TEST_UTIL.getConfiguration(), htd.getTableName())); + when(table.listRegionLocations()).thenReturn(regionLocations); + + Pair<byte[][], byte[][]> startEndKeys = table.getStartEndKeys(); + + assertEquals(KEYS.length + 1, startEndKeys.getFirst().length); + + for (int i = 0; i < KEYS.length + 1; i++) { + byte[] startKey = i == 0 ? HConstants.EMPTY_START_ROW : KEYS[i - 1]; + byte[] endKey = i == KEYS.length ? HConstants.EMPTY_END_ROW : KEYS[i]; + assertArrayEquals(startKey, startEndKeys.getFirst()[i]); + assertArrayEquals(endKey, startEndKeys.getSecond()[i]); + } + + table.close(); + } + } + } http://git-wip-us.apache.org/repos/asf/hbase/blob/d4b82224/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java index 2761b8f..bc1b5f5 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java @@ -53,6 +53,7 @@ import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.MediumTests; +import org.apache.hadoop.hbase.RegionLocations; import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.Waiter; @@ -603,15 +604,16 @@ public class TestHCM { assertNotNull(conn.getCachedLocation(TABLE_NAME, ROW)); - final int nextPort = conn.getCachedLocation(TABLE_NAME, ROW).getPort() + 1; - HRegionLocation loc = conn.getCachedLocation(TABLE_NAME, ROW); + final int nextPort = conn.getCachedLocation(TABLE_NAME, ROW).getRegionLocation().getPort() + 1; + HRegionLocation loc = conn.getCachedLocation(TABLE_NAME, ROW).getRegionLocation(); conn.updateCachedLocation(loc.getRegionInfo(), loc.getServerName(), ServerName.valueOf("127.0.0.1", nextPort, HConstants.LATEST_TIMESTAMP), HConstants.LATEST_TIMESTAMP); - Assert.assertEquals(conn.getCachedLocation(TABLE_NAME, ROW).getPort(), nextPort); + Assert.assertEquals(conn.getCachedLocation(TABLE_NAME, ROW) + .getRegionLocation().getPort(), nextPort); - conn.forceDeleteCachedLocation(TABLE_NAME, ROW.clone()); - HRegionLocation rl = conn.getCachedLocation(TABLE_NAME, ROW); + conn.clearRegionCache(TABLE_NAME, ROW.clone()); + RegionLocations rl = conn.getCachedLocation(TABLE_NAME, ROW); assertNull("What is this location?? " + rl, rl); // We're now going to move the region and check that it works for the client @@ -633,7 +635,7 @@ public class TestHCM { } // Now moving the region to the second server - HRegionLocation toMove = conn.getCachedLocation(TABLE_NAME, ROW); + HRegionLocation toMove = conn.getCachedLocation(TABLE_NAME, ROW).getRegionLocation(); byte[] regionName = toMove.getRegionInfo().getRegionName(); byte[] encodedRegionNameBytes = toMove.getRegionInfo().getEncodedNameAsBytes(); @@ -682,7 +684,8 @@ public class TestHCM { // Cache was NOT updated and points to the wrong server Assert.assertFalse( - conn.getCachedLocation(TABLE_NAME, ROW).getPort() == destServerName.getPort()); + conn.getCachedLocation(TABLE_NAME, ROW).getRegionLocation() + .getPort() == destServerName.getPort()); // This part relies on a number of tries equals to 1. // We do a put and expect the cache to be updated, even if we don't retry @@ -706,10 +709,13 @@ public class TestHCM { Assert.assertNotNull("Cached connection is null", conn.getCachedLocation(TABLE_NAME, ROW)); Assert.assertEquals( "Previous server was " + curServer.getServerName().getHostAndPort(), - destServerName.getPort(), conn.getCachedLocation(TABLE_NAME, ROW).getPort()); + destServerName.getPort(), + conn.getCachedLocation(TABLE_NAME, ROW).getRegionLocation().getPort()); - Assert.assertFalse(destServer.getRegionsInTransitionInRS().containsKey(encodedRegionNameBytes)); - Assert.assertFalse(curServer.getRegionsInTransitionInRS().containsKey(encodedRegionNameBytes)); + Assert.assertFalse(destServer.getRegionsInTransitionInRS() + .containsKey(encodedRegionNameBytes)); + Assert.assertFalse(curServer.getRegionsInTransitionInRS() + .containsKey(encodedRegionNameBytes)); // We move it back to do another test with a scan LOG.info("Move starting region=" + toMove.getRegionInfo().getRegionNameAsString()); @@ -732,7 +738,7 @@ public class TestHCM { LOG.info("Move finished for region=" + toMove.getRegionInfo().getRegionNameAsString()); // Cache was NOT updated and points to the wrong server - Assert.assertFalse(conn.getCachedLocation(TABLE_NAME, ROW).getPort() == + Assert.assertFalse(conn.getCachedLocation(TABLE_NAME, ROW).getRegionLocation().getPort() == curServer.getServerName().getPort()); Scan sc = new Scan(); @@ -756,7 +762,8 @@ public class TestHCM { Assert.assertNotNull(conn.getCachedLocation(TABLE_NAME, ROW)); Assert.assertEquals( "Previous server was "+destServer.getServerName().getHostAndPort(), - curServer.getServerName().getPort(), conn.getCachedLocation(TABLE_NAME, ROW).getPort()); + curServer.getServerName().getPort(), + conn.getCachedLocation(TABLE_NAME, ROW).getRegionLocation().getPort()); TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER); @@ -796,7 +803,7 @@ public class TestHCM { ConnectionManager.HConnectionImplementation conn = (ConnectionManager.HConnectionImplementation)table.getConnection(); - HRegionLocation location = conn.getCachedLocation(TABLE_NAME2, ROW); + HRegionLocation location = conn.getCachedLocation(TABLE_NAME2, ROW).getRegionLocation(); assertNotNull(location); ServerName anySource = ServerName.valueOf(location.getHostname(), location.getPort() - 1, 0L); @@ -805,28 +812,28 @@ public class TestHCM { int nextPort = location.getPort() + 1; conn.updateCachedLocation(location.getRegionInfo(), location.getServerName(), ServerName.valueOf("127.0.0.1", nextPort, 0), location.getSeqNum() - 1); - location = conn.getCachedLocation(TABLE_NAME2, ROW); + location = conn.getCachedLocation(TABLE_NAME2, ROW).getRegionLocation(); Assert.assertEquals(nextPort, location.getPort()); // No source specified - same. nextPort = location.getPort() + 1; conn.updateCachedLocation(location.getRegionInfo(), location.getServerName(), ServerName.valueOf("127.0.0.1", nextPort, 0), location.getSeqNum() - 1); - location = conn.getCachedLocation(TABLE_NAME2, ROW); + location = conn.getCachedLocation(TABLE_NAME2, ROW).getRegionLocation(); Assert.assertEquals(nextPort, location.getPort()); // Higher seqNum - overwrites lower seqNum. nextPort = location.getPort() + 1; conn.updateCachedLocation(location.getRegionInfo(), anySource, ServerName.valueOf("127.0.0.1", nextPort, 0), location.getSeqNum() + 1); - location = conn.getCachedLocation(TABLE_NAME2, ROW); + location = conn.getCachedLocation(TABLE_NAME2, ROW).getRegionLocation(); Assert.assertEquals(nextPort, location.getPort()); // Lower seqNum - does not overwrite higher seqNum. nextPort = location.getPort() + 1; conn.updateCachedLocation(location.getRegionInfo(), anySource, ServerName.valueOf("127.0.0.1", nextPort, 0), location.getSeqNum() - 1); - location = conn.getCachedLocation(TABLE_NAME2, ROW); + location = conn.getCachedLocation(TABLE_NAME2, ROW).getRegionLocation(); Assert.assertEquals(nextPort - 1, location.getPort()); table.close(); } @@ -1024,7 +1031,7 @@ public class TestHCM { table.put(put); // Now moving the region to the second server - HRegionLocation toMove = conn.getCachedLocation(TABLE_NAME3, ROW_X); + HRegionLocation toMove = conn.getCachedLocation(TABLE_NAME3, ROW_X).getRegionLocation(); byte[] regionName = toMove.getRegionInfo().getRegionName(); byte[] encodedRegionNameBytes = toMove.getRegionInfo().getEncodedNameAsBytes(); @@ -1090,7 +1097,8 @@ public class TestHCM { // Cache was NOT updated and points to the wrong server Assert.assertFalse( - conn.getCachedLocation(TABLE_NAME3, ROW_X).getPort() == destServerName.getPort()); + conn.getCachedLocation(TABLE_NAME3, ROW_X).getRegionLocation() + .getPort() == destServerName.getPort()); // Hijack the number of retry to fail after 2 tries final int prevNumRetriesVal = setNumTries(conn, 2); http://git-wip-us.apache.org/repos/asf/hbase/blob/d4b82224/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java index 1ee256b..db4e5cf 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java @@ -18,6 +18,7 @@ */ package org.apache.hadoop.hbase.regionserver; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -33,11 +34,15 @@ import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.SmallTests; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.exceptions.DeserializationException; +import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos; +import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionInfo; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.MD5Hash; import org.junit.Test; import org.junit.experimental.categories.Category; +import com.google.protobuf.ByteString; + @Category(SmallTests.class) public class TestHRegionInfo { @Test @@ -101,7 +106,7 @@ public class TestHRegionInfo { + id + "." + md5HashInHex + ".", nameStr); } - + @Test public void testContainsRange() { HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf("testtable")); @@ -121,7 +126,7 @@ public class TestHRegionInfo { assertFalse(hri.containsRange(Bytes.toBytes("g"), Bytes.toBytes("g"))); // Single row range entirely outside assertFalse(hri.containsRange(Bytes.toBytes("z"), Bytes.toBytes("z"))); - + // Degenerate range try { hri.containsRange(Bytes.toBytes("z"), Bytes.toBytes("a")); @@ -149,13 +154,106 @@ public class TestHRegionInfo { public void testComparator() { TableName tablename = TableName.valueOf("comparatorTablename"); byte[] empty = new byte[0]; - HRegionInfo older = new HRegionInfo(tablename, empty, empty, false, 0L); - HRegionInfo newer = new HRegionInfo(tablename, empty, empty, false, 1L); + HRegionInfo older = new HRegionInfo(tablename, empty, empty, false, 0L); + HRegionInfo newer = new HRegionInfo(tablename, empty, empty, false, 1L); assertTrue(older.compareTo(newer) < 0); assertTrue(newer.compareTo(older) > 0); assertTrue(older.compareTo(older) == 0); assertTrue(newer.compareTo(newer) == 0); } - + + @Test + public void testRegionNameForRegionReplicas() throws Exception { + String tableName = "tablename"; + final TableName tn = TableName.valueOf(tableName); + String startKey = "startkey"; + final byte[] sk = Bytes.toBytes(startKey); + String id = "id"; + + // assert with only the region name without encoding + + // primary, replicaId = 0 + byte [] name = HRegionInfo.createRegionName(tn, sk, Bytes.toBytes(id), 0, false); + String nameStr = Bytes.toString(name); + assertEquals(tableName + "," + startKey + "," + id, nameStr); + + // replicaId = 1 + name = HRegionInfo.createRegionName(tn, sk, Bytes.toBytes(id), 1, false); + nameStr = Bytes.toString(name); + assertEquals(tableName + "," + startKey + "," + id + "_" + + String.format(HRegionInfo.REPLICA_ID_FORMAT, 1), nameStr); + + // replicaId = max + name = HRegionInfo.createRegionName(tn, sk, Bytes.toBytes(id), 0xFFFF, false); + nameStr = Bytes.toString(name); + assertEquals(tableName + "," + startKey + "," + id + "_" + + String.format(HRegionInfo.REPLICA_ID_FORMAT, 0xFFFF), nameStr); + } + + @Test + public void testParseName() throws IOException { + TableName tableName = TableName.valueOf("testParseName"); + byte[] startKey = Bytes.toBytes("startKey"); + long regionId = System.currentTimeMillis(); + int replicaId = 42; + + // test without replicaId + byte[] regionName = HRegionInfo.createRegionName(tableName, startKey, regionId, false); + + byte[][] fields = HRegionInfo.parseRegionName(regionName); + assertArrayEquals(Bytes.toString(fields[0]),tableName.getName(), fields[0]); + assertArrayEquals(Bytes.toString(fields[1]),startKey, fields[1]); + assertArrayEquals(Bytes.toString(fields[2]), Bytes.toBytes(Long.toString(regionId)),fields[2]); + assertEquals(3, fields.length); + + // test with replicaId + regionName = HRegionInfo.createRegionName(tableName, startKey, regionId, + replicaId, false); + + fields = HRegionInfo.parseRegionName(regionName); + assertArrayEquals(Bytes.toString(fields[0]),tableName.getName(), fields[0]); + assertArrayEquals(Bytes.toString(fields[1]),startKey, fields[1]); + assertArrayEquals(Bytes.toString(fields[2]), Bytes.toBytes(Long.toString(regionId)),fields[2]); + assertArrayEquals(Bytes.toString(fields[3]), Bytes.toBytes( + String.format(HRegionInfo.REPLICA_ID_FORMAT, replicaId)), fields[3]); + } + + @Test + public void testConvert() { + TableName tableName = TableName.valueOf("ns1:table1"); + byte[] startKey = Bytes.toBytes("startKey"); + byte[] endKey = Bytes.toBytes("endKey"); + boolean split = false; + long regionId = System.currentTimeMillis(); + int replicaId = 42; + + + HRegionInfo hri = new HRegionInfo(tableName, startKey, endKey, split, + regionId, replicaId); + + // convert two times, compare + HRegionInfo convertedHri = HRegionInfo.convert(HRegionInfo.convert(hri)); + + assertEquals(hri, convertedHri); + + // test convert RegionInfo without replicaId + RegionInfo info = RegionInfo.newBuilder() + .setTableName(HBaseProtos.TableName.newBuilder() + .setQualifier(ByteString.copyFrom(tableName.getQualifier())) + .setNamespace(ByteString.copyFrom(tableName.getNamespace())) + .build()) + .setStartKey(ByteString.copyFrom(startKey)) + .setEndKey(ByteString.copyFrom(endKey)) + .setSplit(split) + .setRegionId(regionId) + .build(); + + convertedHri = HRegionInfo.convert(info); + HRegionInfo expectedHri = new HRegionInfo(tableName, startKey, endKey, split, + regionId, 0); // expecting default replicaId + + assertEquals(expectedHri, convertedHri); + } + }
