From 2f66a82cbeb5ae8eb7c66a13f8a1c2a75c788e69 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 21 Nov 2020 00:15:21 +0000 Subject: [PATCH] mantis 8802 and 6744: change how griduserservice handles duplicated entries, trying to use the most recent. Add cache to compensate the very low performance of the search the db engine is force to do. WARNING this is not compatible with current Diva Wifi. that will replace this code or not run at all --- .../UserAccountService/GridUserService.cs | 92 +++++++++++++------ 1 file changed, 64 insertions(+), 28 deletions(-) diff --git a/OpenSim/Services/UserAccountService/GridUserService.cs b/OpenSim/Services/UserAccountService/GridUserService.cs index d1e92abb5c..a0f9281b04 100755 --- a/OpenSim/Services/UserAccountService/GridUserService.cs +++ b/OpenSim/Services/UserAccountService/GridUserService.cs @@ -126,38 +126,54 @@ namespace OpenSim.Services.UserAccountService MainConsole.Instance.Output("Users online: {0}", onlineRecentlyCount); } + private static ExpiringCacheOS cache = new ExpiringCacheOS(00000); private GridUserData GetGridUserData(string userID) { - GridUserData d = null; - if (userID.Length > 36) // it's a UUI - { - d = m_Database.Get(userID); - } - else // it's a UUID - { - GridUserData[] ds = m_Database.GetAll(userID); - if (ds == null) - return null; + if (userID.Length > 36) + userID = userID.Substring(0, 36); - if (ds.Length > 0) + if (cache.TryGetValue(userID, out GridUserData d)) + return d; + + GridUserData[] ds = m_Database.GetAll(userID); + if (ds == null || ds.Length == 0) + { + cache.Add(userID, null, 300000); + return null; + } + + d = ds[0]; + if (ds.Length > 1) + { + // try find most recent record + try { - d = ds[0]; - foreach (GridUserData dd in ds) - if (dd.UserID.Length > d.UserID.Length) // find the longest - d = dd; - } - } + int tsta = int.Parse(d.Data["Login"]); + int tstb = int.Parse(d.Data["Logout"]); + int cur = tstb > tsta? tstb : tsta; + for (int i = 1; i < ds.Length; ++i) + { + GridUserData dd = ds[i]; + tsta = int.Parse(dd.Data["Login"]); + tstb = int.Parse(dd.Data["Logout"]); + if(tsta > tstb) + tstb = tsta; + if (tstb > cur) + { + cur = tstb; + d = dd; + } + } + } + catch { } + } + cache.Add(userID, d, 300000); return d; } - public virtual GridUserInfo GetGridUserInfo(string userID) + private GridUserInfo ToInfo(GridUserData d) { - GridUserData d = GetGridUserData(userID); - - if (d == null) - return null; - GridUserInfo info = new GridUserInfo(); info.UserID = d.UserID; info.HomeRegionID = new UUID(d.Data["HomeRegionID"]); @@ -171,10 +187,19 @@ namespace OpenSim.Services.UserAccountService info.Online = bool.Parse(d.Data["Online"]); info.Login = Util.ToDateTime(Convert.ToInt32(d.Data["Login"])); info.Logout = Util.ToDateTime(Convert.ToInt32(d.Data["Logout"])); - return info; } + public virtual GridUserInfo GetGridUserInfo(string userID) + { + GridUserData d = GetGridUserData(userID); + + if (d == null) + return null; + + return ToInfo(d); + } + public virtual GridUserInfo[] GetGridUserInfo(string[] userIDs) { List ret = new List(); @@ -201,8 +226,10 @@ namespace OpenSim.Services.UserAccountService d.Data["Login"] = Util.UnixTimeSinceEpoch().ToString(); m_Database.Store(d); + if (userID.Length >= 36) + cache.Add(userID.Substring(0, 36), d, 300000); - return GetGridUserInfo(userID); + return ToInfo(d); } public bool LoggedOut(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) @@ -223,7 +250,10 @@ namespace OpenSim.Services.UserAccountService d.Data["LastPosition"] = lastPosition.ToString(); d.Data["LastLookAt"] = lastLookAt.ToString(); - return m_Database.Store(d); + bool ret = m_Database.Store(d); + if (ret && userID.Length >= 36) + cache.Add(userID.Substring(0, 36), d, 300000); + return ret; } public bool SetHome(string userID, UUID homeID, Vector3 homePosition, Vector3 homeLookAt) @@ -240,7 +270,10 @@ namespace OpenSim.Services.UserAccountService d.Data["HomePosition"] = homePosition.ToString(); d.Data["HomeLookAt"] = homeLookAt.ToString(); - return m_Database.Store(d); + bool ret = m_Database.Store(d); + if (ret && userID.Length >= 36) + cache.Add(userID.Substring(0, 36), d, 300000); + return ret; } public bool SetLastPosition(string userID, UUID sessionID, UUID regionID, Vector3 lastPosition, Vector3 lastLookAt) @@ -259,7 +292,10 @@ namespace OpenSim.Services.UserAccountService d.Data["LastPosition"] = lastPosition.ToString(); d.Data["LastLookAt"] = lastLookAt.ToString(); - return m_Database.Store(d); + bool ret = m_Database.Store(d); + if (ret && userID.Length >= 36) + cache.Add(userID.Substring(0, 36), d, 300000); + return ret; } } } \ No newline at end of file