SOLR-5215: Fix possibility of deadlock in ZooKeeper ConnectionManager.

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1521236 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Mark Robert Miller 2013-09-09 18:36:11 +00:00
parent 9cedad9cd1
commit 19f9181c74
2 changed files with 44 additions and 37 deletions

View File

@ -101,13 +101,21 @@ New Features
the "ie" (input encoding) parameter, e.g. "select?q=m%FCller&ie=ISO-8859-1".
The default is UTF-8. To change the encoding of POSTed content, use the
"Content-Type" HTTP header. (Uwe Schindler, David Smiley)
* SOLR-4221: Custom sharding (Noble Paul)
* SOLR-4808: Persist and use router,replicationFactor and maxShardsPerNode at Collection and Shard level (Noble Paul, Shalin Mangar)
* SOLR-4808: Persist and use router,replicationFactor and maxShardsPerNode at Collection
and Shard level (Noble Paul, Shalin Mangar)
* SOLR-5006: CREATESHARD command for 'implicit' shards (Noble Paul)
* SOLR-5017: Allow sharding based on the value of a field (Noble Paul)
* SOLR-4222: create custom sharded collection via collections API (Noble Paul)
* SOLR-4718: Allow solr.xml to be stored in ZooKeeper
* SOLR-5156: Enhance ZkCLI to allow uploading of arbitrary files to ZK.
* SOLR-4718: Allow solr.xml to be stored in ZooKeeper. (Mark Miller, Erick Erickson)
* SOLR-5156: Enhance ZkCLI to allow uploading of arbitrary files to ZK. (Erick Erickson)
* SOLR-5165: Single-valued docValues fields no longer require a default value.
Additionally they work with sortMissingFirst, sortMissingLast, facet.missing,
@ -187,6 +195,9 @@ Bug Fixes
* SOLR-5206: Fixed OpenExchangeRatesOrgProvider to use refreshInterval correctly
(Catalin, hossman)
* SOLR-5215: Fix possibility of deadlock in ZooKeeper ConnectionManager.
(Mark Miller, Ricardo Merizalde)
Optimizations
----------------------

View File

@ -37,16 +37,14 @@ class ConnectionManager implements Watcher {
private boolean connected;
private final ZkClientConnectionStrategy connectionStrategy;
private Object connectionUpdateLock = new Object();
private String zkServerAddress;
private final String zkServerAddress;
private int zkClientTimeout;
private final int zkClientTimeout;
private SolrZkClient client;
private final SolrZkClient client;
private OnReconnect onReconnect;
private final OnReconnect onReconnect;
private volatile boolean isClosed = false;
@ -92,37 +90,35 @@ class ConnectionManager implements Watcher {
new ZkClientConnectionStrategy.ZkUpdate() {
@Override
public void update(SolrZooKeeper keeper) {
// if keeper does not replace oldKeeper we must be sure to close it
synchronized (connectionUpdateLock) {
try {
waitForConnected(Long.MAX_VALUE);
} catch (Exception e1) {
closeKeeper(keeper);
throw new RuntimeException(e1);
}
log.info("Connection with ZooKeeper reestablished.");
try {
client.updateKeeper(keeper);
} catch (InterruptedException e) {
closeKeeper(keeper);
Thread.currentThread().interrupt();
// we must have been asked to stop
throw new RuntimeException(e);
} catch(Throwable t) {
closeKeeper(keeper);
throw new RuntimeException(t);
}
if (onReconnect != null) {
onReconnect.command();
}
synchronized (ConnectionManager.this) {
ConnectionManager.this.connected = true;
}
try {
waitForConnected(Long.MAX_VALUE);
} catch (Exception e1) {
closeKeeper(keeper);
throw new RuntimeException(e1);
}
log.info("Connection with ZooKeeper reestablished.");
try {
client.updateKeeper(keeper);
} catch (InterruptedException e) {
closeKeeper(keeper);
Thread.currentThread().interrupt();
// we must have been asked to stop
throw new RuntimeException(e);
} catch (Throwable t) {
closeKeeper(keeper);
throw new RuntimeException(t);
}
if (onReconnect != null) {
onReconnect.command();
}
synchronized (ConnectionManager.this) {
ConnectionManager.this.connected = true;
}
}
});
} catch (Exception e) {
SolrException.log(log, "", e);