You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2014/10/09 12:02:32 UTC

git commit: removing Topology write locks to an messaging-internal class

Repository: stratos
Updated Branches:
  refs/heads/4.0.0-grouping f11401a34 -> 035939901


removing Topology write locks to an messaging-internal class


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/03593990
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/03593990
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/03593990

Branch: refs/heads/4.0.0-grouping
Commit: 03593990145938ef1355444a7abd64264ed4e575
Parents: f11401a
Author: Isuru Haththotuwa <is...@apache.org>
Authored: Thu Oct 9 15:26:31 2014 +0530
Committer: Isuru Haththotuwa <is...@apache.org>
Committed: Thu Oct 9 15:31:45 2014 +0530

----------------------------------------------------------------------
 .../conf/LoadBalancerConfiguration.java         |   7 +-
 .../StratosManagerTopologyEventReceiver.java    |  67 +++--
 components/org.apache.stratos.messaging/pom.xml |   7 +-
 .../domain/topology/locking/TopologyLock.java   |   4 +-
 .../topology/locking/TopologyLockHierarchy.java |   7 +
 .../ApplicationActivatedMessageProcessor.java   |   6 +-
 .../ApplicationCreatedMessageProcessor.java     |  10 +-
 .../ApplicationRemovedMessageProcessor.java     |  10 +-
 .../topology/ClusterActivatedProcessor.java     |   6 +-
 .../ClusterCreatedMessageProcessor.java         |   6 +-
 .../ClusterMaintenanceModeMessageProcessor.java |   6 +-
 .../ClusterRemovedMessageProcessor.java         |   6 +-
 .../CompleteTopologyMessageProcessor.java       |  12 +-
 .../topology/GroupActivatedProcessor.java       |   6 +-
 .../InstanceSpawnedMessageProcessor.java        |   6 +-
 .../MemberActivatedMessageProcessor.java        |   6 +-
 .../MemberMaintenanceModeProcessor.java         |   6 +-
 .../MemberReadyToShutdownMessageProcessor.java  |   6 +-
 .../topology/MemberStartedMessageProcessor.java |   6 +-
 .../MemberSuspendedMessageProcessor.java        |   6 +-
 .../MemberTerminatedMessageProcessor.java       |   6 +-
 .../ServiceCreatedMessageProcessor.java         |   6 +-
 .../ServiceRemovedMessageProcessor.java         |   6 +-
 .../topology/updater/TopologyUpdater.java       | 272 +++++++++++++++++++
 .../receiver/topology/TopologyManager.java      | 245 +----------------
 .../topology/locking/TopologyLockingTest.java   |  41 +--
 26 files changed, 411 insertions(+), 361 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
