From 19f9181c749cbcd06c191c06de3ba6edcb3b1559 Mon Sep 17 00:00:00 2001 From: Mark Robert Miller Date: Mon, 9 Sep 2013 18:36:11 +0000 Subject: [PATCH] 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 --- solr/CHANGES.txt | 17 ++++- .../solr/common/cloud/ConnectionManager.java | 64 +++++++++---------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 17fc0405e53..360107e38a8 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -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 ---------------------- diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java index 1f8c40b4765..4ede215e46c 100644 --- a/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java +++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ConnectionManager.java @@ -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);