You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2012/02/24 20:35:18 UTC
svn commit: r1293391 -
/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java
Author: yonik
Date: Fri Feb 24 19:35:18 2012
New Revision: 1293391
URL: http://svn.apache.org/viewvc?rev=1293391&view=rev
Log:
SOLR-3080: separate sync for publishing coreStates
Modified:
lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java
Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1293391&r1=1293390&r2=1293391&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java Fri Feb 24 19:35:18 2012
@@ -88,6 +88,10 @@ public final class ZkController {
public final static String CONFIGNAME_PROP="configName";
private Map<String, CoreState> coreStates = null;
+ private long coreStatesVersion; // bumped by 1 each time we serialize coreStates... sync on coreStates
+ private long coreStatesPublishedVersion; // last version published to ZK... sync on coreStatesPublishLock
+ private Object coreStatesPublishLock = new Object(); // only publish one at a time
+
private final Map<String, ElectionContext> electionContexts = Collections.synchronizedMap(new HashMap<String, ElectionContext>());
private SolrZkClient zkClient;
@@ -951,11 +955,23 @@ public final class ZkController {
private void publishState() {
final String nodePath = "/node_states/" + getNodeName();
+ long version;
+ byte[] coreStatesData;
synchronized (coreStates) {
+ version = ++coreStatesVersion;
+ coreStatesData = ZkStateReader.toJSON(coreStates.values());
+ }
+
+ // if multiple threads are trying to publish state, make sure that we never write
+ // an older version after a newer version.
+ synchronized (coreStatesPublishLock) {
try {
- zkClient.setData(nodePath, ZkStateReader.toJSON(coreStates.values()),
- true);
-
+ if (version < coreStatesPublishedVersion) {
+ log.info("Another thread already published a newer coreStates: ours="+version + " lastPublished=" + coreStatesPublishedVersion);
+ } else {
+ zkClient.setData(nodePath, coreStatesData, true);
+ coreStatesPublishedVersion = version; // put it after so it won't be set if there's an exception
+ }
} catch (KeeperException e) {
throw new ZooKeeperException(SolrException.ErrorCode.SERVER_ERROR,
"could not publish node state", e);