index c269419..ed8aa05 100644
--- a/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
+++ b/components/org.apache.stratos.load.balancer/src/main/java/org/apache/stratos/load/balancer/conf/LoadBalancerConfiguration.java
@@ -496,12 +496,15 @@ public class LoadBalancerConfiguration {
 
                         // Add service to topology manager if not exists
                         try {
-                            TopologyManager.acquireWriteLock();
+                            // TODO - fix properly!
+                            // this lock is not needed since, this Topology is not shared. This is
+                            // used by LB only
+                            //TopologyManager.acquireWriteLock();
                             if (!TopologyManager.getTopology().serviceExists(service.getServiceName())) {
                                 TopologyManager.getTopology().addService(service);
                             }
                         } finally {
-                            TopologyManager.releaseWriteLock();
+                            //TopologyManager.releaseWriteLock();
                         }
 
                         // Add cluster to load balancer context

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/receiver/StratosManagerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/receiver/StratosManagerTopologyEventReceiver.java b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/receiver/StratosManagerTopologyEventReceiver.java
index e7bc5a2..699af72 100644
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/receiver/StratosManagerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/topology/receiver/StratosManagerTopologyEventReceiver.java
@@ -28,7 +28,6 @@ import org.apache.stratos.manager.subscription.ApplicationSubscription;
 import org.apache.stratos.manager.topology.model.TopologyClusterInformationModel;
 import org.apache.stratos.messaging.domain.topology.Application;
 import org.apache.stratos.messaging.domain.topology.Cluster;
-import org.apache.stratos.messaging.domain.topology.Member;
 import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.event.Event;
 import org.apache.stratos.messaging.event.topology.*;
@@ -265,39 +264,39 @@ public class StratosManagerTopologyEventReceiver implements Runnable {
                     Cluster cluster = TopologyManager.getTopology().getService(serviceType).getCluster(clusterDomain);
 
                     // check and remove terminated member
-                    if (cluster.memberExists(memberTerminatedEvent.getMemberId())) {
-                        // release the read lock and acquire the write lock
-//                        TopologyManager.releaseReadLock();
-//                        TopologyManager.acquireWriteLock();
-                        TopologyManager.releaseReadLockForCluster(memberTerminatedEvent.getServiceName(),
-                                memberTerminatedEvent.getClusterId());
-                        TopologyManager.acquireWriteLockForCluster(memberTerminatedEvent.getServiceName(),
-                                memberTerminatedEvent.getClusterId());
-
-                        try {
-                            // re-check the state; another thread might have acquired the write lock and modified
-                            if (cluster.memberExists(memberTerminatedEvent.getMemberId())) {
-                                // remove the member from the cluster
-                                Member terminatedMember = cluster.getMember(memberTerminatedEvent.getMemberId());
-                                cluster.removeMember(terminatedMember);
-                                if (log.isDebugEnabled()) {
-                                    log.debug("Removed the terminated member with id " + memberTerminatedEvent.getMemberId() + " from the cluster");
-                                }
-                            }
-
-                            // downgrade to read lock - 1. acquire read lock, 2. release write lock
-                            // acquire read lock
-                            //TopologyManager.acquireReadLock();
-                            TopologyManager.acquireReadLockForCluster(memberTerminatedEvent.getServiceName(),
-                                    memberTerminatedEvent.getClusterId());
-
-                        } finally {
-                            // release the write lock
-                           // TopologyManager.releaseWriteLock();
-                            TopologyManager.releaseWriteLockForCluster(memberTerminatedEvent.getServiceName(),
-                                    memberTerminatedEvent.getClusterId());
-                        }
-                    }
+//                    if (cluster.memberExists(memberTerminatedEvent.getMemberId())) {
+//                        // release the read lock and acquire the write lock
+////                        TopologyManager.releaseReadLock();
+////                        TopologyManager.acquireWriteLock();
+//                        TopologyManager.releaseReadLockForCluster(memberTerminatedEvent.getServiceName(),
+//                                memberTerminatedEvent.getClusterId());
+//                        TopologyManager.acquireWriteLockForCluster(memberTerminatedEvent.getServiceName(),
+//                                memberTerminatedEvent.getClusterId());
+//
+//                        try {
+//                            // re-check the state; another thread might have acquired the write lock and modified
+//                            if (cluster.memberExists(memberTerminatedEvent.getMemberId())) {
+//                                // remove the member from the cluster
+//                                Member terminatedMember = cluster.getMember(memberTerminatedEvent.getMemberId());
+//                                cluster.removeMember(terminatedMember);
+//                                if (log.isDebugEnabled()) {
+//                                    log.debug("Removed the terminated member with id " + memberTerminatedEvent.getMemberId() + " from the cluster");
+//                                }
+//                            }
+//
+//                            // downgrade to read lock - 1. acquire read lock, 2. release write lock
+//                            // acquire read lock
+//                            //TopologyManager.acquireReadLock();
+//                            TopologyManager.acquireReadLockForCluster(memberTerminatedEvent.getServiceName(),
+//                                    memberTerminatedEvent.getClusterId());
+//
+//                        } finally {
+//                            // release the write lock
+//                           // TopologyManager.releaseWriteLock();
+//                            TopologyManager.releaseWriteLockForCluster(memberTerminatedEvent.getServiceName(),
+//                                    memberTerminatedEvent.getClusterId());
+//                        }
+//                    }
                     TopologyClusterInformationModel.getInstance().addCluster(cluster);
                 } finally {
                     //release read lock

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/pom.xml
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/pom.xml b/components/org.apache.stratos.messaging/pom.xml
index 4ff4cb8..2143925 100644
--- a/components/org.apache.stratos.messaging/pom.xml
+++ b/components/org.apache.stratos.messaging/pom.xml
@@ -104,11 +104,12 @@
                         <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                         <Bundle-Name>${project.artifactId}</Bundle-Name>
                         <Export-Package>
+                            !org.apache.stratos.messaging.message.processor.topology.updater,
                             org.apache.stratos.messaging.*,
                         </Export-Package>
-                        <!--Private-Package>
-                        	org.apache.stratos.messaging.internal;
-                        </Private-Package-->
+                        <Private-Package>
+                            org.apache.stratos.messaging.message.processor.topology.updater;
+                        </Private-Package>
                         <Import-Package>
                             !org.apache.commons.logging,
                             org.apache.commons.logging; version=0.0.0,

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLock.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLock.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLock.java
index e1b90ad..92a2f0a 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLock.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLock.java
@@ -34,9 +34,7 @@ public class TopologyLock {
     }
 
     public void releaseWritelock() {
-        if (lock.isWriteLockedByCurrentThread()) {
-            lock.writeLock().unlock();
-        }
+        lock.writeLock().unlock();
     }
 
     public void acquireReadLock() {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLockHierarchy.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLockHierarchy.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLockHierarchy.java
index aa0f7a1..d7ab0a1 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLockHierarchy.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/domain/topology/locking/TopologyLockHierarchy.java
@@ -29,6 +29,8 @@ public class TopologyLockHierarchy {
 
     private static final Log log = LogFactory.getLog(TopologyLockHierarchy.class);
 
+    private TopologyLock completeTopologyLock;
+
     // lock for Services
     private TopologyLock serviceLock;
 
@@ -48,6 +50,7 @@ public class TopologyLockHierarchy {
 
     private TopologyLockHierarchy () {
 
+        this.completeTopologyLock = new TopologyLock();
         this.serviceLock = new TopologyLock();
         this.applicatioLock = new TopologyLock();
         this.serviceNameToTopologyLockMap = new ConcurrentHashMap<String, TopologyLock>();
@@ -144,4 +147,8 @@ public class TopologyLockHierarchy {
     public TopologyLock getApplicatioLock() {
         return applicatioLock;
     }
+
+    public TopologyLock getCompleteTopologyLock() {
+        return completeTopologyLock;
+    }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java
index 4211830..d32cecf 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationActivatedMessageProcessor.java
@@ -25,7 +25,7 @@ import org.apache.stratos.messaging.domain.topology.Status;
 import org.apache.stratos.messaging.domain.topology.Topology;
 import org.apache.stratos.messaging.event.topology.ApplicationActivatedEvent;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 /**
@@ -57,13 +57,13 @@ public class ApplicationActivatedMessageProcessor extends MessageProcessor {
             ApplicationActivatedEvent event = (ApplicationActivatedEvent) Util.
                     jsonToObject(message, ApplicationActivatedEvent.class);
 
-            TopologyManager.acquireWriteLockForApplication(event.getAppId());
+            TopologyUpdater.acquireWriteLockForApplication(event.getAppId());
 
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForApplication(event.getAppId());
+                TopologyUpdater.releaseWriteLockForApplication(event.getAppId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationCreatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationCreatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationCreatedMessageProcessor.java
index 55786fa..7d06fd5 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationCreatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationCreatedMessageProcessor.java
@@ -26,7 +26,7 @@ import org.apache.stratos.messaging.domain.topology.ClusterDataHolder;
 import org.apache.stratos.messaging.domain.topology.Topology;
 import org.apache.stratos.messaging.event.topology.ApplicationCreatedEvent;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 import java.util.Set;
@@ -57,12 +57,12 @@ public class ApplicationCreatedMessageProcessor extends MessageProcessor {
                 return false;
             }
 
-            TopologyManager.acquireWriteLockForApplications();
+            TopologyUpdater.acquireWriteLockForApplications();
             // since the Clusters will also get modified, acquire write locks for each Service Type
             Set<ClusterDataHolder> clusterDataHolders = event.getApplication().getClusterDataRecursively();
             if (clusterDataHolders != null) {
                 for (ClusterDataHolder clusterData : clusterDataHolders) {
-                    TopologyManager.acquireWriteLockForService(clusterData.getServiceType());
+                    TopologyUpdater.acquireWriteLockForService(clusterData.getServiceType());
                 }
             }
 
@@ -72,10 +72,10 @@ public class ApplicationCreatedMessageProcessor extends MessageProcessor {
             } finally {
                 if (clusterDataHolders != null) {
                     for (ClusterDataHolder clusterData : clusterDataHolders) {
-                        TopologyManager.releaseWriteLockForService(clusterData.getServiceType());
+                        TopologyUpdater.releaseWriteLockForService(clusterData.getServiceType());
                     }
                 }
-                TopologyManager.releaseWriteLockForApplications();
+                TopologyUpdater.releaseWriteLockForApplications();
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationRemovedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationRemovedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationRemovedMessageProcessor.java
index 062c7e1..5e02565 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationRemovedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ApplicationRemovedMessageProcessor.java
@@ -26,7 +26,7 @@ import org.apache.stratos.messaging.domain.topology.Service;
 import org.apache.stratos.messaging.domain.topology.Topology;
 import org.apache.stratos.messaging.event.topology.ApplicationRemovedEvent;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 import java.util.Set;
@@ -65,11 +65,11 @@ public class ApplicationRemovedMessageProcessor extends MessageProcessor {
 	            return false;
 	        }
 
-            TopologyManager.acquireWriteLockForApplications();
+            TopologyUpdater.acquireWriteLockForApplications();
             Set<ClusterDataHolder> clusterDataHolders = event.getClusterData();
             if (clusterDataHolders != null) {
                 for (ClusterDataHolder clusterData : clusterDataHolders) {
-                    TopologyManager.acquireWriteLockForService(clusterData.getServiceType());
+                    TopologyUpdater.acquireWriteLockForService(clusterData.getServiceType());
                 }
             }
 
@@ -79,10 +79,10 @@ public class ApplicationRemovedMessageProcessor extends MessageProcessor {
             } finally {
                 if (clusterDataHolders != null) {
                     for (ClusterDataHolder clusterData : clusterDataHolders) {
-                        TopologyManager.releaseWriteLockForService(clusterData.getServiceType());
+                        TopologyUpdater.releaseWriteLockForService(clusterData.getServiceType());
                     }
                 }
-                TopologyManager.releaseWriteLockForApplications();
+                TopologyUpdater.releaseWriteLockForApplications();
             }
         
 	    } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java
index ef4bba2..cb8eb5f 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterActivatedProcessor.java
@@ -28,7 +28,7 @@ import org.apache.stratos.messaging.event.topology.ClusterActivatedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 /**
@@ -58,12 +58,12 @@ public class ClusterActivatedProcessor extends MessageProcessor {
             ClusterActivatedEvent event = (ClusterActivatedEvent) Util.
                     jsonToObject(message, ClusterActivatedEvent.class);
 
-            TopologyManager.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
+            TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
+                TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
 
         }  else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterCreatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterCreatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterCreatedMessageProcessor.java
index 6eddfd3..71df7ce 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterCreatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterCreatedMessageProcessor.java
@@ -27,7 +27,7 @@ import org.apache.stratos.messaging.event.topology.ClusterCreatedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class ClusterCreatedMessageProcessor extends MessageProcessor {
@@ -53,12 +53,12 @@ public class ClusterCreatedMessageProcessor extends MessageProcessor {
             // Parse complete message and build event
             ClusterCreatedEvent event = (ClusterCreatedEvent) Util.jsonToObject(message, ClusterCreatedEvent.class);
 
-            TopologyManager.acquireWriteLockForService(event.getServiceName());
+            TopologyUpdater.acquireWriteLockForService(event.getServiceName());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForService(event.getServiceName());
+                TopologyUpdater.releaseWriteLockForService(event.getServiceName());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java
index 15819ff..57d7c45 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterMaintenanceModeMessageProcessor.java
@@ -25,7 +25,7 @@ import org.apache.stratos.messaging.event.topology.ClusterMaintenanceModeEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class ClusterMaintenanceModeMessageProcessor extends MessageProcessor {
@@ -50,12 +50,12 @@ public class ClusterMaintenanceModeMessageProcessor extends MessageProcessor {
             ClusterMaintenanceModeEvent event = (ClusterMaintenanceModeEvent) Util.
                                 jsonToObject(message, ClusterMaintenanceModeEvent.class);
 
-            TopologyManager.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
+            TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
+                TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterRemovedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterRemovedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterRemovedMessageProcessor.java
index fb45cd3..d81f484 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterRemovedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ClusterRemovedMessageProcessor.java
@@ -26,7 +26,7 @@ import org.apache.stratos.messaging.event.topology.ClusterRemovedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class ClusterRemovedMessageProcessor extends MessageProcessor {
@@ -51,12 +51,12 @@ public class ClusterRemovedMessageProcessor extends MessageProcessor {
             // Parse complete message and build event
             ClusterRemovedEvent event = (ClusterRemovedEvent) Util.jsonToObject(message, ClusterRemovedEvent.class);
 
-            TopologyManager.acquireWriteLockForService(event.getServiceName());
+            TopologyUpdater.acquireWriteLockForService(event.getServiceName());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForService(event.getServiceName());
+                TopologyUpdater.releaseWriteLockForService(event.getServiceName());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/CompleteTopologyMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/CompleteTopologyMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/CompleteTopologyMessageProcessor.java
index 999415d..f0df6eb 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/CompleteTopologyMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/CompleteTopologyMessageProcessor.java
@@ -26,7 +26,7 @@ import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilte
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 import java.util.ArrayList;
@@ -52,17 +52,13 @@ public class CompleteTopologyMessageProcessor extends MessageProcessor {
         	CompleteTopologyEvent event = (CompleteTopologyEvent) Util.jsonToObject(message, CompleteTopologyEvent.class);
 
             if (!topology.isInitialized()) {
-                TopologyManager.acquireWriteLock();
+                TopologyUpdater.acquireWriteLock();
 
                 try {
-                    if (!topology.isInitialized()) {
-                        return doProcess(event, topology);
-                    } else {
-                        return true;
-                    }
+                    return topology.isInitialized() || doProcess(event, topology);
 
                 } finally {
-                    TopologyManager.releaseWriteLock();
+                    TopologyUpdater.releaseWriteLock();
                 }
             } else {
                 return true;

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java
index 3bf5fad..ba9554f 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/GroupActivatedProcessor.java
@@ -23,7 +23,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.messaging.domain.topology.*;
 import org.apache.stratos.messaging.event.topology.GroupActivatedEvent;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 /**
@@ -51,13 +51,13 @@ public class GroupActivatedProcessor extends MessageProcessor {
             GroupActivatedEvent event = (GroupActivatedEvent) Util.
                     jsonToObject(message, GroupActivatedEvent.class);
 
-            TopologyManager.acquireWriteLockForApplication(event.getAppId());
+            TopologyUpdater.acquireWriteLockForApplication(event.getAppId());
 
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForApplication(event.getAppId());
+                TopologyUpdater.releaseWriteLockForApplication(event.getAppId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
index 2d3f8b3..3135ba5 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/InstanceSpawnedMessageProcessor.java
@@ -26,7 +26,7 @@ import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilte
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class InstanceSpawnedMessageProcessor extends MessageProcessor {
@@ -51,12 +51,12 @@ public class InstanceSpawnedMessageProcessor extends MessageProcessor {
             // Parse complete message and build event
             InstanceSpawnedEvent event = (InstanceSpawnedEvent) Util.jsonToObject(message, InstanceSpawnedEvent.class);
 
-            TopologyManager.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
+            TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
+                TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
index ec1b5ec..c3f8844 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberActivatedMessageProcessor.java
@@ -30,7 +30,7 @@ import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilte
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class MemberActivatedMessageProcessor extends MessageProcessor {
@@ -55,12 +55,12 @@ public class MemberActivatedMessageProcessor extends MessageProcessor {
             // Parse complete message and build event
             MemberActivatedEvent event = (MemberActivatedEvent) Util.jsonToObject(message, MemberActivatedEvent.class);
 
-            TopologyManager.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
+            TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
+                TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java
index b252a61..2a080fe 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberMaintenanceModeProcessor.java
@@ -27,7 +27,7 @@ import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilte
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class MemberMaintenanceModeProcessor extends MessageProcessor {
@@ -52,12 +52,12 @@ public class MemberMaintenanceModeProcessor extends MessageProcessor {
             MemberMaintenanceModeEvent event = (MemberMaintenanceModeEvent) Util.
                                             jsonToObject(message, MemberMaintenanceModeEvent.class);
 
-            TopologyManager.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
+            TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
+                TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java
index f0c3580..8f9f149 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberReadyToShutdownMessageProcessor.java
@@ -26,7 +26,7 @@ import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilte
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class MemberReadyToShutdownMessageProcessor extends MessageProcessor{
@@ -51,12 +51,12 @@ public class MemberReadyToShutdownMessageProcessor extends MessageProcessor{
             MemberReadyToShutdownEvent event = (MemberReadyToShutdownEvent) Util.
                                             jsonToObject(message, MemberReadyToShutdownEvent.class);
 
-            TopologyManager.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
+            TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
+                TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java
index 508ec39..649a5b2 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberStartedMessageProcessor.java
@@ -30,7 +30,7 @@ import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilte
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class MemberStartedMessageProcessor extends MessageProcessor {
@@ -55,12 +55,12 @@ public class MemberStartedMessageProcessor extends MessageProcessor {
             // Parse complete message and build event
             MemberStartedEvent event = (MemberStartedEvent) Util.jsonToObject(message, MemberStartedEvent.class);
 
-            TopologyManager.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
+            TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
+                TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java
index 4473add..b342104 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberSuspendedMessageProcessor.java
@@ -30,7 +30,7 @@ import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilte
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class MemberSuspendedMessageProcessor extends MessageProcessor {
@@ -55,12 +55,12 @@ public class MemberSuspendedMessageProcessor extends MessageProcessor {
             // Parse complete message and build event
             MemberSuspendedEvent event = (MemberSuspendedEvent) Util.jsonToObject(message, MemberSuspendedEvent.class);
 
-            TopologyManager.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
+            TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
+                TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberTerminatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberTerminatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberTerminatedMessageProcessor.java
index 3619b53..c7a910e 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberTerminatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/MemberTerminatedMessageProcessor.java
@@ -29,7 +29,7 @@ import org.apache.stratos.messaging.message.filter.topology.TopologyClusterFilte
 import org.apache.stratos.messaging.message.filter.topology.TopologyMemberFilter;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class MemberTerminatedMessageProcessor extends MessageProcessor {
@@ -54,12 +54,12 @@ public class MemberTerminatedMessageProcessor extends MessageProcessor {
             // Parse complete message and build event
             MemberTerminatedEvent event = (MemberTerminatedEvent) Util.jsonToObject(message, MemberTerminatedEvent.class);
 
-            TopologyManager.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
+            TopologyUpdater.acquireWriteLockForCluster(event.getServiceName(), event.getClusterId());
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
+                TopologyUpdater.releaseWriteLockForCluster(event.getServiceName(), event.getClusterId());
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceCreatedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceCreatedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceCreatedMessageProcessor.java
index 1c4be8f..b93d7c2 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceCreatedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceCreatedMessageProcessor.java
@@ -25,7 +25,7 @@ import org.apache.stratos.messaging.domain.topology.Topology;
 import org.apache.stratos.messaging.event.topology.ServiceCreatedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class ServiceCreatedMessageProcessor extends MessageProcessor {
@@ -51,12 +51,12 @@ public class ServiceCreatedMessageProcessor extends MessageProcessor {
             // Parse complete message and build event
             ServiceCreatedEvent event = (ServiceCreatedEvent) Util.jsonToObject(message, ServiceCreatedEvent.class);
 
-            TopologyManager.acquireWriteLockForServices();
+            TopologyUpdater.acquireWriteLockForServices();
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForServices();
+                TopologyUpdater.releaseWriteLockForServices();
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceRemovedMessageProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceRemovedMessageProcessor.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceRemovedMessageProcessor.java
index a38cbdc..d609812 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceRemovedMessageProcessor.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/ServiceRemovedMessageProcessor.java
@@ -25,7 +25,7 @@ import org.apache.stratos.messaging.domain.topology.Topology;
 import org.apache.stratos.messaging.event.topology.ServiceRemovedEvent;
 import org.apache.stratos.messaging.message.filter.topology.TopologyServiceFilter;
 import org.apache.stratos.messaging.message.processor.MessageProcessor;
-import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.util.Util;
 
 public class ServiceRemovedMessageProcessor extends MessageProcessor {
@@ -50,12 +50,12 @@ public class ServiceRemovedMessageProcessor extends MessageProcessor {
             // Parse complete message and build event
             ServiceRemovedEvent event = (ServiceRemovedEvent) Util.jsonToObject(message, ServiceRemovedEvent.class);
 
-            TopologyManager.acquireWriteLockForServices();
+            TopologyUpdater.acquireWriteLockForServices();
             try {
                 return doProcess(event, topology);
 
             } finally {
-                TopologyManager.releaseWriteLockForServices();
+                TopologyUpdater.releaseWriteLockForServices();
             }
 
         } else {

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/updater/TopologyUpdater.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/updater/TopologyUpdater.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/updater/TopologyUpdater.java
new file mode 100644
index 0000000..3da5835
--- /dev/null
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/processor/topology/updater/TopologyUpdater.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.stratos.messaging.message.processor.topology.updater;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.messaging.domain.topology.locking.TopologyLock;
+import org.apache.stratos.messaging.domain.topology.locking.TopologyLockHierarchy;
+import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
+
+/**
+ * Used to lock the Topology for writes by messaging component
+ *
+ *  Acquire a write lock:
+ *
+ *  From root level, acquire read lock, and acquire a write lock only for the
+ *  relevant sub tree.
+ *
+ *  Example 1: Acquiring write lock for a Cluster to modify the Cluster object -
+ *           acquiring:
+ *           public static void acquireWriteLockForCluster (String serviceName, String clusterId)
+ *
+ *           releasing:
+ *           public static void releaseWriteLockForCluster (String serviceName, String clusterId)
+ *
+ *  Example 2: Acquiring write lock to add a new Cluster object -
+ *           acquiring:
+ *           public static void acquireWriteLockForService (String serviceName)
+ *
+ *           releasing:
+ *           public static void releaseWriteLockForService (String serviceName)
+ *
+ *  Example 3: Acquiring the write lock to add a deploy a Cartridge (add a new Service)
+ *           acquire:
+ *           public static void acquireWriteLockForServices()
+ *
+ *           release:
+ *           public static void releaseWriteLockForServices()
+ */
+
+public class TopologyUpdater {
+
+    private static final Log log = LogFactory.getLog(TopologyUpdater.class);
+
+    private static final TopologyLockHierarchy topologyLockHierarchy = TopologyLockHierarchy.getInstance();
+
+    // Top level locks - should be used to lock the entire Topology
+
+    /**
+     * Acquires write lock for the Complete Topology
+     */
+    public static void acquireWriteLock() {
+        if(log.isDebugEnabled()) {
+            log.debug("Write lock acquired for Topology");
+        }
+        topologyLockHierarchy.getCompleteTopologyLock().acquireWriteLock();
+    }
+
+    /**
+     * Releases write lock for the Complete Topology
+     */
+    public static void releaseWriteLock() {
+        if(log.isDebugEnabled()) {
+            log.debug("Write lock released for Topology");
+        }
+        topologyLockHierarchy.getCompleteTopologyLock().releaseWritelock();
+    }
+
+    // Application and Service write locks
+    /**
+     * Acquires write lock for the all Applications
+     */
+    public static void acquireWriteLockForApplications() {
+        if(log.isDebugEnabled()) {
+            log.debug("Write lock acquired for Applications");
+        }
+        topologyLockHierarchy.getApplicatioLock().acquireWriteLock();
+    }
+
+    /**
+     * Releases write lock for the all Applications
+     */
+    public static void releaseWriteLockForApplications() {
+        if(log.isDebugEnabled()) {
+            log.debug("Write lock released for Applications");
+        }
+        topologyLockHierarchy.getApplicatioLock().releaseWritelock();
+    }
+
+    /**
+     * Acquires write lock for the all Services
+     */
+    public static void acquireWriteLockForServices() {
+        if(log.isDebugEnabled()) {
+            log.debug("Write lock acquired for Services");
+        }
+        topologyLockHierarchy.getServiceLock().acquireWriteLock();
+    }
+
+    /**
+     * Releases write lock for the all Services
+     */
+    public static void releaseWriteLockForServices() {
+        if(log.isDebugEnabled()) {
+            log.debug("Write lock released for Services");
+        }
+        topologyLockHierarchy.getServiceLock().releaseWritelock();
+    }
+
+    /**
+     * Acquires write lock for a Service
+     *
+     * @param serviceName service name to acquire write lock
+     */
+    public static void acquireWriteLockForService (String serviceName) {
+
+        // acquire read lock for all Applications
+        TopologyManager.acquireReadLockForServices();
+
+        TopologyLock topologyServiceLock = topologyLockHierarchy.getTopologyLockForService(serviceName);
+        if (topologyServiceLock == null) {
+            handleLockNotFound("Topology lock not found for Service " + serviceName);
+
+        } else {
+            topologyServiceLock.acquireWriteLock();
+            if(log.isDebugEnabled()) {
+                log.debug("Write lock acquired for Service " + serviceName);
+            }
+        }
+    }
+
+    /**
+     * Releases write lock for a Service
+     *
+     * @param serviceName service name to release write lock
+     */
+    public static void releaseWriteLockForService (String serviceName) {
+
+        TopologyLock topologyServiceLock = topologyLockHierarchy.getTopologyLockForService(serviceName);
+        if (topologyServiceLock == null) {
+            handleLockNotFound("Topology lock not found for Service " + serviceName);
+
+        } else {
+            topologyServiceLock.releaseWritelock();
+            if(log.isDebugEnabled()) {
+                log.debug("Write lock released for Service " + serviceName);
+            }
+        }
+
+        // release read lock for all Services
+        TopologyManager.releaseReadLockForServices();
+    }
+
+    /**
+     * Acquires write lock for a Cluster. This will acquire the write lock in the following order
+     *      1. for the Service
+     *      2. for the Cluster
+     *
+     * @param serviceName service name to acquire write lock
+     * @param clusterId cluster id to acquire write lock
+     */
+    public static void acquireWriteLockForCluster (String serviceName, String clusterId) {
+
+        // acquire read lock for the relevant Services
+        TopologyManager.acquireReadLockForService(serviceName);
+
+        TopologyLock topologyClusterLock = topologyLockHierarchy.getTopologyLockForCluster(clusterId);
+        if (topologyClusterLock == null) {
+            handleLockNotFound("Topology lock not found for Cluster " + clusterId);
+
+        } else {
+            topologyClusterLock.acquireWriteLock();
+            if(log.isDebugEnabled()) {
+                log.debug("Write lock acquired for Cluster " + clusterId);
+            }
+        }
+    }
+
+    /**
+     * Releases write lock for a Cluster. This will release the write lock in the following order
+     *      1. for the Cluster
+     *      2. for the Service
+     *
+     * @param serviceName service name to release write lock
+     * @param clusterId cluster id to release write lock
+     */
+    public static void releaseWriteLockForCluster (String serviceName, String clusterId) {
+
+        TopologyLock topologyClusterLock = topologyLockHierarchy.getTopologyLockForCluster(clusterId);
+        if (topologyClusterLock == null) {
+            handleLockNotFound("Topology lock not found for Cluster " + clusterId);
+
+        } else {
+            topologyClusterLock.releaseWritelock();
+            if(log.isDebugEnabled()) {
+                log.debug("Write lock released for Cluster " + clusterId);
+            }
+        }
+
+        // release read lock for relevant Service
+        TopologyManager.releaseReadLockForService(serviceName);
+    }
+
+    /**
+     * Acquires write lock for the Application
+     *
+     * @param appId Application id
+     */
+    public static void acquireWriteLockForApplication (String appId) {
+
+        // acquire read lock for all Applications
+        TopologyManager.acquireReadLockForApplications();
+
+        TopologyLock topologyAppLock = topologyLockHierarchy.getTopologyLockForApplication(appId);
+        if (topologyAppLock == null)  {
+            handleLockNotFound("Topology lock not found for Application " + appId);
+
+        } else {
+            // now, lock Application
+            topologyAppLock.acquireWriteLock();
+            if(log.isDebugEnabled()) {
+                log.debug("Write lock acquired for Application " + appId);
+            }
+        }
+    }
+
+    /**
+     * Releases write lock for the Application
+     *
+     * @param appId Application id
+     */
+    public static void releaseWriteLockForApplication (String appId) {
+
+        TopologyLock topologyAppLock = topologyLockHierarchy.getTopologyLockForApplication(appId);
+        if (topologyAppLock == null)  {
+            handleLockNotFound("Topology lock not found for Application " + appId);
+
+        } else {
+            // release App lock
+            topologyAppLock.releaseWritelock();
+            if(log.isDebugEnabled()) {
+                log.debug("Write lock released for Application " + appId);
+            }
+        }
+
+        // release read lock for all Applications
+        TopologyManager.releaseReadLockForApplications();
+    }
+
+    private static void handleLockNotFound (String errorMsg) {
+        log.warn(errorMsg);
+        //throw new RuntimeException(errorMsg);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyManager.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyManager.java b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyManager.java
index d636912..fbb2faf 100644
--- a/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyManager.java
+++ b/components/org.apache.stratos.messaging/src/main/java/org/apache/stratos/messaging/message/receiver/topology/TopologyManager.java
@@ -25,8 +25,6 @@ import org.apache.stratos.messaging.domain.topology.Topology;
 import org.apache.stratos.messaging.domain.topology.locking.TopologyLock;
 import org.apache.stratos.messaging.domain.topology.locking.TopologyLockHierarchy;
 
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
 /**
  *  A singleton class for managing the topology data structure.
  *
@@ -39,44 +37,26 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
  *  Stratos supports hierarchical locking. As per the practice, we need to lock the
  *  hierarchy from root level till the relevant sub tree.
  *
- *  Acquire a write lock:
- *
- *  From root level, acquire read lock, and acquire a write lock only for the
- *  relevant sub tree.
- *
  *  Acquire a read lock:
  *
  *  From root level, acquire read locks till the relevant sub tree
  *
  *  Examples -
  *
- *  Example 1: Acquiring write lock for a Cluster to modify the Cluster object -
- *           acquiring:
- *           public static void acquireWriteLockForCluster (String serviceName, String clusterId)
- *
- *           releasing:
- *           public static void releaseWriteLockForCluster (String serviceName, String clusterId)
- *
- *  Example 2: Acquiring write lock to add a new Cluster object -
- *           acquiring:
- *           public static void acquireWriteLockForService (String serviceName)
- *
- *           releasing:
- *           public static void releaseWriteLockForService (String serviceName)
- *
- *  Example 3: Acquiring read lock to read Cluster information
+ *  Example 1: Acquiring read lock to read Cluster information
  *           acquiring:
  *           public static void acquireReadLockForCluster (String serviceName, String clusterId)
  *
  *           releasing:
  *           public static void releaseReadLockForCluster (String serviceName, String clusterId)
  *
- *  Example 4: Acquiring the write lock to add a deploy a Cartridge (add a new Service)
- *           acquire:
- *           public static void acquireWriteLockForServices()
  *
- *           release:
- *           public static void releaseWriteLockForServices()
+ *  Example 2: Acquiring read lock for a particular Service
+ *          acquiring:
+ *          public static void acquireReadLockForService (String serviceName)
+ *
+ *          releasing:
+ *          public static void releaseReadLockForService (String serviceName)
  */
 public class TopologyManager {
     private static final Log log = LogFactory.getLog(TopologyManager.class);
@@ -84,12 +64,6 @@ public class TopologyManager {
     private static volatile Topology topology;
     private static final TopologyLockHierarchy topologyLockHierarchy =
             TopologyLockHierarchy.getInstance();
-    private static volatile ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
-    private static volatile ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
-    private static volatile ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
-
-
-    // Top level locks - should be used to lock the entire Topology
 
     /**
      * Acquires read lock for the Complete Topology
@@ -98,7 +72,7 @@ public class TopologyManager {
         if(log.isDebugEnabled()) {
             log.debug("Read lock acquired for Topology");
         }
-        readLock.lock();
+        topologyLockHierarchy.getCompleteTopologyLock().acquireReadLock();
     }
 
     /**
@@ -108,27 +82,7 @@ public class TopologyManager {
         if(log.isDebugEnabled()) {
             log.debug("Read lock released for Topology");
         }
-        readLock.unlock();
-    }
-
-    /**
-     * Acquires write lock for the Complete Topology
-     */
-    public static void acquireWriteLock() {
-        if(log.isDebugEnabled()) {
-            log.debug("Write lock acquired for Topology");
-        }
-        writeLock.lock();
-    }
-
-    /**
-     * Releases write lock for the Complete Topology
-     */
-    public static void releaseWriteLock() {
-        if(log.isDebugEnabled()) {
-            log.debug("Write lock released for Topology");
-        }
-        writeLock.unlock();
+        topologyLockHierarchy.getCompleteTopologyLock().releaseReadLock();
     }
 
     // Application and Service read locks
@@ -172,47 +126,6 @@ public class TopologyManager {
         topologyLockHierarchy.getServiceLock().releaseReadLock();
     }
 
-    // Application and Service write locks
-    /**
-     * Acquires write lock for the all Applications
-     */
-    public static void acquireWriteLockForApplications() {
-        if(log.isDebugEnabled()) {
-            log.debug("Write lock acquired for Applications");
-        }
-        topologyLockHierarchy.getApplicatioLock().acquireWriteLock();
-    }
-
-    /**
-     * Releases write lock for the all Applications
-     */
-    public static void releaseWriteLockForApplications() {
-        if(log.isDebugEnabled()) {
-            log.debug("Write lock released for Applications");
-        }
-        topologyLockHierarchy.getApplicatioLock().releaseWritelock();
-    }
-
-    /**
-     * Acquires write lock for the all Services
-     */
-    public static void acquireWriteLockForServices() {
-        if(log.isDebugEnabled()) {
-            log.debug("Write lock acquired for Services");
-        }
-        topologyLockHierarchy.getServiceLock().acquireWriteLock();
-    }
-
-    /**
-     * Releases write lock for the all Services
-     */
-    public static void releaseWriteLockForServices() {
-        if(log.isDebugEnabled()) {
-            log.debug("Write lock released for Services");
-        }
-        topologyLockHierarchy.getServiceLock().releaseWritelock();
-    }
-
     /**
      * Acquires read lock for a Service
      *
@@ -258,50 +171,6 @@ public class TopologyManager {
     }
 
     /**
-     * Acquires write lock for a Service
-     *
-     * @param serviceName service name to acquire write lock
-     */
-    public static void acquireWriteLockForService (String serviceName) {
-
-        // acquire read lock for all Applications
-        acquireReadLockForServices();
-
-        TopologyLock topologyServiceLock = topologyLockHierarchy.getTopologyLockForService(serviceName);
-        if (topologyServiceLock == null) {
-            handleLockNotFound("Topology lock not found for Service " + serviceName);
-
-        } else {
-            topologyServiceLock.acquireWriteLock();
-            if(log.isDebugEnabled()) {
-                log.debug("Write lock acquired for Service " + serviceName);
-            }
-        }
-    }
-
-    /**
-     * Releases write lock for a Service
-     *
-     * @param serviceName service name to release write lock
-     */
-    public static void releaseWriteLockForService (String serviceName) {
-
-        TopologyLock topologyServiceLock = topologyLockHierarchy.getTopologyLockForService(serviceName);
-        if (topologyServiceLock == null) {
-            handleLockNotFound("Topology lock not found for Service " + serviceName);
-
-        } else {
-            topologyServiceLock.releaseWritelock();
-            if(log.isDebugEnabled()) {
-                log.debug("Write lock released for Service " + serviceName);
-            }
-        }
-
-        // release read lock for all Services
-        releaseReadLockForServices();
-    }
-
-    /**
      * Acquires read lock for a Cluster. This will acquire the read lock in the following order
      *      1. for the Service
      *      2. for the Cluster
@@ -354,56 +223,6 @@ public class TopologyManager {
     }
 
     /**
-     * Acquires write lock for a Cluster. This will acquire the write lock in the following order
-     *      1. for the Service
-     *      2. for the Cluster
-     *
-     * @param serviceName service name to acquire write lock
-     * @param clusterId cluster id to acquire write lock
-     */
-    public static void acquireWriteLockForCluster (String serviceName, String clusterId) {
-
-        // acquire read lock for the relevant Services
-        acquireReadLockForService(serviceName);
-
-        TopologyLock topologyClusterLock = topologyLockHierarchy.getTopologyLockForCluster(clusterId);
-        if (topologyClusterLock == null) {
-            handleLockNotFound("Topology lock not found for Cluster " + clusterId);
-
-        } else {
-            topologyClusterLock.acquireWriteLock();
-            if(log.isDebugEnabled()) {
-                log.debug("Write lock acquired for Cluster " + clusterId);
-            }
-        }
-    }
-
-    /**
-     * Releases write lock for a Cluster. This will release the write lock in the following order
-     *      1. for the Cluster
-     *      2. for the Service
-     *
-     * @param serviceName service name to release write lock
-     * @param clusterId cluster id to release write lock
-     */
-    public static void releaseWriteLockForCluster (String serviceName, String clusterId) {
-
-        TopologyLock topologyClusterLock = topologyLockHierarchy.getTopologyLockForCluster(clusterId);
-        if (topologyClusterLock == null) {
-            handleLockNotFound("Topology lock not found for Cluster " + clusterId);
-
-        } else {
-            topologyClusterLock.releaseWritelock();
-            if(log.isDebugEnabled()) {
-                log.debug("Write lock released for Cluster " + clusterId);
-            }
-        }
-
-        // release read lock for relevant Service
-        releaseReadLockForService(serviceName);
-    }
-
-    /**
      * Acquires read lock for the Application
      *
      * @param appId Application id
@@ -449,52 +268,6 @@ public class TopologyManager {
         releaseReadLockForApplications();
     }
 
-    /**
-     * Acquires write lock for the Application
-     *
-     * @param appId Application id
-     */
-    public static void acquireWriteLockForApplication (String appId) {
-
-        // acquire read lock for all Applications
-        acquireReadLockForApplications();
-
-        TopologyLock topologyAppLock = topologyLockHierarchy.getTopologyLockForApplication(appId);
-        if (topologyAppLock == null)  {
-            handleLockNotFound("Topology lock not found for Application " + appId);
-
-        } else {
-            // now, lock Application
-            topologyAppLock.acquireWriteLock();
-            if(log.isDebugEnabled()) {
-                log.debug("Write lock acquired for Application " + appId);
-            }
-        }
-    }
-
-    /**
-     * Releases write lock for the Application
-     *
-     * @param appId Application id
-     */
-    public static void releaseWriteLockForApplication (String appId) {
-
-        TopologyLock topologyAppLock = topologyLockHierarchy.getTopologyLockForApplication(appId);
-        if (topologyAppLock == null)  {
-            handleLockNotFound("Topology lock not found for Application " + appId);
-
-        } else {
-            // release App lock
-            topologyAppLock.releaseWritelock();
-            if(log.isDebugEnabled()) {
-                log.debug("Write lock released for Application " + appId);
-            }
-        }
-
-        // release read lock for all Applications
-        releaseReadLockForApplications();
-    }
-
     private static void handleLockNotFound (String errorMsg) {
         log.warn(errorMsg);
         //throw new RuntimeException(errorMsg);

http://git-wip-us.apache.org/repos/asf/stratos/blob/03593990/components/org.apache.stratos.messaging/src/test/java/org/apache/stratos/messaging/topology/locking/TopologyLockingTest.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.messaging/src/test/java/org/apache/stratos/messaging/topology/locking/TopologyLockingTest.java b/components/org.apache.stratos.messaging/src/test/java/org/apache/stratos/messaging/topology/locking/TopologyLockingTest.java
index cde7b47..8f25af1 100644
--- a/components/org.apache.stratos.messaging/src/test/java/org/apache/stratos/messaging/topology/locking/TopologyLockingTest.java
+++ b/components/org.apache.stratos.messaging/src/test/java/org/apache/stratos/messaging/topology/locking/TopologyLockingTest.java
@@ -20,6 +20,7 @@
 package org.apache.stratos.messaging.topology.locking;
 
 import org.apache.stratos.messaging.domain.topology.*;
+import org.apache.stratos.messaging.message.processor.topology.updater.TopologyUpdater;
 import org.apache.stratos.messaging.message.receiver.topology.TopologyManager;
 import org.junit.*;
 
@@ -114,21 +115,21 @@ public class TopologyLockingTest {
     @Test(timeout=10000)
     public void testAqcuireAndReleaseWriteLocksForServices1To2 () {
 
-        TopologyManager.acquireWriteLockForService("service1");
-        TopologyManager.acquireWriteLockForService("service2");
+        TopologyUpdater.acquireWriteLockForService("service1");
+        TopologyUpdater.acquireWriteLockForService("service2");
 
-        TopologyManager.releaseWriteLockForService("service1");
-        TopologyManager.releaseWriteLockForService("service2");
+        TopologyUpdater.releaseWriteLockForService("service1");
+        TopologyUpdater.releaseWriteLockForService("service2");
     }
 
     @Test(timeout=10000)
     public void testAqcuireAndReleaseWriteLocksForServices3To4 () {
 
-        TopologyManager.acquireWriteLockForService("service3");
-        TopologyManager.acquireWriteLockForService("service4");
+        TopologyUpdater.acquireWriteLockForService("service3");
+        TopologyUpdater.acquireWriteLockForService("service4");
 
-        TopologyManager.releaseWriteLockForService("service3");
-        TopologyManager.releaseWriteLockForService("service4");
+        TopologyUpdater.releaseWriteLockForService("service3");
+        TopologyUpdater.releaseWriteLockForService("service4");
     }
 
     @Test(timeout=10000)
@@ -154,21 +155,21 @@ public class TopologyLockingTest {
     @Test(timeout=10000)
     public void testAqcuireAndReleaseWriteLocksForClustersOfService1 () {
 
-        TopologyManager.acquireWriteLockForCluster("service1", "service1.cluster1.domain");
-        TopologyManager.acquireWriteLockForCluster("service1", "service1.cluster2.domain");
+        TopologyUpdater.acquireWriteLockForCluster("service1", "service1.cluster1.domain");
+        TopologyUpdater.acquireWriteLockForCluster("service1", "service1.cluster2.domain");
 
-        TopologyManager.releaseWriteLockForCluster("service1", "service1.cluster1.domain");
-        TopologyManager.releaseWriteLockForCluster("service1", "service1.cluster2.domain");
+        TopologyUpdater.releaseWriteLockForCluster("service1", "service1.cluster1.domain");
+        TopologyUpdater.releaseWriteLockForCluster("service1", "service1.cluster2.domain");
     }
 
     @Test(timeout=10000)
     public void testAqcuireAndReleaseWriteLocksForClustersOfService2 () {
 
-        TopologyManager.acquireWriteLockForCluster("service2", "service2.cluster1.domain");
-        TopologyManager.acquireWriteLockForCluster("service2", "service2.cluster2.domain");
+        TopologyUpdater.acquireWriteLockForCluster("service2", "service2.cluster1.domain");
+        TopologyUpdater.acquireWriteLockForCluster("service2", "service2.cluster2.domain");
 
-        TopologyManager.releaseWriteLockForCluster("service2", "service2.cluster1.domain");
-        TopologyManager.releaseWriteLockForCluster("service2", "service2.cluster2.domain");
+        TopologyUpdater.releaseWriteLockForCluster("service2", "service2.cluster1.domain");
+        TopologyUpdater.releaseWriteLockForCluster("service2", "service2.cluster2.domain");
     }
 
     @Test(timeout=10000)
@@ -181,8 +182,8 @@ public class TopologyLockingTest {
     @Test(timeout=10000)
     public void testAcquireAndReleaseWriteLockForApp1 () {
 
-        TopologyManager.acquireWriteLockForApplication("app1");
-        TopologyManager.releaseWriteLockForApplication("app1");
+        TopologyUpdater.acquireWriteLockForApplication("app1");
+        TopologyUpdater.releaseWriteLockForApplication("app1");
     }
 
     @Test(timeout=10000)
@@ -195,8 +196,8 @@ public class TopologyLockingTest {
     @Test(timeout=10000)
     public void testAcquireAndReleaseWriteLockForApp2 () {
 
-        TopologyManager.acquireWriteLockForApplication("app2");
-        TopologyManager.releaseWriteLockForApplication("app2");
+        TopologyUpdater.acquireWriteLockForApplication("app2");
+        TopologyUpdater.releaseWriteLockForApplication("app2");
     }
 
     @AfterClass