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);