[exo-jcr-commits] exo-jcr SVN: r973 - jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Dec 9 11:14:33 EST 2009


Author: nzamosenchuk
Date: 2009-12-09 11:14:33 -0500 (Wed, 09 Dec 2009)
New Revision: 973

Modified:
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java
   jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java
Log:
EXOJCR-291: Added code to notify Indexer's mode (RO/RW) on cache creation.

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java	2009-12-09 15:47:19 UTC (rev 972)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerCacheLoader.java	2009-12-09 16:14:33 UTC (rev 973)
@@ -144,6 +144,7 @@
     */
    public void setMode(IndexerIoMode ioMode)
    {
+      log.info("Setting indexer mode to: "+ioMode);
       if (handler != null)
       {
          try

Modified: jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java
===================================================================
--- jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java	2009-12-09 15:47:19 UTC (rev 972)
+++ jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/jbosscache/IndexerSingletonStoreCacheLoader.java	2009-12-09 16:14:33 UTC (rev 973)
@@ -19,11 +19,15 @@
 package org.exoplatform.services.jcr.impl.core.query.jbosscache;
 
 import org.exoplatform.services.jcr.impl.core.query.IndexerIoMode;
+import org.exoplatform.services.jcr.util.IdGenerator;
 import org.exoplatform.services.log.ExoLogger;
 import org.exoplatform.services.log.Log;
 import org.jboss.cache.Fqn;
 import org.jboss.cache.NodeSPI;
 import org.jboss.cache.loader.SingletonStoreCacheLoader;
+import org.jboss.cache.notifications.annotation.CacheListener;
+import org.jboss.cache.notifications.annotation.CacheStarted;
+import org.jboss.cache.notifications.event.Event;
 
 import java.util.Collection;
 import java.util.HashSet;
@@ -37,24 +41,42 @@
  */
 public class IndexerSingletonStoreCacheLoader extends SingletonStoreCacheLoader
 {
-
    private final Log log = ExoLogger.getLogger(this.getClass().getName());
 
+   @CacheListener
+   public class InitialStateListener
+   {
+      /**
+       * Cache started, check whether the node is the coordinator and set indexer mode.
+       */
+      @CacheStarted
+      public void cacheStarted(Event e)
+      {
+         // set whether this cluster node is writable or not
+         setIndexerMode(cache.getRPCManager().isCoordinator());
+      }
+   }
+
+   /**
+    * @see org.jboss.cache.loader.SingletonStoreCacheLoader#activeStatusChanged(boolean)
+    */
    @Override
    protected void activeStatusChanged(boolean newActiveState) throws PushStateException
    {
       // at first change indexer mode
-      // get base cache loader that is configured under SingletonStoreCacheLoader
-      // if it is IndexerCacheLoader need to call setMode(ioMode)
-      if (getCacheLoader() instanceof IndexerCacheLoader)
-      {
-         // if newActiveState is true IndexerCacheLoader is coordinator with write enabled;
-         ((IndexerCacheLoader)getCacheLoader()).setMode(newActiveState ? IndexerIoMode.READ_WRITE
-            : IndexerIoMode.READ_ONLY);
-      }
+      setIndexerMode(newActiveState);
       // and them push states if needed
       super.activeStatusChanged(newActiveState);
+   }
 
+   /**
+    * @see org.jboss.cache.loader.SingletonStoreCacheLoader#create()
+    */
+   @Override
+   public void create() throws Exception
+   {
+      super.create();
+      cache.addCacheListener(new InitialStateListener());
    }
 
    @Override
@@ -73,9 +95,8 @@
             final Set<String> addedNodes = new HashSet<String>();
             final Set<String> parentRemovedNodes = new HashSet<String>();
             final Set<String> parentAddedNodes = new HashSet<String>();
-            // merging all lists stored in memory 
-            //TODO: re-write: lists are now stored in wrapper.  
-            Collection<NodeSPI> children = cache.getRoot().getChildrenDirect();
+            // merging all lists stored in memory
+            Collection<NodeSPI> children = cache.getRoot().getChildren();
             for (NodeSPI aChildren : children)
             {
                Fqn<?> fqn = aChildren.getFqn();
@@ -92,11 +113,31 @@
                   parentRemovedNodes.addAll(listsWrapper.getParentAddedNodes());
                };
             }
-            //TODO: recover logic is here, lists are: removedNodes and addedNodes
+            //TODO: recover logic is here, lists are: removedNodes and addedNodes      String id = IdGenerator.generate();
+            String id = IdGenerator.generate();
+            cache.put(id, JbossCacheIndexChangesFilter.LISTWRAPPER, new ChangesFilterListsWrapper(addedNodes,
+               removedNodes, parentAddedNodes, parentRemovedNodes));
             if (debugEnabled)
                log.debug("in-memory state passed to cache cacheLoader successfully");
             return null;
          }
       };
    }
+
+   /**
+    * Sets/changes indexer mode 
+    * 
+    * @param writeEnabled
+    */
+   protected void setIndexerMode(boolean writeEnabled)
+   {
+      // get base cache loader that is configured under SingletonStoreCacheLoader
+      // if it is IndexerCacheLoader need to call setMode(ioMode)
+      if (getCacheLoader() instanceof IndexerCacheLoader)
+      {
+         // if newActiveState is true IndexerCacheLoader is coordinator with write enabled;
+         ((IndexerCacheLoader)getCacheLoader()).setMode(writeEnabled ? IndexerIoMode.READ_WRITE
+            : IndexerIoMode.READ_ONLY);
+      }
+   }
 }



More information about the exo-jcr-commits mailing list