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);