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


Reply via email to