HBASE-2027 HConnectionManager.HBASE_INSTANCES leaks TableServers
git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@888202 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
28b6d90a93
commit
d0b61e75ae
|
@ -219,6 +219,8 @@ Release 0.21.0 - Unreleased
|
||||||
HBASE-2019 [EC2] remember credentials if not configured
|
HBASE-2019 [EC2] remember credentials if not configured
|
||||||
HBASE-2029 Reduce shell exception dump on console
|
HBASE-2029 Reduce shell exception dump on console
|
||||||
(Lars George and J-D via Stack)
|
(Lars George and J-D via Stack)
|
||||||
|
HBASE-2027 HConnectionManager.HBASE_INSTANCES leaks TableServers
|
||||||
|
(Dave Latham via Stack)
|
||||||
|
|
||||||
NEW FEATURES
|
NEW FEATURES
|
||||||
HBASE-1901 "General" partitioner for "hbase-48" bulk (behind the api, write
|
HBASE-1901 "General" partitioner for "hbase-48" bulk (behind the api, write
|
||||||
|
|
|
@ -52,7 +52,7 @@ public class HBaseConfiguration extends Configuration {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the hash code value for this HBaseConfiguration. The hash code of a
|
* Returns the hash code value for this HBaseConfiguration. The hash code of a
|
||||||
* HBaseConfiguration is defined by the sum of the hash codes of its entries.
|
* HBaseConfiguration is defined by the xor of the hash codes of its entries.
|
||||||
*
|
*
|
||||||
* @see Configuration#iterator() How the entries are obtained.
|
* @see Configuration#iterator() How the entries are obtained.
|
||||||
*/
|
*/
|
||||||
|
@ -66,5 +66,32 @@ public class HBaseConfiguration extends Configuration {
|
||||||
}
|
}
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (!(obj instanceof HBaseConfiguration))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
HBaseConfiguration otherConf = (HBaseConfiguration) obj;
|
||||||
|
if (size() != otherConf.size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Iterator<Entry<String, String>> propertyIterator = this.iterator();
|
||||||
|
while (propertyIterator.hasNext()) {
|
||||||
|
Entry<String, String> entry = propertyIterator.next();
|
||||||
|
String key = entry.getKey();
|
||||||
|
String value = entry.getValue();
|
||||||
|
if (!value.equals(otherConf.getRaw(key))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,10 +24,10 @@ import java.lang.reflect.UndeclaredThrowableException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
import java.util.WeakHashMap;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
|
@ -85,12 +85,20 @@ public class HConnectionManager implements HConstants {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Map of master HBaseConfiguration -> connection information for that
|
private static final int MAX_CACHED_HBASE_INSTANCES=31;
|
||||||
// instance. Note that although the Map is synchronized, the objects it
|
// A LRU Map of master HBaseConfiguration -> connection information for that
|
||||||
// contains are mutable and hence require synchronized access to them
|
// instance. The objects it contains are mutable and hence require
|
||||||
|
// synchronized access to them. We set instances to 31. The zk default max
|
||||||
|
// connections is 30 so should run into zk issues before hit this value of 31.
|
||||||
private static
|
private static
|
||||||
final Map<HBaseConfiguration, TableServers> HBASE_INSTANCES =
|
final Map<HBaseConfiguration, TableServers> HBASE_INSTANCES =
|
||||||
new WeakHashMap<HBaseConfiguration, TableServers>();
|
new LinkedHashMap<HBaseConfiguration, TableServers>
|
||||||
|
((int) (MAX_CACHED_HBASE_INSTANCES/0.75F)+1, 0.75F, true) {
|
||||||
|
@Override
|
||||||
|
protected boolean removeEldestEntry(Map.Entry<HBaseConfiguration, TableServers> eldest) {
|
||||||
|
return size() > MAX_CACHED_HBASE_INSTANCES;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
private static final Map<String, ClientZKWatcher> ZK_WRAPPERS =
|
private static final Map<String, ClientZKWatcher> ZK_WRAPPERS =
|
||||||
new HashMap<String, ClientZKWatcher>();
|
new HashMap<String, ClientZKWatcher>();
|
||||||
|
|
Loading…
Reference in New Issue