HBASE-8123 Replace HashMap/HashSet with TreeMap/TreeSet where byte[] is used as key

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1457089 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
mbertozzi 2013-03-15 20:04:08 +00:00
parent 167766c262
commit 16589af634
6 changed files with 22 additions and 18 deletions

View File

@ -27,6 +27,7 @@ import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HRegionInfo;
import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.HRegionLocation;
import org.apache.hadoop.hbase.exceptions.ZooKeeperConnectionException; import org.apache.hadoop.hbase.exceptions.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
import java.io.IOException; import java.io.IOException;
@ -38,6 +39,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
@ -89,7 +91,7 @@ public class HTableMultiplexer {
this.serverToBufferQueueMap = new ConcurrentHashMap<HRegionLocation, this.serverToBufferQueueMap = new ConcurrentHashMap<HRegionLocation,
LinkedBlockingQueue<PutStatus>>(); LinkedBlockingQueue<PutStatus>>();
this.serverToFlushWorkerMap = new ConcurrentHashMap<HRegionLocation, HTableFlushWorker>(); this.serverToFlushWorkerMap = new ConcurrentHashMap<HRegionLocation, HTableFlushWorker>();
this.tableNameToHTableMap = new ConcurrentHashMap<byte[], HTable>(); this.tableNameToHTableMap = new ConcurrentSkipListMap<byte[], HTable>(Bytes.BYTES_COMPARATOR);
this.retryNum = conf.getInt("hbase.client.retries.number", 10); this.retryNum = conf.getInt("hbase.client.retries.number", 10);
this.perRegionServerBufferQueueSize = perRegionServerBufferQueueSize; this.perRegionServerBufferQueueSize = perRegionServerBufferQueueSize;
} }

View File

