Author: sebawagner
Date: Fri Dec 7 03:08:35 2012
New Revision: 1418176
URL: http://svn.apache.org/viewvc?rev=1418176&view=rev
Log:
OPENMEETINGS-460 Fixes: Get a Server by the maximum user load, the server with
the smallest max users is returned (in case its a new room), if the room is
already opened on some server, it will return the server that host's the room.
Update of JUnit tests including server by room test
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/ClientListHashMapStore.java
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/IClientList.java
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/cluster/TestHashMapStore.java
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/userdata/TestLogin.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=1418176&r1=1418175&r2=1418176&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
Fri Dec 7 03:08:35 2012
@@ -23,11 +23,13 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Random;
+import java.util.Set;
import org.apache.openmeetings.OpenmeetingsVariables;
import org.apache.openmeetings.conference.room.cache.HashMapStore;
@@ -50,6 +52,8 @@ public class ClientListHashMapStore impl
ClientListHashMapStore.class,
OpenmeetingsVariables.webAppRootKey);
protected static HashMapStore cache = new HashMapStore();
+
+ private static Set<Long> EMPTY_HASH_SET = new HashSet<Long>();
@Autowired
private ManageCryptStyle manageCryptStyle;
@@ -367,32 +371,15 @@ public class ClientListHashMapStore impl
return clients;
}
-// /*
-// * (non-Javadoc)
-// * @see
org.apache.openmeetings.conference.room.IClientList#getActiveRoomsByServer()
-// */
-// public Map<Server,List<Long>> getActiveRoomsByServer() {
-// Map<Server,List<Long>> serverRooms = new
HashMap<Server,List<Long>>();
-//
-// for (ClientSession cSession : clientList.values()) {
-//
-// //We don't care about incomplete sessions or clients
that are not logged into any room
-// if (cSession.getRoomClient() == null
-// ||
cSession.getRoomClient().getRoom_id() == null) {
-// continue;
-// }
-//
-// List<Long> roomIds =
serverRooms.get(cSession.getServer());
-// if (roomIds == null) {
-// roomIds = new ArrayList<Long>();
-// }
-// if
(!roomIds.contains(cSession.getRoomClient().getRoom_id())) {
-//
roomIds.add(cSession.getRoomClient().getRoom_id());
-// }
-// serverRooms.put(cSession.getServer(), roomIds);
-// }
-//
-// return serverRooms;
-// }
+ /*
+ * (non-Javadoc)
+ * @see
org.apache.openmeetings.conference.room.IClientList#getActiveRoomsByServer()
+ */
+ public Set<Long> getActiveRoomIdsByServer(Server server) {
+ if (cache.getClientsByServerAndRoom(server) == null) {
+ return EMPTY_HASH_SET;
+ }
+ return cache.getClientsByServerAndRoom(server).keySet();
+ }
}
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/IClientList.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/IClientList.java?rev=1418176&r1=1418175&r2=1418176&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/IClientList.java
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/conference/room/IClientList.java
Fri Dec 7 03:08:35 2012
@@ -20,6 +20,7 @@ package org.apache.openmeetings.conferen
import java.util.Collection;
import java.util.List;
+import java.util.Set;
import org.apache.openmeetings.data.beans.basic.SearchResult;
import org.apache.openmeetings.persistence.beans.basic.Server;
@@ -159,5 +160,14 @@ public interface IClientList {
* @return
*/
public abstract long getPublishingCount(long roomId);
+
+ /**
+ * Get a list of all servers of all rooms on that server, serverId =
null
+ * means it is a local session on the master.
+ *
+ * @param server
+ * @return
+ */
+ public abstract Set<Long> getActiveRoomIdsByServer(Server server);
}
\ No newline at end of file
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java?rev=1418176&r1=1418175&r2=1418176&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
Fri Dec 7 03:08:35 2012
@@ -262,4 +262,5 @@ public class Server implements Serializa
+ ", active=" + active + ", webapp=" + webapp +
", deleted="
+ deleted + "]";
}
+
}
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java?rev=1418176&r1=1418175&r2=1418176&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
Fri Dec 7 03:08:35 2012
@@ -19,12 +19,16 @@
package org.apache.openmeetings.remote;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.TimeZone;
import org.apache.openmeetings.OpenmeetingsVariables;
@@ -781,11 +785,87 @@ public class ConferenceService {
if (serverList.size() == 0) {
return null;
}
-
+ //if the room is already opened on a server, redirect
the user to that one,
+ //we do that in too loop's because there is no query
involved here,
+ //only the first user that enters the conference room
needs to be adjusted
+ //to that server that has the less maxUser count in its
rooms currently.
+ //But if the room is already opened, then the maxUser
is no more relevant,
+ //the user will be just redirected to the same server
+
+ for (Server server : serverList) {
+ for (Long activeRoomId :
clientListManager.getActiveRoomIdsByServer(server)) {
+ if (activeRoomId.equals(roomId)) {
+ return server;
+ }
+ }
+ }
+
+ //the room is not opened on any server yet, its the
first user, get the maxUser
+ //per room
+
+ //TODO / FIXME: Get room's maxUser in a single query
instead a query for each room
+ final Map<Server,List<Rooms>> serverRoomMap = new
HashMap<Server,List<Rooms>>();
+
+ //Locally handled sessions are serverId = null
+ List<Rooms> localRoomList = new ArrayList<Rooms>();
+ for (Long activeRoomId :
clientListManager.getActiveRoomIdsByServer(null)) {
+ //FIXME / TODO: This is the single query to get
the room by its id
+ localRoomList.add(roomDao.get(activeRoomId));
+ }
+ serverRoomMap.put(null, localRoomList);
+
+ //Slave/Server rooms
+ for (Server server : serverList) {
+ List<Rooms> roomList = new ArrayList<Rooms>();
+ for (Long activeRoomId :
clientListManager.getActiveRoomIdsByServer(server)) {
+ //FIXME / TODO: This is the single
query to get the room by its id
+ roomList.add(roomDao.get(activeRoomId));
+ }
+ serverRoomMap.put(server, roomList);
+ }
+
+ //calc server with lowest max users
+ List<Server> list = new LinkedList<Server>();
+ list.addAll(serverRoomMap.keySet());
+ Collections.sort(list, new Comparator<Server>() {
+ public int compare(Server s1, Server s2) {
+ int maxUsersInRoomS1 = 0;
+ for (Rooms room : serverRoomMap.get(s1)) {
+ maxUsersInRoomS1 +=
room.getNumberOfPartizipants();
+ }
+ int maxUsersInRoomS2 = 0;
+ for (Rooms room : serverRoomMap.get(s2)) {
+ maxUsersInRoomS2 +=
room.getNumberOfPartizipants();
+ }
+
+ return maxUsersInRoomS1 - maxUsersInRoomS2;
+ }
+ });
+ LinkedHashMap<Server, List<Rooms>> serverRoomMapOrdered
= new LinkedHashMap<Server, List<Rooms>>();
+ for (Server server : list) {
+ serverRoomMapOrdered.put(server,
serverRoomMap.get(server));
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("Resulting order: ");
+ for (Entry<Server, List<Rooms>> entry :
serverRoomMapOrdered
+ .entrySet()) {
+ int maxUsersInRoom = 0;
+ for (Rooms room : entry.getValue()) {
+ maxUsersInRoom +=
room.getNumberOfPartizipants();
+ }
+ log.debug("entry " + entry.getKey() + "
Number of rooms "
+ +
entry.getValue().size() + " " + maxUsersInRoom);
+ }
+
+ }
+
+ return
serverRoomMapOrdered.entrySet().iterator().next().getKey();
}
+ //Empty server object
return new Server();
}
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/cluster/TestHashMapStore.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/cluster/TestHashMapStore.java?rev=1418176&r1=1418175&r2=1418176&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/cluster/TestHashMapStore.java
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/cluster/TestHashMapStore.java
Fri Dec 7 03:08:35 2012
@@ -17,8 +17,14 @@ import org.apache.openmeetings.conferenc
import org.apache.openmeetings.conference.room.RoomClient;
import org.apache.openmeetings.conference.room.SlaveClientDto;
import org.apache.openmeetings.conference.room.cache.HashMapStore;
+import org.apache.openmeetings.data.basic.dao.ServerDao;
import org.apache.openmeetings.data.beans.basic.SearchResult;
+import org.apache.openmeetings.data.user.Usermanagement;
import org.apache.openmeetings.persistence.beans.basic.Server;
+import org.apache.openmeetings.persistence.beans.basic.Sessiondata;
+import org.apache.openmeetings.persistence.beans.user.Users;
+import org.apache.openmeetings.remote.ConferenceService;
+import org.apache.openmeetings.remote.MainService;
import org.apache.openmeetings.test.AbstractOpenmeetingsSpringTest;
import org.apache.openmeetings.utils.crypt.ICryptString;
import org.apache.openmeetings.utils.crypt.MD5Implementation;
@@ -26,6 +32,7 @@ import org.apache.openmeetings.utils.mat
import org.junit.Test;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
public class TestHashMapStore extends AbstractOpenmeetingsSpringTest {
@@ -33,10 +40,19 @@ public class TestHashMapStore extends Ab
TestHashMapStore.class,
OpenmeetingsVariables.webAppRootKey);
private ClientListHashMapStoreTesting sessionManager = new
ClientListHashMapStoreTesting();
+
+ @Autowired
+ private MainService mService;
+ @Autowired
+ private Usermanagement userManagement;
+ @Autowired
+ private ConferenceService conferenceService;
+ @Autowired
+ private ServerDao serverDao;
int localSessions = 200;
int slaveSessionSize = 200;
-
+
@Test
public void doClientTest() {
@@ -78,7 +94,7 @@ public class TestHashMapStore extends Ab
addSyncClients(1);
addSyncClients(2);
- addSyncClients(4);
+ addSyncClients(3);
log.debug("Local Cache size " +
sessionManager.getAllClients().size());
assertEquals(sessionManager.getAllClients().size(),
localSessions);
@@ -109,7 +125,7 @@ public class TestHashMapStore extends Ab
addSyncClients(1);
addSyncClients(2);
- addSyncClients(4);
+ addSyncClients(3);
log.debug("Number of sessions Total " +
searchResult.getRecords());
@@ -184,12 +200,28 @@ public class TestHashMapStore extends Ab
log.debug("roomSession: "+roomSession);
assertEquals(roomSession,
sessionManager.getCache().getTotalNumberOfSessions());
+
+ Sessiondata sessionData = mService.getsessiondata();
+
+ Users us = (Users)
userManagement.loginUser(sessionData.getSession_id(), username, userpass, null,
false);
+
+ log.debug("us "+us);
+
+ assertTrue(us != null);
+
+ Server server =
conferenceService.getServerForSession(sessionData.getSession_id(), 8);
+ log.debug("server "+server);
}
private void addSyncClients(long serverId) {
- Server s = new Server();
- s.setId(serverId);
+
+ Server server = serverDao.get(serverId);
+ if (server == null) {
+ serverDao.saveServer(serverId, "name", "127.0.0.1",
5080, "swagner", "qweqwe", "openmeetings", "http", true, "", 1L);
+ server = serverDao.get(serverId);
+ }
+
List<SlaveClientDto> clients = new ArrayList<SlaveClientDto>();
for (int i = 0; i < slaveSessionSize; i++) {
@@ -212,7 +244,7 @@ public class TestHashMapStore extends Ab
clients.add(slaveDto);
}
- this.sessionManager.syncSlaveClientSession(s, clients);
+ this.sessionManager.syncSlaveClientSession(server, clients);
}
private class ClientListHashMapStoreTesting extends
ClientListHashMapStore {
Modified:
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/userdata/TestLogin.java
URL:
http://svn.apache.org/viewvc/incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/userdata/TestLogin.java?rev=1418176&r1=1418175&r2=1418176&view=diff
==============================================================================
---
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/userdata/TestLogin.java
(original)
+++
incubator/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/test/userdata/TestLogin.java
Fri Dec 7 03:08:35 2012
@@ -20,6 +20,7 @@ package org.apache.openmeetings.test.use
import static org.junit.Assert.assertNotNull;
+import org.apache.openmeetings.data.user.Usermanagement;
import org.apache.openmeetings.persistence.beans.basic.Sessiondata;
import org.apache.openmeetings.persistence.beans.user.Users;
import org.apache.openmeetings.remote.MainService;
@@ -28,14 +29,18 @@ import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
public class TestLogin extends AbstractOpenmeetingsSpringTest {
+
@Autowired
private MainService mService;
+
+ @Autowired
+ private Usermanagement userManagement;
@Test
public void testTestLogin(){
Sessiondata sessionData = mService.getsessiondata();
- Users us = (Users)
mService.loginUser(sessionData.getSession_id(), username, userpass, false,
null, -1L);
+ Users us = (Users)
userManagement.loginUser(sessionData.getSession_id(), username, userpass, null,
false);
assertNotNull("User is unable to login", us);