You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by dp...@apache.org on 2006/12/13 10:24:07 UTC

svn commit: r486557 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: cluster/ClusterNode.java cluster/Journal.java cluster/NamespaceEventListener.java state/SharedItemStateManager.java

Author: dpfister
Date: Wed Dec 13 01:24:06 2006
New Revision: 486557

URL: http://svn.apache.org/viewvc?view=rev&rev=486557
Log:
JCR-623 - Clustering
+ Don't log changes that occur before cluster node is started
+ Handle missing added nodes in external notifications more gracefully

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/Journal.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/NamespaceEventListener.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java?view=diff&rev=486557&r1=486556&r2=486557
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/ClusterNode.java Wed Dec 13 01:24:06 2006
@@ -56,6 +56,21 @@
     private static final String SHORT_PADDING = "0000";
 
     /**
+     * Status constant.
+     */
+    private static final int NONE = 0;
+
+    /**
+     * Status constant.
+     */
+    private static final int STARTED = 1;
+
+    /**
+     * Status constant.
+     */
+    private static final int STOPPED = 2;
+
+    /**
      * Logger.
      */
     private static Logger log = LoggerFactory.getLogger(ClusterNode.class);
@@ -86,9 +101,9 @@
     private final Mutex syncLock = new Mutex();
 
     /**
-     * Flag indicating whether this cluster node is stopped.
+     * Status flag, one of {@link #NONE}, {@link #STARTED} or {@link #STOPPED}.
      */
-    private boolean stopped;
+    private int status;
 
     /**
      * Map of available lock listeners, indexed by workspace name.
@@ -150,11 +165,15 @@
      * @throws ClusterException if an error occurs
      */
     public synchronized void start() throws ClusterException {
-        sync();
+        if (status == NONE) {
+            sync();
 
-        Thread t = new Thread(this, "ClusterNode-" + clusterNodeId);
-        t.setDaemon(true);
-        t.start();
+            Thread t = new Thread(this, "ClusterNode-" + clusterNodeId);
+            t.setDaemon(true);
+            t.start();
+
+            status = STARTED;
+        }
     }
 
     /**
@@ -167,7 +186,7 @@
                     wait(syncDelay * 1000);
                 } catch (InterruptedException e) {}
 
-                if (stopped) {
+                if (status == STOPPED) {
                     return;
                 }
             }
@@ -203,7 +222,7 @@
      * {@inheritDoc}
      */
     public synchronized void stop() {
-        stopped = true;
+        status = STOPPED;
 
         notifyAll();
     }
@@ -217,6 +236,10 @@
      * @param owner lock owner
      */
     private void locked(String workspace, NodeId nodeId, boolean deep, String owner) {
+        if (status != STARTED) {
+            log.info("not started: lock operation ignored.");
+            return;
+        }
         boolean succeeded = false;
 
         try {
@@ -245,6 +268,10 @@
      * @param nodeId node id
      */
     private void unlocked(String workspace, NodeId nodeId) {
+        if (status != STARTED) {
+            log.info("not started: unlock operation ignored.");
+            return;
+        }
         boolean succeeded = false;
 
         try {
@@ -324,6 +351,10 @@
      * {@inheritDoc}
      */
     public void updateCreated() {
+        if (status != STARTED) {
+            log.info("not started: update create ignored.");
+            return;
+        }
         try {
             sync();
         } catch (ClusterException e) {
@@ -353,6 +384,10 @@
      * @param esc events as they will be delivered on success
      */
     private void updatePrepared(String workspace, ChangeLog changes, EventStateCollection esc) {
+        if (status != STARTED) {
+            log.info("not started: update prepare ignored.");
+            return;
+        }
         boolean succeeded = false;
 
         try {
@@ -377,6 +412,10 @@
      * {@inheritDoc}
      */
     public void updateCommitted() {
+        if (status != STARTED) {
+            log.info("not started: update commit ignored.");
+            return;
+        }
         try {
             journal.commit();
         } catch (JournalException e) {
@@ -392,6 +431,10 @@
      * {@inheritDoc}
      */
     public void updateCancelled() {
+        if (status != STARTED) {
+            log.info("not started: update cancel ignored.");
+            return;
+        }
         journal.cancel();
     }
 
@@ -410,6 +453,10 @@
      * {@inheritDoc}
      */
     public void remapped(String oldPrefix, String newPrefix, String uri) {
+        if (status != STARTED) {
+            log.info("not started: namespace operation ignored.");
+            return;
+        }
         boolean succeeded = false;
 
         try {
@@ -441,6 +488,10 @@
      * {@inheritDoc}
      */
     public void registered(Collection ntDefs) {
+        if (status != STARTED) {
+            log.info("not started: nodetype operation ignored.");
+            return;
+        }
         boolean succeeded = false;
 
         try {

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/Journal.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/Journal.java?view=diff&rev=486557&r1=486556&r2=486557
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/Journal.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/Journal.java Wed Dec 13 01:24:06 2006
@@ -19,9 +19,7 @@
 import org.apache.jackrabbit.core.state.ChangeLog;
 import org.apache.jackrabbit.core.observation.EventStateCollection;
 import org.apache.jackrabbit.core.NodeId;
-import org.apache.jackrabbit.core.nodetype.NodeTypeDef;
 import org.apache.jackrabbit.name.NamespaceResolver;
-import org.apache.jackrabbit.name.QName;
 
 import java.util.Collection;
 

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/NamespaceEventListener.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/NamespaceEventListener.java?view=diff&rev=486557&r1=486556&r2=486557
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/NamespaceEventListener.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/cluster/NamespaceEventListener.java Wed Dec 13 01:24:06 2006
@@ -16,8 +16,6 @@
  */
 package org.apache.jackrabbit.core.cluster;
 
-import org.apache.jackrabbit.core.NodeId;
-
 import javax.jcr.RepositoryException;
 
 /**

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?view=diff&rev=486557&r1=486556&r2=486557
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java Wed Dec 13 01:24:06 2006
@@ -820,6 +820,9 @@
         ChangeLog shared = new ChangeLog();
 
         try {
+            // Build a copy of the external change log, consisting of shared
+            // states we have in our cache. Inform listeners about this
+            // change.
             acquireWriteLock();
             holdingWriteLock = true;
 
@@ -833,6 +836,12 @@
                         state.copy(currentState);
                         state.setModCount(currentState.getModCount());
                         shared.modified(state);
+                    } catch (NoSuchItemStateException e) {
+                        // This is likely to happen because a subsequent delete
+                        // of this very state has not yet been transmitted.
+                        String msg = "Unable to retrieve state: " + state.getId() + ", ignored.";
+                        log.info(msg);
+                        state.discard();
                     } catch (ItemStateException e) {
                         String msg = "Unable to retrieve state: " + state.getId();
                         log.warn(msg);