add configuration option MaxOfflineIMs to robust offlineIMService with default value of 25. Simplify that service code a bit (do runprebuild since a file was removed)

This commit is contained in:
UbitUmarov 2024-01-23 13:30:35 +00:00
parent df9c35c726
commit 7b888ec02c
5 changed files with 59 additions and 111 deletions

View File

@ -28,10 +28,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text;
using System.Timers;
using System.Xml;
using System.Xml.Serialization;
using log4net;
@ -40,21 +37,59 @@ using Nini.Config;
using OpenMetaverse;
using OpenSim.Data;
using OpenSim.Framework;
using OpenSim.Services.Base;
using OpenSim.Services.Interfaces;
namespace OpenSim.OfflineIM
{
public class OfflineIMService : OfflineIMServiceBase, IOfflineIMService
public class OfflineIMService : ServiceBase, IOfflineIMService
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private const int MAX_IM = 25;
//private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private IOfflineIMData m_Database = null;
private int m_MaxOfflineIMs = 25;
private XmlSerializer m_serializer;
private static bool m_Initialized = false;
public OfflineIMService(IConfigSource config)
: base(config)
public OfflineIMService(IConfigSource config) : base(config)
{
string dllName = string.Empty;
string connString = string.Empty;
string realm = "im_offline";
//
// Try reading the [DatabaseService] section, if it exists
//
IConfig dbConfig = config.Configs["DatabaseService"];
if (dbConfig is not null)
{
if (dllName.Length == 0)
dllName = dbConfig.GetString("StorageProvider", string.Empty);
if (connString.Length == 0)
connString = dbConfig.GetString("ConnectionString", string.Empty);
}
//
// [Messaging] section overrides [DatabaseService], if it exists
//
IConfig imConfig = config.Configs["Messaging"];
if (imConfig is not null)
{
dllName = imConfig.GetString("StorageProvider", dllName);
connString = imConfig.GetString("ConnectionString", connString);
realm = imConfig.GetString("Realm", realm);
m_MaxOfflineIMs = imConfig.GetInt("MaxOfflineIMs", m_MaxOfflineIMs);
}
//
// We tried, but this doesn't exist. We can't proceed.
//
if (string.IsNullOrEmpty(dllName))
throw new Exception("No StorageProvider configured");
m_Database = LoadPlugin<IOfflineIMData>(dllName, new Object[] { connString, realm });
if (m_Database is null)
throw new Exception("Could not find a storage interface in the given module " + dllName);
m_serializer = new XmlSerializer(typeof(GridInstantMessage));
if (!m_Initialized)
{
@ -68,8 +103,7 @@ namespace OpenSim.OfflineIM
List<GridInstantMessage> ims = new List<GridInstantMessage>();
OfflineIMData[] messages = m_Database.Get("PrincipalID", principalID.ToString());
if (messages == null || (messages != null && messages.Length == 0))
if (messages is null || messages.Length == 0)
return ims;
foreach (OfflineIMData m in messages)
@ -94,7 +128,7 @@ namespace OpenSim.OfflineIM
// Check limits
UUID principalID = new UUID(im.toAgentID);
long count = m_Database.GetCount("PrincipalID", principalID.ToString());
if (count >= MAX_IM)
if (count >= m_MaxOfflineIMs)
{
reason = "Number of offline IMs has maxed out";
return false;

View File

@ -1,83 +0,0 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Reflection;
using Nini.Config;
using OpenSim.Framework;
using OpenSim.Data;
using OpenSim.Services.Interfaces;
using OpenSim.Services.Base;
namespace OpenSim.OfflineIM
{
public class OfflineIMServiceBase : ServiceBase
{
protected IOfflineIMData m_Database = null;
public OfflineIMServiceBase(IConfigSource config)
: base(config)
{
string dllName = String.Empty;
string connString = String.Empty;
string realm = "im_offline";
//
// Try reading the [DatabaseService] section, if it exists
//
IConfig dbConfig = config.Configs["DatabaseService"];
if (dbConfig != null)
{
if (dllName.Length == 0)
dllName = dbConfig.GetString("StorageProvider", String.Empty);
if (connString.Length == 0)
connString = dbConfig.GetString("ConnectionString", String.Empty);
}
//
// [Messaging] section overrides [DatabaseService], if it exists
//
IConfig imConfig = config.Configs["Messaging"];
if (imConfig != null)
{
dllName = imConfig.GetString("StorageProvider", dllName);
connString = imConfig.GetString("ConnectionString", connString);
realm = imConfig.GetString("Realm", realm);
}
//
// We tried, but this doesn't exist. We can't proceed.
//
if (string.IsNullOrEmpty(dllName))
throw new Exception("No StorageProvider configured");
m_Database = LoadPlugin<IOfflineIMData>(dllName, new Object[] { connString, realm });
if (m_Database == null)
throw new Exception("Could not find a storage interface in the given module " + dllName);
}
}
}

View File

@ -31,7 +31,6 @@ using System.Collections.Generic;
using System.Reflection;
using log4net;
using Nini.Config;
using OpenSim.Services.Interfaces;
namespace OpenSim.Services.Base
{
@ -73,27 +72,22 @@ namespace OpenSim.Services.Base
{
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
// m_log.DebugFormat("[SERVICE BASE]: Found assembly {0}", dllName);
//m_log.DebugFormat("[SERVICE BASE]: Found assembly {0}", dllName);
foreach (Type pluginType in pluginAssembly.GetTypes())
{
// m_log.DebugFormat("[SERVICE BASE]: Found type {0}", pluginType);
//m_log.DebugFormat("[SERVICE BASE]: Found type {0}", pluginType);
if (pluginType.IsPublic)
{
if (className != String.Empty &&
pluginType.ToString() !=
pluginType.Namespace + "." + className)
if (!string.IsNullOrEmpty(className) &&
pluginType.ToString() != pluginType.Namespace + "." + className)
continue;
Type typeInterface =
pluginType.GetInterface(interfaceName);
if (typeInterface != null)
Type typeInterface = pluginType.GetInterface(interfaceName);
if (typeInterface is not null)
{
T plug = (T)Activator.CreateInstance(pluginType,
args);
return plug;
return (T)Activator.CreateInstance(pluginType, args);
}
}
}
@ -106,10 +100,9 @@ namespace OpenSim.Services.Base
foreach (Object arg in args)
strArgs.Add(arg.ToString());
m_log.Error(
string.Format(
m_log.ErrorFormat(
"[SERVICE BASE]: Failed to load plugin {0} from {1} with args {2}",
interfaceName, dllName, string.Join(", ", strArgs.ToArray())), e);
interfaceName, dllName, string.Join(", ", strArgs.ToArray()), e);
return null;
}

View File

@ -821,6 +821,8 @@
[Messaging]
; OfflineIM
OfflineIMService = "OpenSim.Addons.OfflineIM.dll:OfflineIMService"
; maximum number of offline ims per user, default 25
;MaxOfflineIMs = 25;
[Groups]

View File

@ -579,6 +579,8 @@
[Messaging]
; OfflineIM
OfflineIMService = "OpenSim.Addons.OfflineIM.dll:OfflineIMService"
; maximum number of offline ims per user, default 25
;MaxOfflineIMs = 25;
[Groups]