You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2013/04/23 19:18:13 UTC
svn commit: r1471055 - in /hbase/branches/0.95:
hbase-client/src/main/java/org/apache/hadoop/hbase/
hbase-server/src/test/java/org/apache/hadoop/hbase/
Author: stack
Date: Tue Apr 23 17:18:12 2013
New Revision: 1471055
URL: http://svn.apache.org/r1471055
Log:
HBASE-7579 HTableDescriptor equals method fails if results are returned in a different order
Modified:
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java
hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHColumnDescriptor.java
hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java
Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java?rev=1471055&r1=1471054&r2=1471055&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java (original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java Tue Apr 23 17:18:12 2013
@@ -1125,12 +1125,10 @@ public class HColumnDescriptor implement
public int compareTo(HColumnDescriptor o) {
int result = Bytes.compareTo(this.name, o.getName());
if (result == 0) {
- // punt on comparison for ordering, just calculate difference
- result = this.values.hashCode() - o.values.hashCode();
- if (result < 0)
- result = -1;
- else if (result > 0)
- result = 1;
+ // The maps interface should compare values, even if they're in different orders
+ if (!this.values.equals(o.values)) {
+ return 1;
+ }
}
if (result == 0) {
result = this.configuration.hashCode() - o.configuration.hashCode();
Modified: hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java?rev=1471055&r1=1471054&r2=1471055&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java (original)
+++ hbase/branches/0.95/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java Tue Apr 23 17:18:12 2013
@@ -225,9 +225,7 @@ public class HTableDescriptor implements
* catalog tables, <code>.META.</code> and <code>-ROOT-</code>.
*/
protected HTableDescriptor(final byte [] name, HColumnDescriptor[] families) {
- this.name = name.clone();
- this.nameAsString = Bytes.toString(this.name);
- setMetaFlags(name);
+ setName(name);
for(HColumnDescriptor descriptor : families) {
this.families.put(descriptor.getName(), descriptor);
}
@@ -239,12 +237,7 @@ public class HTableDescriptor implements
*/
protected HTableDescriptor(final byte [] name, HColumnDescriptor[] families,
Map<ImmutableBytesWritable,ImmutableBytesWritable> values) {
- this.name = name.clone();
- this.nameAsString = Bytes.toString(this.name);
- setMetaFlags(name);
- for(HColumnDescriptor descriptor : families) {
- this.families.put(descriptor.getName(), descriptor);
- }
+ this(name.clone(), families);
for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> entry:
values.entrySet()) {
setValue(entry.getKey(), entry.getValue());
@@ -284,9 +277,7 @@ public class HTableDescriptor implements
*/
public HTableDescriptor(final byte [] name) {
super();
- setMetaFlags(this.name);
- this.name = this.isMetaRegion()? name: isLegalTableName(name);
- this.nameAsString = Bytes.toString(this.name);
+ setName(name);
}
/**
@@ -298,9 +289,7 @@ public class HTableDescriptor implements
*/
public HTableDescriptor(final HTableDescriptor desc) {
super();
- this.name = desc.name.clone();
- this.nameAsString = Bytes.toString(this.name);
- setMetaFlags(this.name);
+ setName(desc.name.clone());
for (HColumnDescriptor c: desc.families.values()) {
this.families.put(c.getName(), new HColumnDescriptor(c));
}
@@ -650,9 +639,13 @@ public class HTableDescriptor implements
* Set the name of the table.
*
* @param name name of table
+ * @throws IllegalArgumentException if passed a table name
+ * that is made of other than 'word' characters, underscore or period: i.e.
+ * <code>[a-zA-Z_0-9.].
+ * @see <a href="HADOOP-1581">HADOOP-1581 HBASE: Un-openable tablename bug</a>
*/
public void setName(byte[] name) {
- this.name = name;
+ this.name = isMetaTable(name) ? name : isLegalTableName(name);
this.nameAsString = Bytes.toString(this.name);
setMetaFlags(this.name);
}
@@ -987,39 +980,34 @@ public class HTableDescriptor implements
*/
@Override
public int compareTo(final HTableDescriptor other) {
+ // Check name matches
int result = Bytes.compareTo(this.name, other.name);
- if (result == 0) {
- result = families.size() - other.families.size();
- }
- if (result == 0 && families.size() != other.families.size()) {
- result = Integer.valueOf(families.size()).compareTo(
- Integer.valueOf(other.families.size()));
- }
- if (result == 0) {
- for (Iterator<HColumnDescriptor> it = families.values().iterator(),
- it2 = other.families.values().iterator(); it.hasNext(); ) {
- result = it.next().compareTo(it2.next());
- if (result != 0) {
- break;
- }
+ if (result != 0) return result;
+
+ // Check size matches
+ result = families.size() - other.families.size();
+ if (result != 0) return result;
+
+ // Compare that all column families
+ for (Iterator<HColumnDescriptor> it = families.values().iterator(),
+ it2 = other.families.values().iterator(); it.hasNext(); ) {
+ result = it.next().compareTo(it2.next());
+ if (result != 0) {
+ return result;
}
}
- if (result == 0) {
- // punt on comparison for ordering, just calculate difference
- result = this.values.hashCode() - other.values.hashCode();
- if (result < 0)
- result = -1;
- else if (result > 0)
- result = 1;
- }
- if (result == 0) {
- result = this.configuration.hashCode() - other.configuration.hashCode();
- if (result < 0)
- result = -1;
- else if (result > 0)
- result = 1;
+
+ // Compare values
+ if (!values.equals(other.values)) {
+ return 1;
}
- return result;
+
+ // Compare configuration
+ if (!configuration.equals(other.configuration)) {
+ return 1;
+ }
+
+ return 0;
}
/**
Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHColumnDescriptor.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHColumnDescriptor.java?rev=1471055&r1=1471054&r2=1471055&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHColumnDescriptor.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHColumnDescriptor.java Tue Apr 23 17:18:12 2013
@@ -18,12 +18,14 @@
package org.apache.hadoop.hbase;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.apache.hadoop.hbase.exceptions.DeserializationException;
import org.apache.hadoop.hbase.io.compress.Compression;
import org.apache.hadoop.hbase.io.compress.Compression.Algorithm;
import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;
+import org.apache.hadoop.hbase.io.hfile.BlockType;
import org.apache.hadoop.hbase.regionserver.BloomType;
import org.junit.experimental.categories.Category;
@@ -94,4 +96,71 @@ public class TestHColumnDescriptor {
desc.removeConfiguration(key);
assertEquals(null, desc.getConfigurationValue(key));
}
+
+ @Test
+ public void testEqualsWithFamilyName() {
+ final String name1 = "someFamilyName";
+ HColumnDescriptor hcd1 = new HColumnDescriptor(name1);
+ HColumnDescriptor hcd2 = new HColumnDescriptor("someOtherFamilyName");
+ HColumnDescriptor hcd3 = new HColumnDescriptor(name1);
+
+ assertFalse(hcd1.equals(hcd2));
+ assertFalse(hcd2.equals(hcd1));
+
+ assertTrue(hcd3.equals(hcd1));
+ assertTrue(hcd1.equals(hcd3));
+ }
+
+ @Test
+ public void testEqualsWithAdditionalProperties() {
+ final String name1 = "someFamilyName";
+ HColumnDescriptor hcd1 = new HColumnDescriptor(name1);
+ HColumnDescriptor hcd2 = new HColumnDescriptor(name1);
+ hcd2.setBlocksize(4);
+
+ assertFalse(hcd1.equals(hcd2));
+ assertFalse(hcd2.equals(hcd1));
+
+ hcd1.setBlocksize(4);
+
+ assertTrue(hcd2.equals(hcd1));
+ assertTrue(hcd1.equals(hcd2));
+ }
+
+ @Test
+ public void testEqualsWithDifferentNumberOfProperties() {
+ final String name1 = "someFamilyName";
+ HColumnDescriptor hcd1 = new HColumnDescriptor(name1);
+ HColumnDescriptor hcd2 = new HColumnDescriptor(name1);
+ hcd2.setBlocksize(4);
+ hcd1.setBlocksize(4);
+
+ assertTrue(hcd2.equals(hcd1));
+ assertTrue(hcd1.equals(hcd2));
+
+ hcd2.setBloomFilterType(BloomType.ROW);
+
+ assertFalse(hcd1.equals(hcd2));
+ assertFalse(hcd2.equals(hcd1));
+ }
+
+ @Test
+ public void testEqualsWithDifferentOrderingOfProperties() {
+ final String name1 = "someFamilyName";
+ HColumnDescriptor hcd1 = new HColumnDescriptor(name1);
+ HColumnDescriptor hcd2 = new HColumnDescriptor(name1);
+ hcd2.setBlocksize(4);
+ hcd2.setBloomFilterType(BloomType.ROW);
+ hcd1.setBloomFilterType(BloomType.ROW);
+ hcd1.setBlocksize(4);
+
+ assertTrue(hcd2.equals(hcd1));
+ assertTrue(hcd1.equals(hcd2));
+ }
+
+ @Test
+ public void testEqualityWithSameObject() {
+ HColumnDescriptor hcd1 = new HColumnDescriptor("someName");
+ assertTrue(hcd1.equals(hcd1));
+ }
}
Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java?rev=1471055&r1=1471054&r2=1471055&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/TestHTableDescriptor.java Tue Apr 23 17:18:12 2013
@@ -198,4 +198,173 @@ public class TestHTableDescriptor {
desc.removeConfiguration(key);
assertEquals(null, desc.getConfigurationValue(key));
}
+
+ @Test
+ public void testEqualsWithDifferentProperties() {
+ // Test basic property difference
+ HTableDescriptor h1 = new HTableDescriptor();
+ h1.setName(Bytes.toBytes("n1"));
+
+ HTableDescriptor h2 = new HTableDescriptor();
+ h2.setName(Bytes.toBytes("n2"));
+
+ assertFalse(h2.equals(h1));
+ assertFalse(h1.equals(h2));
+
+ h2.setName(Bytes.toBytes("n1"));
+ assertTrue(h2.equals(h1));
+ assertTrue(h1.equals(h2));
+ }
+
+ @Test
+ public void testEqualsWithDifferentNumberOfItems() {
+ HTableDescriptor h1 = new HTableDescriptor();
+ HTableDescriptor h2 = new HTableDescriptor();
+
+ // Test diff # of items
+ h1 = new HTableDescriptor();
+ h1.setName(Bytes.toBytes("n1"));
+
+ h2 = new HTableDescriptor();
+ h2.setName(Bytes.toBytes("n1"));
+
+ HColumnDescriptor hcd1 = new HColumnDescriptor(Bytes.toBytes("someName"));
+ HColumnDescriptor hcd2 = new HColumnDescriptor(Bytes.toBytes("someOtherName"));
+
+ h1.addFamily(hcd1);
+ h2.addFamily(hcd1);
+ h1.addFamily(hcd2);
+
+ assertFalse(h2.equals(h1));
+ assertFalse(h1.equals(h2));
+
+ h2.addFamily(hcd2);
+
+ assertTrue(h2.equals(h1));
+ assertTrue(h1.equals(h2));
+ }
+
+ @Test
+ public void testNotEqualsWithDifferentHCDs() {
+ HTableDescriptor h1 = new HTableDescriptor();
+ HTableDescriptor h2 = new HTableDescriptor();
+
+ // Test diff # of items
+ h1 = new HTableDescriptor();
+ h1.setName(Bytes.toBytes("n1"));
+
+ h2 = new HTableDescriptor();
+ h2.setName(Bytes.toBytes("n1"));
+
+ HColumnDescriptor hcd1 = new HColumnDescriptor(Bytes.toBytes("someName"));
+ HColumnDescriptor hcd2 = new HColumnDescriptor(Bytes.toBytes("someOtherName"));
+
+ h1.addFamily(hcd1);
+ h2.addFamily(hcd2);
+
+ assertFalse(h2.equals(h1));
+ assertFalse(h1.equals(h2));
+ }
+
+ @Test
+ public void testEqualsWithDifferentHCDObjects() {
+ HTableDescriptor h1 = new HTableDescriptor();
+ HTableDescriptor h2 = new HTableDescriptor();
+
+ // Test diff # of items
+ h1 = new HTableDescriptor();
+ h1.setName(Bytes.toBytes("n1"));
+
+ h2 = new HTableDescriptor();
+ h2.setName(Bytes.toBytes("n1"));
+
+ HColumnDescriptor hcd1 = new HColumnDescriptor(Bytes.toBytes("someName"));
+ HColumnDescriptor hcd2 = new HColumnDescriptor(Bytes.toBytes("someName"));
+
+ h1.addFamily(hcd1);
+ h2.addFamily(hcd2);
+
+ assertTrue(h2.equals(h1));
+ assertTrue(h1.equals(h2));
+ }
+
+ @Test
+ public void testNotEqualsWithDifferentItems() {
+ HTableDescriptor h1 = new HTableDescriptor();
+ HTableDescriptor h2 = new HTableDescriptor();
+
+ // Test diff # of items
+ h1 = new HTableDescriptor();
+ h1.setName(Bytes.toBytes("n1"));
+
+ h2 = new HTableDescriptor();
+ h2.setName(Bytes.toBytes("n1"));
+
+ HColumnDescriptor hcd1 = new HColumnDescriptor(Bytes.toBytes("someName"));
+ HColumnDescriptor hcd2 = new HColumnDescriptor(Bytes.toBytes("someOtherName"));
+ h1.addFamily(hcd1);
+ h2.addFamily(hcd2);
+
+ assertFalse(h2.equals(h1));
+ assertFalse(h1.equals(h2));
+ }
+
+ @Test
+ public void testEqualsWithDifferentOrderingsOfItems() {
+ HTableDescriptor h1 = new HTableDescriptor();
+ HTableDescriptor h2 = new HTableDescriptor();
+
+ //Test diff # of items
+ h1 = new HTableDescriptor();
+ h1.setName(Bytes.toBytes("n1"));
+
+ h2 = new HTableDescriptor();
+ h2.setName(Bytes.toBytes("n1"));
+
+ HColumnDescriptor hcd1 = new HColumnDescriptor(Bytes.toBytes("someName"));
+ HColumnDescriptor hcd2 = new HColumnDescriptor(Bytes.toBytes("someOtherName"));
+ h1.addFamily(hcd1);
+ h2.addFamily(hcd2);
+ h1.addFamily(hcd2);
+ h2.addFamily(hcd1);
+
+ assertTrue(h2.equals(h1));
+ assertTrue(h1.equals(h2));
+ }
+
+ @Test
+ public void testSingleItemEquals() {
+ HTableDescriptor h1 = new HTableDescriptor();
+ HTableDescriptor h2 = new HTableDescriptor();
+
+ //Test diff # of items
+ h1 = new HTableDescriptor();
+ h1.setName(Bytes.toBytes("n1"));
+
+ h2 = new HTableDescriptor();
+ h2.setName(Bytes.toBytes("n1"));
+
+ HColumnDescriptor hcd1 = new HColumnDescriptor(Bytes.toBytes("someName"));
+ HColumnDescriptor hcd2 = new HColumnDescriptor(Bytes.toBytes("someName"));
+ h1.addFamily(hcd1);
+ h2.addFamily(hcd2);
+
+ assertTrue(h2.equals(h1));
+ assertTrue(h1.equals(h2));
+ }
+
+ @Test
+ public void testEmptyEquals() {
+ HTableDescriptor h1 = new HTableDescriptor();
+ HTableDescriptor h2 = new HTableDescriptor();
+
+ assertTrue(h2.equals(h1));
+ assertTrue(h1.equals(h2));
+ }
+
+ @Test
+ public void testEqualityWithSameObject() {
+ HTableDescriptor htd = new HTableDescriptor("someName");
+ assertTrue(htd.equals(htd));
+ }
}