Author: sebawagner
Date: Mon Nov 26 04:28:52 2012
New Revision: 1413476

URL: http://svn.apache.org/viewvc?rev=1413476&view=rev
Log:
OPENMEETINGS-460 fix session store if a server is deleted or deactivated

Modified:
    
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ClientListHashMapStore.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ISharedSessionStore.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/basic/dao/ServerDao.java
    
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/quartz/scheduler/ClusterSlaveJob.java

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ClientListHashMapStore.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ClientListHashMapStore.java?rev=1413476&r1=1413475&r2=1413476&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ClientListHashMapStore.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ClientListHashMapStore.java
 Mon Nov 26 04:28:52 2012
@@ -475,6 +475,25 @@ public class ClientListHashMapStore impl
                }
                return numberOfPublishingUsers;
        }
+       
+       /*
+        * (non-Javadoc)
+        * @see 
org.apache.openmeetings.conference.room.ISharedSessionStore#cleanAllServers()
+        */
+       public void cleanSessionsOfDeletedOrDeactivatedServer(Server server) {
+               // delete all existing client sessions by that slave, updating 
existing ones
+               // makes no sense, we don't know anything about the start or 
end date
+               // so at this point we can just remove them all and add them new
+               for (Iterator<Entry<String, ClientSession>> iter = clientList
+                               .entrySet().iterator(); iter.hasNext();) {
+                       Entry<String, ClientSession> entry = iter.next();
+                       
+                       if (entry.getValue().getServer() != null
+                                       && 
entry.getValue().getServer().getId().equals(server.getId())) {
+                               iter.remove();
+                       }
+               }
+       }
 
        /*
         * (non-Javadoc)

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ISharedSessionStore.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ISharedSessionStore.java?rev=1413476&r1=1413475&r2=1413476&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ISharedSessionStore.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ISharedSessionStore.java
 Mon Nov 26 04:28:52 2012
@@ -5,20 +5,23 @@ import java.util.List;
 import org.apache.openmeetings.persistence.beans.basic.Server;
 
 public interface ISharedSessionStore {
-       
+
        /**
-        * takes a list of clients from another slave of the cluster and sync 
its sessions to 
-        * the masters store, to have correct list of current users online and 
user load 
-        * at the master available that shows the current load on all slaves of 
the cluster.
+        * takes a list of clients from another slave of the cluster and sync 
its
+        * sessions to the masters store, to have correct list of current users
+        * online and user load at the master available that shows the current 
load
+        * on all slaves of the cluster.
         * 
-        * There is zero notification when there is session/user removed or 
added, those events
-        * are handled by the slave, the master just needs the list to be 
synced.
+        * There is zero notification when there is session/user removed or 
added,
+        * those events are handled by the slave, the master just needs the 
list to
+        * be synced.
         * 
         * @param server
         * @param clients
         */
-       public void syncSlaveClientSession (Server server, List<SlaveClientDto> 
clients);
-       
+       public void syncSlaveClientSession(Server server,
+                       List<SlaveClientDto> clients);
+
        /**
         * Get the current sessions
         * 
@@ -26,4 +29,12 @@ public interface ISharedSessionStore {
         */
        public List<SlaveClientDto> getCurrentSlaveSessions();
 
+       /**
+        * We want to make sure that if a server is deleted, also all its 
sessions
+        * are removed from the memory in the session store
+        * 
+        * @param server
+        */
+       public void cleanSessionsOfDeletedOrDeactivatedServer(Server server);
+
 }

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/basic/dao/ServerDao.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/basic/dao/ServerDao.java?rev=1413476&r1=1413475&r2=1413476&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/basic/dao/ServerDao.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/basic/dao/ServerDao.java
 Mon Nov 26 04:28:52 2012
@@ -28,6 +28,7 @@ import javax.persistence.PersistenceExce
 import javax.persistence.TypedQuery;
 
 import org.apache.openmeetings.OpenmeetingsVariables;
+import org.apache.openmeetings.conference.room.ISharedSessionStore;
 import org.apache.openmeetings.data.IDataProviderDao;
 import org.apache.openmeetings.data.user.dao.UsersDao;
 import org.apache.openmeetings.persistence.beans.basic.Server;
@@ -55,6 +56,9 @@ public class ServerDao implements IDataP
 
        @Autowired
        private UsersDao usersDao;
+       
+       @Autowired
+       private ISharedSessionStore clientListManager;
 
        /**
         * Get a list of all available servers
@@ -203,6 +207,9 @@ public class ServerDao implements IDataP
                } else {
                        s.setUpdated(new Date());
                        s.setUpdatedby(usersDao.get(userId));
+                       if (active != null && !active) {
+                               
clientListManager.cleanSessionsOfDeletedOrDeactivatedServer(s);
+                       }
                }
                s.setName(name);
                s.setAddress(address);
@@ -231,7 +238,8 @@ public class ServerDao implements IDataP
                }
                s.setDeleted(true);
                s = em.merge(s);
-
+               //remove any active session with this server
+               clientListManager.cleanSessionsOfDeletedOrDeactivatedServer(s);
                return true;
        }
 
@@ -244,6 +252,10 @@ public class ServerDao implements IDataP
         */
        public Server update(Server entity, long userId) {
                try {
+                       if (entity.getActive() != null && !entity.getActive()) {
+                               
clientListManager.cleanSessionsOfDeletedOrDeactivatedServer(entity);
+                       }
+                       
                        if (entity.getId() <= 0) {
                                entity.setInserted(new Date());
                                entity.setInsertedby(usersDao.get(userId));
@@ -262,6 +274,9 @@ public class ServerDao implements IDataP
        }
 
        public Server update(Server entity) {
+               if (entity.getActive() != null && !entity.getActive()) {
+                       
clientListManager.cleanSessionsOfDeletedOrDeactivatedServer(entity);
+               }
                em.merge(entity);
                return entity;
        }
@@ -275,6 +290,7 @@ public class ServerDao implements IDataP
         */
        public void delete(Server entity, long userId) {
                if (entity.getId() >= 0) {
+                       
clientListManager.cleanSessionsOfDeletedOrDeactivatedServer(entity);
                        entity.setUpdated(new Date());
                        entity.setUpdatedby(usersDao.get(userId));
                        entity.setDeleted(true);

Modified: 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/quartz/scheduler/ClusterSlaveJob.java
URL: 
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/quartz/scheduler/ClusterSlaveJob.java?rev=1413476&r1=1413475&r2=1413476&view=diff
==============================================================================
--- 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/quartz/scheduler/ClusterSlaveJob.java
 (original)
+++ 
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/quartz/scheduler/ClusterSlaveJob.java
 Mon Nov 26 04:28:52 2012
@@ -86,7 +86,7 @@ public class ClusterSlaveJob implements 
 
                        log.debug("ClusterSlaveJob. SERVERS :: "
                                        + serverDao.getSlavesForPing().size());
-
+                       
                        for (Server server : serverDao.getSlavesForPing()) {
 
                                RestClient rClient = getRestClient(server);


Reply via email to