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 "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 The default is UTF-8. To change the encoding of POSTed content, use the
"Content-Type" HTTP header. (Uwe Schindler, David Smiley) "Content-Type" HTTP header. (Uwe Schindler, David Smiley)
* SOLR-4221: Custom sharding (Noble Paul) * 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-5006: CREATESHARD command for 'implicit' shards (Noble Paul)
* SOLR-5017: Allow sharding based on the value of a field (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-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. * SOLR-5165: Single-valued docValues fields no longer require a default value.
Additionally they work with sortMissingFirst, sortMissingLast, facet.missing, Additionally they work with sortMissingFirst, sortMissingLast, facet.missing,
@ -187,6 +195,9 @@ Bug Fixes
* SOLR-5206: Fixed OpenExchangeRatesOrgProvider to use refreshInterval correctly * SOLR-5206: Fixed OpenExchangeRatesOrgProvider to use refreshInterval correctly
(Catalin, hossman) (Catalin, hossman)
* SOLR-5215: Fix possibility of deadlock in ZooKeeper ConnectionManager.
(Mark Miller, Ricardo Merizalde)
Optimizations Optimizations
---------------------- ----------------------

View File

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