@ -19,7 +19,7 @@
package org.apache.hadoop.hbase.mapreduce; package org.apache.hadoop.hbase.mapreduce;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.TreeMap;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HBaseConfiguration;
@ -74,7 +74,7 @@ public class IndexBuilder {
public static class Map extends public static class Map extends
Mapper<ImmutableBytesWritable, Result, ImmutableBytesWritable, Put> { Mapper<ImmutableBytesWritable, Result, ImmutableBytesWritable, Put> {
private byte[] family; private byte[] family;
private HashMap<byte[], ImmutableBytesWritable> indexes; private TreeMap<byte[], ImmutableBytesWritable> indexes;
@Override @Override
protected void map(ImmutableBytesWritable rowKey, Result result, Context context) protected void map(ImmutableBytesWritable rowKey, Result result, Context context)
@ -101,7 +101,7 @@ public class IndexBuilder {
String[] fields = configuration.getStrings("index.fields"); String[] fields = configuration.getStrings("index.fields");
String familyName = configuration.get("index.familyname"); String familyName = configuration.get("index.familyname");
family = Bytes.toBytes(familyName); family = Bytes.toBytes(familyName);
indexes = new HashMap<byte[], ImmutableBytesWritable>(); indexes = new TreeMap<byte[], ImmutableBytesWritable>(Bytes.BYTES_COMPARATOR);
for(String field : fields) { for(String field : fields) {
// if the table is "people" and the field to index is "email", then the // if the table is "people" and the field to index is "email", then the
// index table will be called "people-email" // index table will be called "people-email"

View File

@ -19,7 +19,7 @@
package org.apache.hadoop.hbase.mapreduce; package org.apache.hadoop.hbase.mapreduce;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.TreeMap;
import java.util.Map; import java.util.Map;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -27,6 +27,7 @@ import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.classification.InterfaceStability;
import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.Reducer;
/** /**
@ -54,7 +55,7 @@ public class PutCombiner<K> extends Reducer<K, Put, K, Put> {
// flush could result in multiple Puts for a single rowkey. That is // flush could result in multiple Puts for a single rowkey. That is
// acceptable because Combiner is run as an optimization and it's not // acceptable because Combiner is run as an optimization and it's not
// critical that all Puts are grouped perfectly. // critical that all Puts are grouped perfectly.
Map<byte[], Put> puts = new HashMap<byte[], Put>(); Map<byte[], Put> puts = new TreeMap<byte[], Put>(Bytes.BYTES_COMPARATOR);
for (Put p : vals) { for (Put p : vals) {
cnt++; cnt++;
if (!puts.containsKey(p.getRow())) { if (!puts.containsKey(p.getRow())) {

View File

@ -27,7 +27,7 @@ import java.net.URLEncoder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.TreeMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -172,7 +172,8 @@ class FSHLog implements HLog, Syncable {
* contains the regions that are currently flushing. That way we can store two numbers for * contains the regions that are currently flushing. That way we can store two numbers for
* flushing and non-flushing (oldestUnflushedSeqNums) memstore for the same region. * flushing and non-flushing (oldestUnflushedSeqNums) memstore for the same region.
*/ */
private final Map<byte[], Long> oldestFlushingSeqNums = new HashMap<byte[], Long>(); private final Map<byte[], Long> oldestFlushingSeqNums =
new TreeMap<byte[], Long>(Bytes.BYTES_COMPARATOR);
private volatile boolean closed = false; private volatile boolean closed = false;

View File

@ -19,8 +19,6 @@ import java.net.InetAddress;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -485,7 +483,7 @@ public class AccessController extends BaseRegionObserver
public void preCreateTable(ObserverContext<MasterCoprocessorEnvironment> c, public void preCreateTable(ObserverContext<MasterCoprocessorEnvironment> c,
HTableDescriptor desc, HRegionInfo[] regions) throws IOException { HTableDescriptor desc, HRegionInfo[] regions) throws IOException {
Set<byte[]> families = desc.getFamiliesKeys(); Set<byte[]> families = desc.getFamiliesKeys();
HashMap<byte[], Set<byte[]>> familyMap = Maps.newHashMapWithExpectedSize(families.size()); Map<byte[], Set<byte[]>> familyMap = Maps.newTreeMap(Bytes.BYTES_COMPARATOR);
for (byte[] family: families) { for (byte[] family: families) {
familyMap.put(family, null); familyMap.put(family, null);
} }
@ -969,9 +967,9 @@ public class AccessController extends BaseRegionObserver
final Increment increment) final Increment increment)
throws IOException { throws IOException {
// Create a map of family to qualifiers. // Create a map of family to qualifiers.
Map<byte[], Set<byte[]>> familyMap = Maps.newHashMap(); Map<byte[], Set<byte[]>> familyMap = Maps.newTreeMap(Bytes.BYTES_COMPARATOR);
for (Map.Entry<byte [], List<? extends Cell>> entry: increment.getFamilyMap().entrySet()) { for (Map.Entry<byte [], List<? extends Cell>> entry: increment.getFamilyMap().entrySet()) {
Set<byte []> qualifiers = new HashSet<byte []>(entry.getValue().size()); Set<byte[]> qualifiers = Sets.newTreeSet(Bytes.BYTES_COMPARATOR);
for (Cell cell: entry.getValue()) { for (Cell cell: entry.getValue()) {
KeyValue kv = KeyValueUtil.ensureKeyValue(cell); KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
qualifiers.add(kv.getQualifier()); qualifiers.add(kv.getQualifier());
@ -1257,10 +1255,12 @@ public class AccessController extends BaseRegionObserver
Bytes.toString(tperm.getTable()))); Bytes.toString(tperm.getTable())));
} }
HashMap<byte[], Set<byte[]>> familyMap = Maps.newHashMapWithExpectedSize(1); Map<byte[], Set<byte[]>> familyMap = Maps.newTreeMap(Bytes.BYTES_COMPARATOR);
if (tperm.getFamily() != null) { if (tperm.getFamily() != null) {
if (tperm.getQualifier() != null) { if (tperm.getQualifier() != null) {
familyMap.put(tperm.getFamily(), Sets.newHashSet(tperm.getQualifier())); Set<byte[]> qualifiers = Sets.newTreeSet(Bytes.BYTES_COMPARATOR);
qualifiers.add(tperm.getQualifier());
familyMap.put(tperm.getFamily(), qualifiers);
} else { } else {
familyMap.put(tperm.getFamily(), null); familyMap.put(tperm.getFamily(), null);
} }
@ -1345,7 +1345,7 @@ public class AccessController extends BaseRegionObserver
return null; return null;
} }
Map<byte[], Collection<byte[]>> familyMap = Maps.newHashMapWithExpectedSize(1); Map<byte[], Collection<byte[]>> familyMap = Maps.newTreeMap(Bytes.BYTES_COMPARATOR);
familyMap.put(family, qualifier != null ? ImmutableSet.of(qualifier) : null); familyMap.put(family, qualifier != null ? ImmutableSet.of(qualifier) : null);
return familyMap; return familyMap;
} }

View File

@ -22,7 +22,7 @@ import static org.junit.Assert.*;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.HashMap; import java.util.TreeMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -317,7 +317,7 @@ public class TestHLog {
*/ */
@Test @Test
public void testFindMemstoresWithEditsEqualOrOlderThan() throws IOException { public void testFindMemstoresWithEditsEqualOrOlderThan() throws IOException {
Map<byte [], Long> regionsToSeqids = new HashMap<byte [], Long>(); Map<byte [], Long> regionsToSeqids = new TreeMap<byte [], Long>(Bytes.BYTES_COMPARATOR);
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
Long l = Long.valueOf(i); Long l = Long.valueOf(i);
regionsToSeqids.put(l.toString().getBytes(), l); regionsToSeqids.put(l.toString().getBytes(), l);