You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openmeetings.apache.org by "seba.wagner@gmail.com" <se...@gmail.com> on 2013/02/27 07:10:26 UTC
Re: svn commit: r1450608 - in /openmeetings/trunk/singlewebapp/src/org/apache/openmeetings:
data/conference/dao/ persistence/beans/basic/ persistence/beans/room/ remote/
session/ session/store/
Hi Maxim,
I don't understand your changes to the HashMapStore.
Why is there a reference to the ServerUtil in the HashMapStore at all?
The HashMapStore should only be used if _no_ server is configured at all,
no cluster, zero :)
So actually getCurrentServer should not be used in the case where you are
using memory based store (aka "HashMapStore").
And in that sense: public List<Long> getRoomsIdsByServer(Server server)
simply should always return the current list of all roomIds, not a subset
of it.
In case of HashMapStore there is no cluster or other server involved, so
its logically impossible that this function will be called with any server.
But maybe I don't understand the entire scope of the changes that you
committed.
Sebastian
2013/2/27 <so...@apache.org>
> Author: solomax
> Date: Wed Feb 27 05:28:29 2013
> New Revision: 1450608
>
> URL: http://svn.apache.org/r1450608
> Log:
> SIP: additional NPE check is added
> Cluster: getServerForSession is refactored to work as expected with no
> overhead
>
> Modified:
>
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
>
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
>
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
>
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
>
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
>
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
>
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
>
> Modified:
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
> URL:
> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>
> ==============================================================================
> ---
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
> (original)
> +++
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
> Wed Feb 27 05:28:29 2013
> @@ -75,8 +75,7 @@ public class RoomDao implements IDataPro
> }
>
> public List<Room> getPublicRooms() {
> - return em.createNamedQuery("getPublicRoomsOrdered",
> Room.class)
> - .getResultList();
> + return em.createNamedQuery("getPublicRoomsOrdered",
> Room.class).getResultList();
> }
>
> public List<Long> getSipRooms(List<Long> ids) {
> @@ -96,6 +95,11 @@ public class RoomDao implements IDataPro
> return q.getResultList();
> }
>
> + public Long getRoomsCapacityByIds(List<Long> ids) {
> + return ids == null || ids.isEmpty() ? 0
> + : em.createNamedQuery("getRoomsCapacityByIds",
> Long.class).setParameter("ids", ids).getSingleResult();
> + }
> +
> private boolean isSipEnabled() {
> return "yes".equals(cfgDao.getConfValue("red5sip.enable",
> String.class, "no"));
> }
>
> Modified:
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
> URL:
> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>
> ==============================================================================
> ---
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
> (original)
> +++
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
> Wed Feb 27 05:28:29 2013
> @@ -59,6 +59,10 @@ public class SipDao {
> }
>
> private ManagerResponse exec(ManagerAction action) {
> + if (connection == null) {
> + log.warn("There is no Asterisk configured");
> + return null;
> + }
> try {
> connection.login();
> ManagerResponse r = connection.sendAction(action);
> @@ -73,6 +77,10 @@ public class SipDao {
> }
>
> private ResponseEvents execEvent(EventGeneratingAction action) {
> + if (connection == null) {
> + log.warn("There is no Asterisk configured");
> + return null;
> + }
> try {
> connection.login("on");
> ResponseEvents r =
> connection.sendEventGeneratingAction(action);
>
> Modified:
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
> URL:
> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>
> ==============================================================================
> ---
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
> (original)
> +++
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
> Wed Feb 27 05:28:29 2013
> @@ -258,6 +258,27 @@ public class Server implements Serializa
> }
>
> @Override
> + public boolean equals(Object obj) {
> + if (obj == null) {
> + return false;
> + }
> + if (!(obj instanceof Server)) {
> + return false;
> + } else {
> + Server s = (Server)obj;
> + return s.id == id && ((s.name != null &&
> s.name.equals(name)) || (s.name == null && s.name == name));
> + }
> + }
> +
> + @Override
> + public int hashCode() {
> + final int prime = 31;
> + int result = 1;
> + result = prime * result + (int)id + (name == null ? 0 :
> name.hashCode());
> + return result;
> + }
> +
> + @Override
> public String toString() {
> return "Server [id=" + id + ", name=" + name + ",
> address=" + address
> + ", port=" + port + ", user=" + user + ",
> pass=" + pass
>
> Modified:
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
> URL:
> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>
> ==============================================================================
> ---
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
> (original)
> +++
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
> Wed Feb 27 05:28:29 2013
> @@ -72,7 +72,8 @@ import org.simpleframework.xml.Root;
> @NamedQuery(name = "getRoomById", query = "SELECT r FROM Room r
> WHERE r.deleted = false AND r.rooms_id = :id"),
> @NamedQuery(name = "getSipRoomIdsByIds", query = "SELECT
> r.rooms_id FROM Room r WHERE r.deleted = false AND r.sipEnabled = true AND
> r.rooms_id IN :ids"),
> @NamedQuery(name = "countRooms", query = "SELECT COUNT(r) FROM
> Room r WHERE r.deleted = false"),
> - @NamedQuery(name = "getBackupRooms", query = "SELECT r FROM Room r
> LEFT JOIN FETCH r.moderators WHERE r.deleted = false ")
> + @NamedQuery(name = "getBackupRooms", query = "SELECT r FROM Room r
> LEFT JOIN FETCH r.moderators WHERE r.deleted = false "),
> + @NamedQuery(name = "getRoomsCapacityByIds", query = "SELECT
> SUM(r.numberOfPartizipants) FROM Room r WHERE r.deleted = false AND
> r.rooms_id IN :ids")
> })
> @Table(name = "room")
> @Root(name = "room")
>
> Modified:
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
> URL:
> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>
> ==============================================================================
> ---
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
> (original)
> +++
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
> Wed Feb 27 05:28:29 2013
> @@ -19,16 +19,12 @@
> 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;
> @@ -775,98 +771,29 @@ public class ConferenceService {
> if (authLevelUtil.checkUserLevel(user_level)) {
> List<Server> serverList =
> serverDao.getActiveServers();
>
> - // if there is no cluster set up, just redirect to
> the current one
> - 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 two 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
> -
> + long minimum = -1;
> + Server result = null;
> + HashMap<Server, List<Long>> activeRoomsMap = new
> HashMap<Server, List<Long>>();
> for (Server server : serverList) {
> - for (Long activeRoomId :
> sessionManager.getActiveRoomIdsByServer(server)) {
> - if (activeRoomId.equals(roomId)) {
> - return new
> ServerDTO(server);
> - }
> + List<Long> roomIds =
> sessionManager.getActiveRoomIdsByServer(server);
> + if (roomIds.contains(roomId)) {
> + // if the room is already opened
> on a server, redirect the user to that one,
> + log.debug("Room is already opened
> on a server " + server.getAddress());
> + return new ServerDTO(server);
> }
> + activeRoomsMap.put(server, roomIds);
> }
> -
> - // 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<Room>> serverRoomMap = new
> HashMap<Server, List<Room>>();
> - // Slave/Server rooms
> - for (Server server : serverList) {
> - List<Room> roomList = new
> ArrayList<Room>();
> - for (Long activeRoomId :
> sessionManager.getActiveRoomIdsByServer(server)) {
> - // FIXME / TODO: This is the
> single query to get the room by its id
> -
> roomList.add(roomDao.get(activeRoomId));
> + for (Server server : activeRoomsMap.keySet()) {
> + List<Long> roomIds =
> activeRoomsMap.get(server);
> + Long capacity =
> roomDao.getRoomsCapacityByIds(roomIds);
> + if (minimum < 0 || capacity < minimum) {
> + minimum = capacity;
> + result = server;
> }
> - 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;
> - log.debug("serverRoomMap.get(s1)
> SIZE " + serverRoomMap.get(s1).size());
> - for (Room room :
> serverRoomMap.get(s1)) {
> - log.debug("s1 room: " +
> room);
> - maxUsersInRoomS1 +=
> room.getNumberOfPartizipants();
> - }
> - int maxUsersInRoomS2 = 0;
> - log.debug("serverRoomMap.get(s2)
> SIZE " + serverRoomMap.get(s2).size());
> - for (Room room :
> serverRoomMap.get(s2)) {
> - log.debug("s2 room: " +
> room);
> - maxUsersInRoomS2 +=
> room.getNumberOfPartizipants();
> - }
> -
> - return maxUsersInRoomS1 -
> maxUsersInRoomS2;
> - }
> - });
> -
> - LinkedHashMap<Server, List<Room>>
> serverRoomMapOrdered = new LinkedHashMap<Server, List<Room>>();
> - for (Server server : list) {
> - serverRoomMapOrdered.put(server,
> serverRoomMap.get(server));
> + log.debug("Checking server: " + server + "
> Number of rooms " + roomIds.size() + " RoomIds: "
> + + roomIds + " max(Sum): "
> + capacity);
> }
> -
> - if (log.isDebugEnabled()) {
> - log.debug("Resulting order: ");
> - for (Entry<Server, List<Room>> entry :
> serverRoomMapOrdered.entrySet()) {
> - int maxUsersInRoom = 0;
> - for (Room room : entry.getValue())
> {
> - maxUsersInRoom +=
> room.getNumberOfPartizipants();
> - }
> -
> - String roomids = "";
> - for (Room r : entry.getValue()) {
> - roomids += " " +
> r.getRooms_id();
> - }
> -
> - log.debug("entry " +
> entry.getKey() + " Number of rooms " + entry.getValue().size() + " RoomIds:
> "
> - + roomids + "
> max(Sum): " + maxUsersInRoom);
> - }
> -
> - }
> -
> - log.debug("Resulting Server");
> -
> - Server s =
> serverRoomMapOrdered.entrySet().iterator().next().getKey();
> -
> - if (s == null) {
> - return null;
> - }
> -
> - // Somehow this object here cannot be serialized
> cause its abused by OpenJPA
> - // so get a fresh copy from the entity manager and
> return that
> - return new ServerDTO(s);
> + return result == null ? null : new
> ServerDTO(result);
> }
>
> log.error("Could not get server for cluster session");
>
> Modified:
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
> URL:
> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>
> ==============================================================================
> ---
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
> (original)
> +++
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
> Wed Feb 27 05:28:29 2013
> @@ -432,10 +432,7 @@ public class SessionManager implements I
> }
>
> public List<Long> getActiveRoomIdsByServer(Server server) {
> - if (server == null) {
> - server = serverUtil.getCurrentServer();
> - }
> - return sessionManager.getActiveRoomIdsByServer(server);
> + return sessionManager.getActiveRoomIdsByServer(server ==
> null ? serverUtil.getCurrentServer() : server);
> }
>
> public String getSessionStatistics() {
>
> Modified:
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
> URL:
> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>
> ==============================================================================
> ---
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
> (original)
> +++
> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
> Wed Feb 27 05:28:29 2013
> @@ -29,8 +29,10 @@ import java.util.Map;
> import org.apache.openmeetings.OpenmeetingsVariables;
> import org.apache.openmeetings.persistence.beans.basic.Server;
> import org.apache.openmeetings.persistence.beans.room.Client;
> +import org.apache.openmeetings.session.ServerUtil;
> import org.red5.logging.Red5LoggerFactory;
> import org.slf4j.Logger;
> +import org.springframework.beans.factory.annotation.Autowired;
>
> /**
> * Stores the session in the memory.
> @@ -48,9 +50,10 @@ import org.slf4j.Logger;
> *
> */
> public class HashMapStore implements IClientPersistenceStore {
> -
> protected static final Logger log = Red5LoggerFactory.getLogger(
> HashMapStore.class,
> OpenmeetingsVariables.webAppRootKey);
> + @Autowired
> + private ServerUtil serverUtil;
>
>
> private LinkedHashMap<String, Client> clientsByStreamId = new
> LinkedHashMap<String, Client>();
> @@ -179,7 +182,7 @@ public class HashMapStore implements ICl
> HashSet<Long> rooms = new HashSet<Long>();
> for (Client cl : clientsByStreamId.values()) {
> Long roomId = cl.getRoom_id();
> - Server s = cl.getServer();
> + Server s = cl.getServer() == null ?
> serverUtil.getCurrentServer() : cl.getServer();
> if ((server == null && s != null) || (server !=
> null && s == null)) {
> continue;
> }
>
>
>
--
Sebastian Wagner
https://twitter.com/#!/dead_lock
http://www.webbase-design.de
http://www.wagner-sebastian.com
seba.wagner@gmail.com
Re: svn commit: r1450608 - in /openmeetings/trunk/singlewebapp/src/org/apache/openmeetings:
data/conference/dao/ persistence/beans/basic/ persistence/beans/room/ remote/
session/ session/store/
Posted by Maxim Solodovnik <so...@gmail.com>.
done
On Wed, Feb 27, 2013 at 1:16 PM, Maxim Solodovnik <so...@gmail.com>wrote:
> Hello Sebastian,
>
> in your instructions to Denis you haven't mention MapStore should be
> switched
> So I have tested it with HashMapStore ...
>
> I'll revert changes to HashMapStore
>
>
> On Wed, Feb 27, 2013 at 1:10 PM, seba.wagner@gmail.com <
> seba.wagner@gmail.com> wrote:
>
>> Hi Maxim,
>>
>> I don't understand your changes to the HashMapStore.
>>
>> Why is there a reference to the ServerUtil in the HashMapStore at all?
>> The HashMapStore should only be used if _no_ server is configured at all,
>> no cluster, zero :)
>>
>> So actually getCurrentServer should not be used in the case where you are
>> using memory based store (aka "HashMapStore").
>>
>> And in that sense: public List<Long> getRoomsIdsByServer(Server server)
>> simply should always return the current list of all roomIds, not a subset
>> of it.
>> In case of HashMapStore there is no cluster or other server involved, so
>> its logically impossible that this function will be called with any server.
>>
>> But maybe I don't understand the entire scope of the changes that you
>> committed.
>>
>> Sebastian
>>
>>
>> 2013/2/27 <so...@apache.org>
>>
>>> Author: solomax
>>> Date: Wed Feb 27 05:28:29 2013
>>> New Revision: 1450608
>>>
>>> URL: http://svn.apache.org/r1450608
>>> Log:
>>> SIP: additional NPE check is added
>>> Cluster: getServerForSession is refactored to work as expected with no
>>> overhead
>>>
>>> Modified:
>>>
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
>>>
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
>>>
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
>>>
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
>>>
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
>>>
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
>>>
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
>>>
>>> Modified:
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
>>> URL:
>>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
>>> (original)
>>> +++
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
>>> Wed Feb 27 05:28:29 2013
>>> @@ -75,8 +75,7 @@ public class RoomDao implements IDataPro
>>> }
>>>
>>> public List<Room> getPublicRooms() {
>>> - return em.createNamedQuery("getPublicRoomsOrdered",
>>> Room.class)
>>> - .getResultList();
>>> + return em.createNamedQuery("getPublicRoomsOrdered",
>>> Room.class).getResultList();
>>> }
>>>
>>> public List<Long> getSipRooms(List<Long> ids) {
>>> @@ -96,6 +95,11 @@ public class RoomDao implements IDataPro
>>> return q.getResultList();
>>> }
>>>
>>> + public Long getRoomsCapacityByIds(List<Long> ids) {
>>> + return ids == null || ids.isEmpty() ? 0
>>> + : em.createNamedQuery("getRoomsCapacityByIds",
>>> Long.class).setParameter("ids", ids).getSingleResult();
>>> + }
>>> +
>>> private boolean isSipEnabled() {
>>> return
>>> "yes".equals(cfgDao.getConfValue("red5sip.enable", String.class, "no"));
>>> }
>>>
>>> Modified:
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
>>> URL:
>>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
>>> (original)
>>> +++
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
>>> Wed Feb 27 05:28:29 2013
>>> @@ -59,6 +59,10 @@ public class SipDao {
>>> }
>>>
>>> private ManagerResponse exec(ManagerAction action) {
>>> + if (connection == null) {
>>> + log.warn("There is no Asterisk configured");
>>> + return null;
>>> + }
>>> try {
>>> connection.login();
>>> ManagerResponse r =
>>> connection.sendAction(action);
>>> @@ -73,6 +77,10 @@ public class SipDao {
>>> }
>>>
>>> private ResponseEvents execEvent(EventGeneratingAction action) {
>>> + if (connection == null) {
>>> + log.warn("There is no Asterisk configured");
>>> + return null;
>>> + }
>>> try {
>>> connection.login("on");
>>> ResponseEvents r =
>>> connection.sendEventGeneratingAction(action);
>>>
>>> Modified:
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
>>> URL:
>>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
>>> (original)
>>> +++
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
>>> Wed Feb 27 05:28:29 2013
>>> @@ -258,6 +258,27 @@ public class Server implements Serializa
>>> }
>>>
>>> @Override
>>> + public boolean equals(Object obj) {
>>> + if (obj == null) {
>>> + return false;
>>> + }
>>> + if (!(obj instanceof Server)) {
>>> + return false;
>>> + } else {
>>> + Server s = (Server)obj;
>>> + return s.id == id && ((s.name != null &&
>>> s.name.equals(name)) || (s.name == null && s.name == name));
>>> + }
>>> + }
>>> +
>>> + @Override
>>> + public int hashCode() {
>>> + final int prime = 31;
>>> + int result = 1;
>>> + result = prime * result + (int)id + (name == null ? 0 :
>>> name.hashCode());
>>> + return result;
>>> + }
>>> +
>>> + @Override
>>> public String toString() {
>>> return "Server [id=" + id + ", name=" + name + ",
>>> address=" + address
>>> + ", port=" + port + ", user=" + user +
>>> ", pass=" + pass
>>>
>>> Modified:
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
>>> URL:
>>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
>>> (original)
>>> +++
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
>>> Wed Feb 27 05:28:29 2013
>>> @@ -72,7 +72,8 @@ import org.simpleframework.xml.Root;
>>> @NamedQuery(name = "getRoomById", query = "SELECT r FROM Room r
>>> WHERE r.deleted = false AND r.rooms_id = :id"),
>>> @NamedQuery(name = "getSipRoomIdsByIds", query = "SELECT
>>> r.rooms_id FROM Room r WHERE r.deleted = false AND r.sipEnabled = true AND
>>> r.rooms_id IN :ids"),
>>> @NamedQuery(name = "countRooms", query = "SELECT COUNT(r) FROM
>>> Room r WHERE r.deleted = false"),
>>> - @NamedQuery(name = "getBackupRooms", query = "SELECT r FROM Room
>>> r LEFT JOIN FETCH r.moderators WHERE r.deleted = false ")
>>> + @NamedQuery(name = "getBackupRooms", query = "SELECT r FROM Room
>>> r LEFT JOIN FETCH r.moderators WHERE r.deleted = false "),
>>> + @NamedQuery(name = "getRoomsCapacityByIds", query = "SELECT
>>> SUM(r.numberOfPartizipants) FROM Room r WHERE r.deleted = false AND
>>> r.rooms_id IN :ids")
>>> })
>>> @Table(name = "room")
>>> @Root(name = "room")
>>>
>>> Modified:
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
>>> URL:
>>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
>>> (original)
>>> +++
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
>>> Wed Feb 27 05:28:29 2013
>>> @@ -19,16 +19,12 @@
>>> 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;
>>> @@ -775,98 +771,29 @@ public class ConferenceService {
>>> if (authLevelUtil.checkUserLevel(user_level)) {
>>> List<Server> serverList =
>>> serverDao.getActiveServers();
>>>
>>> - // if there is no cluster set up, just redirect
>>> to the current one
>>> - 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 two 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
>>> -
>>> + long minimum = -1;
>>> + Server result = null;
>>> + HashMap<Server, List<Long>> activeRoomsMap = new
>>> HashMap<Server, List<Long>>();
>>> for (Server server : serverList) {
>>> - for (Long activeRoomId :
>>> sessionManager.getActiveRoomIdsByServer(server)) {
>>> - if (activeRoomId.equals(roomId))
>>> {
>>> - return new
>>> ServerDTO(server);
>>> - }
>>> + List<Long> roomIds =
>>> sessionManager.getActiveRoomIdsByServer(server);
>>> + if (roomIds.contains(roomId)) {
>>> + // if the room is already opened
>>> on a server, redirect the user to that one,
>>> + log.debug("Room is already
>>> opened on a server " + server.getAddress());
>>> + return new ServerDTO(server);
>>> }
>>> + activeRoomsMap.put(server, roomIds);
>>> }
>>> -
>>> - // 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<Room>> serverRoomMap =
>>> new HashMap<Server, List<Room>>();
>>> - // Slave/Server rooms
>>> - for (Server server : serverList) {
>>> - List<Room> roomList = new
>>> ArrayList<Room>();
>>> - for (Long activeRoomId :
>>> sessionManager.getActiveRoomIdsByServer(server)) {
>>> - // FIXME / TODO: This is the
>>> single query to get the room by its id
>>> -
>>> roomList.add(roomDao.get(activeRoomId));
>>> + for (Server server : activeRoomsMap.keySet()) {
>>> + List<Long> roomIds =
>>> activeRoomsMap.get(server);
>>> + Long capacity =
>>> roomDao.getRoomsCapacityByIds(roomIds);
>>> + if (minimum < 0 || capacity < minimum) {
>>> + minimum = capacity;
>>> + result = server;
>>> }
>>> - 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;
>>> - log.debug("serverRoomMap.get(s1)
>>> SIZE " + serverRoomMap.get(s1).size());
>>> - for (Room room :
>>> serverRoomMap.get(s1)) {
>>> - log.debug("s1 room: " +
>>> room);
>>> - maxUsersInRoomS1 +=
>>> room.getNumberOfPartizipants();
>>> - }
>>> - int maxUsersInRoomS2 = 0;
>>> - log.debug("serverRoomMap.get(s2)
>>> SIZE " + serverRoomMap.get(s2).size());
>>> - for (Room room :
>>> serverRoomMap.get(s2)) {
>>> - log.debug("s2 room: " +
>>> room);
>>> - maxUsersInRoomS2 +=
>>> room.getNumberOfPartizipants();
>>> - }
>>> -
>>> - return maxUsersInRoomS1 -
>>> maxUsersInRoomS2;
>>> - }
>>> - });
>>> -
>>> - LinkedHashMap<Server, List<Room>>
>>> serverRoomMapOrdered = new LinkedHashMap<Server, List<Room>>();
>>> - for (Server server : list) {
>>> - serverRoomMapOrdered.put(server,
>>> serverRoomMap.get(server));
>>> + log.debug("Checking server: " + server +
>>> " Number of rooms " + roomIds.size() + " RoomIds: "
>>> + + roomIds + " max(Sum):
>>> " + capacity);
>>> }
>>> -
>>> - if (log.isDebugEnabled()) {
>>> - log.debug("Resulting order: ");
>>> - for (Entry<Server, List<Room>> entry :
>>> serverRoomMapOrdered.entrySet()) {
>>> - int maxUsersInRoom = 0;
>>> - for (Room room :
>>> entry.getValue()) {
>>> - maxUsersInRoom +=
>>> room.getNumberOfPartizipants();
>>> - }
>>> -
>>> - String roomids = "";
>>> - for (Room r : entry.getValue()) {
>>> - roomids += " " +
>>> r.getRooms_id();
>>> - }
>>> -
>>> - log.debug("entry " +
>>> entry.getKey() + " Number of rooms " + entry.getValue().size() + " RoomIds:
>>> "
>>> - + roomids + "
>>> max(Sum): " + maxUsersInRoom);
>>> - }
>>> -
>>> - }
>>> -
>>> - log.debug("Resulting Server");
>>> -
>>> - Server s =
>>> serverRoomMapOrdered.entrySet().iterator().next().getKey();
>>> -
>>> - if (s == null) {
>>> - return null;
>>> - }
>>> -
>>> - // Somehow this object here cannot be serialized
>>> cause its abused by OpenJPA
>>> - // so get a fresh copy from the entity manager
>>> and return that
>>> - return new ServerDTO(s);
>>> + return result == null ? null : new
>>> ServerDTO(result);
>>> }
>>>
>>> log.error("Could not get server for cluster session");
>>>
>>> Modified:
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
>>> URL:
>>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
>>> (original)
>>> +++
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
>>> Wed Feb 27 05:28:29 2013
>>> @@ -432,10 +432,7 @@ public class SessionManager implements I
>>> }
>>>
>>> public List<Long> getActiveRoomIdsByServer(Server server) {
>>> - if (server == null) {
>>> - server = serverUtil.getCurrentServer();
>>> - }
>>> - return sessionManager.getActiveRoomIdsByServer(server);
>>> + return sessionManager.getActiveRoomIdsByServer(server ==
>>> null ? serverUtil.getCurrentServer() : server);
>>> }
>>>
>>> public String getSessionStatistics() {
>>>
>>> Modified:
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
>>> URL:
>>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>>
>>> ==============================================================================
>>> ---
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
>>> (original)
>>> +++
>>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
>>> Wed Feb 27 05:28:29 2013
>>> @@ -29,8 +29,10 @@ import java.util.Map;
>>> import org.apache.openmeetings.OpenmeetingsVariables;
>>> import org.apache.openmeetings.persistence.beans.basic.Server;
>>> import org.apache.openmeetings.persistence.beans.room.Client;
>>> +import org.apache.openmeetings.session.ServerUtil;
>>> import org.red5.logging.Red5LoggerFactory;
>>> import org.slf4j.Logger;
>>> +import org.springframework.beans.factory.annotation.Autowired;
>>>
>>> /**
>>> * Stores the session in the memory.
>>> @@ -48,9 +50,10 @@ import org.slf4j.Logger;
>>> *
>>> */
>>> public class HashMapStore implements IClientPersistenceStore {
>>> -
>>> protected static final Logger log = Red5LoggerFactory.getLogger(
>>> HashMapStore.class,
>>> OpenmeetingsVariables.webAppRootKey);
>>> + @Autowired
>>> + private ServerUtil serverUtil;
>>>
>>>
>>> private LinkedHashMap<String, Client> clientsByStreamId = new
>>> LinkedHashMap<String, Client>();
>>> @@ -179,7 +182,7 @@ public class HashMapStore implements ICl
>>> HashSet<Long> rooms = new HashSet<Long>();
>>> for (Client cl : clientsByStreamId.values()) {
>>> Long roomId = cl.getRoom_id();
>>> - Server s = cl.getServer();
>>> + Server s = cl.getServer() == null ?
>>> serverUtil.getCurrentServer() : cl.getServer();
>>> if ((server == null && s != null) || (server !=
>>> null && s == null)) {
>>> continue;
>>> }
>>>
>>>
>>>
>>
>>
>> --
>> Sebastian Wagner
>> https://twitter.com/#!/dead_lock
>> http://www.webbase-design.de
>> http://www.wagner-sebastian.com
>> seba.wagner@gmail.com
>>
>
>
>
> --
> WBR
> Maxim aka solomax
>
--
WBR
Maxim aka solomax
Re: svn commit: r1450608 - in /openmeetings/trunk/singlewebapp/src/org/apache/openmeetings:
data/conference/dao/ persistence/beans/basic/ persistence/beans/room/ remote/
session/ session/store/
Posted by Maxim Solodovnik <so...@gmail.com>.
Hello Sebastian,
in your instructions to Denis you haven't mention MapStore should be
switched
So I have tested it with HashMapStore ...
I'll revert changes to HashMapStore
On Wed, Feb 27, 2013 at 1:10 PM, seba.wagner@gmail.com <
seba.wagner@gmail.com> wrote:
> Hi Maxim,
>
> I don't understand your changes to the HashMapStore.
>
> Why is there a reference to the ServerUtil in the HashMapStore at all?
> The HashMapStore should only be used if _no_ server is configured at all,
> no cluster, zero :)
>
> So actually getCurrentServer should not be used in the case where you are
> using memory based store (aka "HashMapStore").
>
> And in that sense: public List<Long> getRoomsIdsByServer(Server server)
> simply should always return the current list of all roomIds, not a subset
> of it.
> In case of HashMapStore there is no cluster or other server involved, so
> its logically impossible that this function will be called with any server.
>
> But maybe I don't understand the entire scope of the changes that you
> committed.
>
> Sebastian
>
>
> 2013/2/27 <so...@apache.org>
>
>> Author: solomax
>> Date: Wed Feb 27 05:28:29 2013
>> New Revision: 1450608
>>
>> URL: http://svn.apache.org/r1450608
>> Log:
>> SIP: additional NPE check is added
>> Cluster: getServerForSession is refactored to work as expected with no
>> overhead
>>
>> Modified:
>>
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
>>
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
>>
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
>>
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
>>
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
>>
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
>>
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
>>
>> Modified:
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
>> URL:
>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>
>> ==============================================================================
>> ---
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
>> (original)
>> +++
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/RoomDao.java
>> Wed Feb 27 05:28:29 2013
>> @@ -75,8 +75,7 @@ public class RoomDao implements IDataPro
>> }
>>
>> public List<Room> getPublicRooms() {
>> - return em.createNamedQuery("getPublicRoomsOrdered",
>> Room.class)
>> - .getResultList();
>> + return em.createNamedQuery("getPublicRoomsOrdered",
>> Room.class).getResultList();
>> }
>>
>> public List<Long> getSipRooms(List<Long> ids) {
>> @@ -96,6 +95,11 @@ public class RoomDao implements IDataPro
>> return q.getResultList();
>> }
>>
>> + public Long getRoomsCapacityByIds(List<Long> ids) {
>> + return ids == null || ids.isEmpty() ? 0
>> + : em.createNamedQuery("getRoomsCapacityByIds",
>> Long.class).setParameter("ids", ids).getSingleResult();
>> + }
>> +
>> private boolean isSipEnabled() {
>> return "yes".equals(cfgDao.getConfValue("red5sip.enable",
>> String.class, "no"));
>> }
>>
>> Modified:
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
>> URL:
>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>
>> ==============================================================================
>> ---
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
>> (original)
>> +++
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/data/conference/dao/SipDao.java
>> Wed Feb 27 05:28:29 2013
>> @@ -59,6 +59,10 @@ public class SipDao {
>> }
>>
>> private ManagerResponse exec(ManagerAction action) {
>> + if (connection == null) {
>> + log.warn("There is no Asterisk configured");
>> + return null;
>> + }
>> try {
>> connection.login();
>> ManagerResponse r = connection.sendAction(action);
>> @@ -73,6 +77,10 @@ public class SipDao {
>> }
>>
>> private ResponseEvents execEvent(EventGeneratingAction action) {
>> + if (connection == null) {
>> + log.warn("There is no Asterisk configured");
>> + return null;
>> + }
>> try {
>> connection.login("on");
>> ResponseEvents r =
>> connection.sendEventGeneratingAction(action);
>>
>> Modified:
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
>> URL:
>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>
>> ==============================================================================
>> ---
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
>> (original)
>> +++
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/basic/Server.java
>> Wed Feb 27 05:28:29 2013
>> @@ -258,6 +258,27 @@ public class Server implements Serializa
>> }
>>
>> @Override
>> + public boolean equals(Object obj) {
>> + if (obj == null) {
>> + return false;
>> + }
>> + if (!(obj instanceof Server)) {
>> + return false;
>> + } else {
>> + Server s = (Server)obj;
>> + return s.id == id && ((s.name != null &&
>> s.name.equals(name)) || (s.name == null && s.name == name));
>> + }
>> + }
>> +
>> + @Override
>> + public int hashCode() {
>> + final int prime = 31;
>> + int result = 1;
>> + result = prime * result + (int)id + (name == null ? 0 :
>> name.hashCode());
>> + return result;
>> + }
>> +
>> + @Override
>> public String toString() {
>> return "Server [id=" + id + ", name=" + name + ",
>> address=" + address
>> + ", port=" + port + ", user=" + user +
>> ", pass=" + pass
>>
>> Modified:
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
>> URL:
>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>
>> ==============================================================================
>> ---
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
>> (original)
>> +++
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/persistence/beans/room/Room.java
>> Wed Feb 27 05:28:29 2013
>> @@ -72,7 +72,8 @@ import org.simpleframework.xml.Root;
>> @NamedQuery(name = "getRoomById", query = "SELECT r FROM Room r
>> WHERE r.deleted = false AND r.rooms_id = :id"),
>> @NamedQuery(name = "getSipRoomIdsByIds", query = "SELECT
>> r.rooms_id FROM Room r WHERE r.deleted = false AND r.sipEnabled = true AND
>> r.rooms_id IN :ids"),
>> @NamedQuery(name = "countRooms", query = "SELECT COUNT(r) FROM
>> Room r WHERE r.deleted = false"),
>> - @NamedQuery(name = "getBackupRooms", query = "SELECT r FROM Room
>> r LEFT JOIN FETCH r.moderators WHERE r.deleted = false ")
>> + @NamedQuery(name = "getBackupRooms", query = "SELECT r FROM Room
>> r LEFT JOIN FETCH r.moderators WHERE r.deleted = false "),
>> + @NamedQuery(name = "getRoomsCapacityByIds", query = "SELECT
>> SUM(r.numberOfPartizipants) FROM Room r WHERE r.deleted = false AND
>> r.rooms_id IN :ids")
>> })
>> @Table(name = "room")
>> @Root(name = "room")
>>
>> Modified:
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
>> URL:
>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>
>> ==============================================================================
>> ---
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
>> (original)
>> +++
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/remote/ConferenceService.java
>> Wed Feb 27 05:28:29 2013
>> @@ -19,16 +19,12 @@
>> 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;
>> @@ -775,98 +771,29 @@ public class ConferenceService {
>> if (authLevelUtil.checkUserLevel(user_level)) {
>> List<Server> serverList =
>> serverDao.getActiveServers();
>>
>> - // if there is no cluster set up, just redirect
>> to the current one
>> - 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 two 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
>> -
>> + long minimum = -1;
>> + Server result = null;
>> + HashMap<Server, List<Long>> activeRoomsMap = new
>> HashMap<Server, List<Long>>();
>> for (Server server : serverList) {
>> - for (Long activeRoomId :
>> sessionManager.getActiveRoomIdsByServer(server)) {
>> - if (activeRoomId.equals(roomId)) {
>> - return new
>> ServerDTO(server);
>> - }
>> + List<Long> roomIds =
>> sessionManager.getActiveRoomIdsByServer(server);
>> + if (roomIds.contains(roomId)) {
>> + // if the room is already opened
>> on a server, redirect the user to that one,
>> + log.debug("Room is already opened
>> on a server " + server.getAddress());
>> + return new ServerDTO(server);
>> }
>> + activeRoomsMap.put(server, roomIds);
>> }
>> -
>> - // 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<Room>> serverRoomMap = new
>> HashMap<Server, List<Room>>();
>> - // Slave/Server rooms
>> - for (Server server : serverList) {
>> - List<Room> roomList = new
>> ArrayList<Room>();
>> - for (Long activeRoomId :
>> sessionManager.getActiveRoomIdsByServer(server)) {
>> - // FIXME / TODO: This is the
>> single query to get the room by its id
>> -
>> roomList.add(roomDao.get(activeRoomId));
>> + for (Server server : activeRoomsMap.keySet()) {
>> + List<Long> roomIds =
>> activeRoomsMap.get(server);
>> + Long capacity =
>> roomDao.getRoomsCapacityByIds(roomIds);
>> + if (minimum < 0 || capacity < minimum) {
>> + minimum = capacity;
>> + result = server;
>> }
>> - 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;
>> - log.debug("serverRoomMap.get(s1)
>> SIZE " + serverRoomMap.get(s1).size());
>> - for (Room room :
>> serverRoomMap.get(s1)) {
>> - log.debug("s1 room: " +
>> room);
>> - maxUsersInRoomS1 +=
>> room.getNumberOfPartizipants();
>> - }
>> - int maxUsersInRoomS2 = 0;
>> - log.debug("serverRoomMap.get(s2)
>> SIZE " + serverRoomMap.get(s2).size());
>> - for (Room room :
>> serverRoomMap.get(s2)) {
>> - log.debug("s2 room: " +
>> room);
>> - maxUsersInRoomS2 +=
>> room.getNumberOfPartizipants();
>> - }
>> -
>> - return maxUsersInRoomS1 -
>> maxUsersInRoomS2;
>> - }
>> - });
>> -
>> - LinkedHashMap<Server, List<Room>>
>> serverRoomMapOrdered = new LinkedHashMap<Server, List<Room>>();
>> - for (Server server : list) {
>> - serverRoomMapOrdered.put(server,
>> serverRoomMap.get(server));
>> + log.debug("Checking server: " + server +
>> " Number of rooms " + roomIds.size() + " RoomIds: "
>> + + roomIds + " max(Sum): "
>> + capacity);
>> }
>> -
>> - if (log.isDebugEnabled()) {
>> - log.debug("Resulting order: ");
>> - for (Entry<Server, List<Room>> entry :
>> serverRoomMapOrdered.entrySet()) {
>> - int maxUsersInRoom = 0;
>> - for (Room room :
>> entry.getValue()) {
>> - maxUsersInRoom +=
>> room.getNumberOfPartizipants();
>> - }
>> -
>> - String roomids = "";
>> - for (Room r : entry.getValue()) {
>> - roomids += " " +
>> r.getRooms_id();
>> - }
>> -
>> - log.debug("entry " +
>> entry.getKey() + " Number of rooms " + entry.getValue().size() + " RoomIds:
>> "
>> - + roomids + "
>> max(Sum): " + maxUsersInRoom);
>> - }
>> -
>> - }
>> -
>> - log.debug("Resulting Server");
>> -
>> - Server s =
>> serverRoomMapOrdered.entrySet().iterator().next().getKey();
>> -
>> - if (s == null) {
>> - return null;
>> - }
>> -
>> - // Somehow this object here cannot be serialized
>> cause its abused by OpenJPA
>> - // so get a fresh copy from the entity manager
>> and return that
>> - return new ServerDTO(s);
>> + return result == null ? null : new
>> ServerDTO(result);
>> }
>>
>> log.error("Could not get server for cluster session");
>>
>> Modified:
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
>> URL:
>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>
>> ==============================================================================
>> ---
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
>> (original)
>> +++
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/SessionManager.java
>> Wed Feb 27 05:28:29 2013
>> @@ -432,10 +432,7 @@ public class SessionManager implements I
>> }
>>
>> public List<Long> getActiveRoomIdsByServer(Server server) {
>> - if (server == null) {
>> - server = serverUtil.getCurrentServer();
>> - }
>> - return sessionManager.getActiveRoomIdsByServer(server);
>> + return sessionManager.getActiveRoomIdsByServer(server ==
>> null ? serverUtil.getCurrentServer() : server);
>> }
>>
>> public String getSessionStatistics() {
>>
>> Modified:
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
>> URL:
>> http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java?rev=1450608&r1=1450607&r2=1450608&view=diff
>>
>> ==============================================================================
>> ---
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
>> (original)
>> +++
>> openmeetings/trunk/singlewebapp/src/org/apache/openmeetings/session/store/HashMapStore.java
>> Wed Feb 27 05:28:29 2013
>> @@ -29,8 +29,10 @@ import java.util.Map;
>> import org.apache.openmeetings.OpenmeetingsVariables;
>> import org.apache.openmeetings.persistence.beans.basic.Server;
>> import org.apache.openmeetings.persistence.beans.room.Client;
>> +import org.apache.openmeetings.session.ServerUtil;
>> import org.red5.logging.Red5LoggerFactory;
>> import org.slf4j.Logger;
>> +import org.springframework.beans.factory.annotation.Autowired;
>>
>> /**
>> * Stores the session in the memory.
>> @@ -48,9 +50,10 @@ import org.slf4j.Logger;
>> *
>> */
>> public class HashMapStore implements IClientPersistenceStore {
>> -
>> protected static final Logger log = Red5LoggerFactory.getLogger(
>> HashMapStore.class,
>> OpenmeetingsVariables.webAppRootKey);
>> + @Autowired
>> + private ServerUtil serverUtil;
>>
>>
>> private LinkedHashMap<String, Client> clientsByStreamId = new
>> LinkedHashMap<String, Client>();
>> @@ -179,7 +182,7 @@ public class HashMapStore implements ICl
>> HashSet<Long> rooms = new HashSet<Long>();
>> for (Client cl : clientsByStreamId.values()) {
>> Long roomId = cl.getRoom_id();
>> - Server s = cl.getServer();
>> + Server s = cl.getServer() == null ?
>> serverUtil.getCurrentServer() : cl.getServer();
>> if ((server == null && s != null) || (server !=
>> null && s == null)) {
>> continue;
>> }
>>
>>
>>
>
>
> --
> Sebastian Wagner
> https://twitter.com/#!/dead_lock
> http://www.webbase-design.de
> http://www.wagner-sebastian.com
> seba.wagner@gmail.com
>
--
WBR
Maxim aka solomax