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