Author: [email protected]
Date: Wed Mar 28 17:01:51 2012
New Revision: 2162

Log:
[AMDATUCASSANDRA-179] Fixed duplicate PM service registration by remembering 
registered services

Modified:
   
branches/amdatu-cassandra-0.2.3/cassandra-listener/src/main/java/org/amdatu/cassandra/listener/service/CassandraUpdateListenerImpl.java

Modified: 
branches/amdatu-cassandra-0.2.3/cassandra-listener/src/main/java/org/amdatu/cassandra/listener/service/CassandraUpdateListenerImpl.java
==============================================================================
--- 
branches/amdatu-cassandra-0.2.3/cassandra-listener/src/main/java/org/amdatu/cassandra/listener/service/CassandraUpdateListenerImpl.java
     (original)
+++ 
branches/amdatu-cassandra-0.2.3/cassandra-listener/src/main/java/org/amdatu/cassandra/listener/service/CassandraUpdateListenerImpl.java
     Wed Mar 28 17:01:51 2012
@@ -22,6 +22,7 @@
 import org.amdatu.cassandra.persistencemanager.CassandraPersistenceManager;
 import 
org.amdatu.cassandra.persistencemanager.CassandraPersistenceManagerFactory;
 
+import java.util.ArrayList;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Hashtable;
@@ -117,6 +118,7 @@
      */
     class InspectKeyspaceColumnFamilyThread extends Thread {
         private Map<String, List<String>> m_snapshot = new HashMap<String, 
List<String>>();
+        private final List<String> m_registeredPMServices = new 
ArrayList<String>();
 
         @Override
         public void run() {
@@ -175,9 +177,21 @@
                     String filter = "(" + 
CassandraPersistenceManager.KEYSPACE_AWARE_KEY + "=" + keyspace + ")";
                     ServiceReference[] servRefs =
                         
m_context.getAllServiceReferences(CassandraPersistenceManager.class.getName(), 
filter);
+                    // Verify if the service is available
                     if (servRefs == null || servRefs.length == 0) {
-                        // No Cassandra persistence manager available for this 
keyspace, register it now
-                        
m_pmFactory.createCassandraPersistenceManager(keyspace);
+                        // Verify if we did not yet register the PM service 
before (this may happen since starting
+                        // the service happens asynchronously)
+                        if (!m_registeredPMServices.contains(keyspace)) {
+                            // No Cassandra persistence manager available for 
this keyspace, register it now
+                            
m_pmFactory.createCassandraPersistenceManager(keyspace);
+                            m_registeredPMServices.add(keyspace);
+                        }
+                    }
+                    else if (!m_registeredPMServices.contains(keyspace)) {
+                        // The service is available, but not present in our 
remembered list of registered
+                        // services. This may happen in case this bundle is 
stop/started while the PM services
+                        // kept on running, so add it.
+                        m_registeredPMServices.add(keyspace);
                     }
                 }
 
@@ -239,6 +253,7 @@
                     if (keyspaces == null || !keyspaces.contains(keyspace)) {
                         // No keyspace available for this Cassandra 
persistence manager, unregister the service now
                         m_context.ungetService(servRef);
+                        m_registeredPMServices.remove(keyspace);
                         m_logService.log(LogService.LOG_INFO, "Cassandra 
Persistence Manager service for keyspace '"
                             + keyspace + "' unregistered");
                     }
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits

Reply via email to