HBASE-7579 HTableDescriptor equals method fails if results are returned in a different order; REVERT -- OVERCOMMITTED

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1471053 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Stack 2013-04-23 17:17:04 +00:00
parent 2b32678420
commit 0f30646656
6 changed files with 59 additions and 308 deletions

View File

@ -36,7 +36,7 @@
usage="Usage: hbase-daemon.sh [--config <conf-dir>]\ usage="Usage: hbase-daemon.sh [--config <conf-dir>]\
(start|stop|restart|autorestart) <hbase-command> \ (start|stop|restart|autorestart) <hbase-command> \
[--formatZK] [--formatFS] <args...>" <args...>"
# if no args specified, show usage # if no args specified, show usage
if [ $# -le 1 ]; then if [ $# -le 1 ]; then
@ -57,19 +57,6 @@ shift
command=$1 command=$1
shift shift
if [ "$startStop" = "start" ];then
for i in 1 2
do
if [ "$1" = "--formatZK" ];then
formatzk=$1
shift
elif [ "$1" = "--formatFS" ];then
formatfs=$1
shift
fi
done
fi
hbase_rotate_log () hbase_rotate_log ()
{ {
log=$1; log=$1;
@ -111,10 +98,6 @@ check_before_start(){
fi fi
} }
clear_hbase_data() {
$bin/hbase-cleanup.sh $formatzk $formatfs
}
wait_until_done () wait_until_done ()
{ {
p=$1 p=$1
@ -189,7 +172,6 @@ case $startStop in
(start) (start)
check_before_start check_before_start
clear_hbase_data
nohup $thiscmd --config "${HBASE_CONF_DIR}" internal_start $command $args < /dev/null > /dev/null 2>&1 & nohup $thiscmd --config "${HBASE_CONF_DIR}" internal_start $command $args < /dev/null > /dev/null 2>&1 &
;; ;;

View File

@ -24,7 +24,7 @@
# Start hadoop hbase daemons. # Start hadoop hbase daemons.
# Run this on master node. # Run this on master node.
usage="Usage: start-hbase.sh [autorestart] [--formatZK] [--formatFS]" usage="Usage: start-hbase.sh"
bin=`dirname "${BASH_SOURCE-$0}"` bin=`dirname "${BASH_SOURCE-$0}"`
bin=`cd "$bin">/dev/null; pwd` bin=`cd "$bin">/dev/null; pwd`
@ -37,19 +37,12 @@ if [ $errCode -ne 0 ]
then then
exit $errCode exit $errCode
fi fi
for i in 1 2 3
do
if [ "$1" = "autorestart" ];then
commandToRun="autorestart"
elif [ "$1" = "--formatZK" ];then
formatzk=$1
elif [ "$1" = "--formatFS" ];then
formatfs=$1
fi
shift
done
if [ "$commandToRun" = "" ];then
if [ "$1" = "autorestart" ]
then
commandToRun="autorestart"
else
commandToRun="start" commandToRun="start"
fi fi
@ -59,10 +52,10 @@ distMode=`$bin/hbase --config "$HBASE_CONF_DIR" org.apache.hadoop.hbase.util.HBa
if [ "$distMode" == 'false' ] if [ "$distMode" == 'false' ]
then then
"$bin"/hbase-daemon.sh $commandToRun master $formatzk $formatfs "$bin"/hbase-daemon.sh $commandToRun master
else else
"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" $commandToRun zookeeper "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" $commandToRun zookeeper
"$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" $commandToRun master $formatzk $formatfs "$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" $commandToRun master
"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \ "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \
--hosts "${HBASE_REGIONSERVERS}" $commandToRun regionserver --hosts "${HBASE_REGIONSERVERS}" $commandToRun regionserver
"$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \ "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" \

View File

@ -1125,10 +1125,12 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
public int compareTo(HColumnDescriptor o) { public int compareTo(HColumnDescriptor o) {
int result = Bytes.compareTo(this.name, o.getName()); int result = Bytes.compareTo(this.name, o.getName());
if (result == 0) { if (result == 0) {
// The maps interface should compare values, even if they're in different orders // punt on comparison for ordering, just calculate difference
if (!this.values.equals(o.values)) { result = this.values.hashCode() - o.values.hashCode();
return 1; if (result < 0)
} result = -1;
else if (result > 0)
result = 1;
} }
if (result == 0) { if (result == 0) {
result = this.configuration.hashCode() - o.configuration.hashCode(); result = this.configuration.hashCode() - o.configuration.hashCode();

View File

@ -225,7 +225,9 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
* catalog tables, <code>.META.</code> and <code>-ROOT-</code>. * catalog tables, <code>.META.</code> and <code>-ROOT-</code>.
*/ */
protected HTableDescriptor(final byte [] name, HColumnDescriptor[] families) { protected HTableDescriptor(final byte [] name, HColumnDescriptor[] families) {
setName(name); this.name = name.clone();
this.nameAsString = Bytes.toString(this.name);
setMetaFlags(name);
for(HColumnDescriptor descriptor : families) { for(HColumnDescriptor descriptor : families) {
this.families.put(descriptor.getName(), descriptor); this.families.put(descriptor.getName(), descriptor);
} }
@ -237,7 +239,12 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
*/ */
protected HTableDescriptor(final byte [] name, HColumnDescriptor[] families, protected HTableDescriptor(final byte [] name, HColumnDescriptor[] families,
Map<ImmutableBytesWritable,ImmutableBytesWritable> values) { Map<ImmutableBytesWritable,ImmutableBytesWritable> values) {
this(name.clone(), families); this.name = name.clone();
this.nameAsString = Bytes.toString(this.name);
setMetaFlags(name);
for(HColumnDescriptor descriptor : families) {
this.families.put(descriptor.getName(), descriptor);
}
for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> entry: for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> entry:
values.entrySet()) { values.entrySet()) {
setValue(entry.getKey(), entry.getValue()); setValue(entry.getKey(), entry.getValue());
@ -277,7 +284,9 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
*/ */
public HTableDescriptor(final byte [] name) { public HTableDescriptor(final byte [] name) {
super(); super();
setName(name); setMetaFlags(this.name);
this.name = this.isMetaRegion()? name: isLegalTableName(name);
this.nameAsString = Bytes.toString(this.name);
} }
/** /**
@ -289,7 +298,9 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
*/ */
public HTableDescriptor(final HTableDescriptor desc) { public HTableDescriptor(final HTableDescriptor desc) {
super(); super();
setName(desc.name.clone()); this.name = desc.name.clone();
this.nameAsString = Bytes.toString(this.name);
setMetaFlags(this.name);
for (HColumnDescriptor c: desc.families.values()) { for (HColumnDescriptor c: desc.families.values()) {
this.families.put(c.getName(), new HColumnDescriptor(c)); this.families.put(c.getName(), new HColumnDescriptor(c));
} }
@ -639,13 +650,9 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
* Set the name of the table. * Set the name of the table.
* *
* @param name name of 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) { public void setName(byte[] name) {
this.name = isMetaTable(name) ? name : isLegalTableName(name); this.name = name;
this.nameAsString = Bytes.toString(this.name); this.nameAsString = Bytes.toString(this.name);
setMetaFlags(this.name); setMetaFlags(this.name);
} }
@ -980,34 +987,39 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
*/ */
@Override @Override
public int compareTo(final HTableDescriptor other) { public int compareTo(final HTableDescriptor other) {
// Check name matches
int result = Bytes.compareTo(this.name, other.name); int result = Bytes.compareTo(this.name, other.name);
if (result != 0) return result; if (result == 0) {
result = families.size() - other.families.size();
// Check size matches }
result = families.size() - other.families.size(); if (result == 0 && families.size() != other.families.size()) {
if (result != 0) return result; result = Integer.valueOf(families.size()).compareTo(
Integer.valueOf(other.families.size()));
// Compare that all column families }
for (Iterator<HColumnDescriptor> it = families.values().iterator(), if (result == 0) {
it2 = other.families.values().iterator(); it.hasNext(); ) { for (Iterator<HColumnDescriptor> it = families.values().iterator(),
result = it.next().compareTo(it2.next()); it2 = other.families.values().iterator(); it.hasNext(); ) {
if (result != 0) { result = it.next().compareTo(it2.next());
return result; if (result != 0) {
break;
}
} }
} }
if (result == 0) {
// Compare values // punt on comparison for ordering, just calculate difference
if (!values.equals(other.values)) { result = this.values.hashCode() - other.values.hashCode();
return 1; if (result < 0)
result = -1;
else if (result > 0)
result = 1;
} }
if (result == 0) {
// Compare configuration result = this.configuration.hashCode() - other.configuration.hashCode();
if (!configuration.equals(other.configuration)) { if (result < 0)
return 1; result = -1;
else if (result > 0)
result = 1;
} }
return result;
return 0;
} }
/** /**

View File

@ -18,14 +18,12 @@
package org.apache.hadoop.hbase; package org.apache.hadoop.hbase;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import org.apache.hadoop.hbase.exceptions.DeserializationException; import org.apache.hadoop.hbase.exceptions.DeserializationException;
import org.apache.hadoop.hbase.io.compress.Compression; import org.apache.hadoop.hbase.io.compress.Compression;
import org.apache.hadoop.hbase.io.compress.Compression.Algorithm; import org.apache.hadoop.hbase.io.compress.Compression.Algorithm;
import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding; 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.apache.hadoop.hbase.regionserver.BloomType;
import org.junit.experimental.categories.Category; import org.junit.experimental.categories.Category;
@ -96,71 +94,4 @@ public class TestHColumnDescriptor {
desc.removeConfiguration(key); desc.removeConfiguration(key);
assertEquals(null, desc.getConfigurationValue(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));
}
} }

View File

@ -198,173 +198,4 @@ public class TestHTableDescriptor {
desc.removeConfiguration(key); desc.removeConfiguration(key);
assertEquals(null, desc.getConfigurationValue(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));
}
} }