From e77f91311678154390d09b586fbd8162cd3bb601 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 16 Nov 2016 22:34:56 +0000 Subject: minor: dont let rcvd agentupdates time jump back --- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 7 +++- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 38 +++++++++++++++------- 2 files changed, 33 insertions(+), 12 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 46c6a19..8d07bae 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -6251,9 +6251,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP return false; } + uint seq = packet.Header.Sequence; + TotalAgentUpdates++; // dont let ignored updates pollute this throttles - if(SceneAgent == null || SceneAgent.IsChildAgent || SceneAgent.IsInTransit) + if(SceneAgent == null || SceneAgent.IsChildAgent || + SceneAgent.IsInTransit || seq <= m_thisAgentUpdateArgs.lastpacketSequence ) { // throttle reset is done at MoveAgentIntoRegion() // called by scenepresence on completemovement @@ -6261,6 +6264,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP return true; } + m_thisAgentUpdateArgs.lastpacketSequence = seq; + bool movement = CheckAgentMovementUpdateSignificance(x); bool camera = CheckAgentCameraUpdateSignificance(x); diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3378ead..f73d54e 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2318,7 +2318,7 @@ namespace OpenSim.Region.Framework.Scenes Vector3 tocam = CameraPosition - posAdjusted; float distTocamlen = tocam.LengthSquared(); - if (distTocamlen > 0.08f && distTocamlen < 400) + if (distTocamlen > 0.01f && distTocamlen < 400) { distTocamlen = (float)Math.Sqrt(distTocamlen); tocam *= (1.0f / distTocamlen); @@ -4378,16 +4378,12 @@ namespace OpenSim.Region.Framework.Scenes m_log.DebugFormat( "[SCENE PRESENCE]: Closing child agents. Checking {0} regions in {1}", knownRegions.Count, Scene.RegionInfo.RegionName); - //DumpKnownRegions(); Util.RegionHandleToRegionLoc(newRegionHandle, out newRegionX, out newRegionY); uint x, y; spRegionSizeInfo regInfo; - // this should not be here - IEventQueue eventQueue = Scene.RequestModuleInterface(); - foreach (ulong handle in knownRegions) { // Don't close the agent on this region yet @@ -4400,16 +4396,10 @@ namespace OpenSim.Region.Framework.Scenes Util.RegionHandleToRegionLoc(handle, out x, out y); if (m_knownChildRegionsSizeInfo.TryGetValue(handle, out regInfo)) { - - // m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX))); - // m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY))); if (Util.IsOutsideView(RegionViewDistance, x, newRegionX, y, newRegionY, regInfo.sizeX, regInfo.sizeY, newRegionSizeX, newRegionSizeY)) { byebyeRegions.Add(handle); - // this should not be here -// if(eventQueue != null) -/// eventQueue.DisableSimulator(handle,UUID); } } else @@ -4445,6 +4435,32 @@ namespace OpenSim.Region.Framework.Scenes } } + public void closeAllChildAgents() + { + List byebyeRegions = new List(); + List knownRegions = KnownRegionHandles; + foreach (ulong handle in knownRegions) + { + if (handle != Scene.RegionInfo.RegionHandle) + { + byebyeRegions.Add(handle); + RemoveNeighbourRegion(handle); + Scene.CapsModule.DropChildSeed(UUID, handle); + } + } + + if (byebyeRegions.Count > 0) + { + m_log.Debug("[SCENE PRESENCE]: Closing " + byebyeRegions.Count + " child agents"); + + AgentCircuitData acd = Scene.AuthenticateHandler.GetAgentCircuitData(UUID); + string auth = string.Empty; + if (acd != null) + auth = acd.SessionID.ToString(); + m_scene.SceneGridService.SendCloseChildAgentConnections(ControllingClient.AgentId, auth, byebyeRegions); + } + } + #endregion /// -- cgit v1.1 From 3d78388e55b056b92d97471ee79cfda87f710950 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 17 Nov 2016 01:44:47 +0000 Subject: restore large useracconts expire time for testing --- .../ServiceConnectorsOut/UserAccounts/UserAccountCache.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs index 6c1cc52..6d2efc6 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs @@ -36,8 +36,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts { public class UserAccountCache : IUserAccountCacheModule { - private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour! - private const double CACHE_NULL_EXPIRATION_SECONDS = 600; // 10minutes +// private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour! +// private const double CACHE_NULL_EXPIRATION_SECONDS = 600; // 10minutes + private const double CACHE_EXPIRATION_SECONDS = 120000.0; + private const double CACHE_NULL_EXPIRATION_SECONDS = 120000.0; // private static readonly ILog m_log = // LogManager.GetLogger( -- cgit v1.1 From 2db22bf064f14afcbfecacfb8006da5c44a6040c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 17 Nov 2016 13:57:45 +0000 Subject: minor changes to ubMeshmerizer memory use --- OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs | 131 ++++++++++----------- .../PhysicsModules/ubOdeMeshing/Meshmerizer.cs | 4 +- 2 files changed, 67 insertions(+), 68 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs index d9ea4a4..0cdaa60 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Mesh.cs @@ -39,6 +39,24 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing { public class MeshBuildingData { + private class vertexcomp : IEqualityComparer + { + public bool Equals(Vertex v1, Vertex v2) + { + if (v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z) + return true; + else + return false; + } + public int GetHashCode(Vertex v) + { + int a = v.X.GetHashCode(); + int b = v.Y.GetHashCode(); + int c = v.Z.GetHashCode(); + return (a << 16) ^ (b << 8) ^ c; + } + } + public Dictionary m_vertices; public List m_triangles; public float m_obbXmin; @@ -49,6 +67,21 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing public float m_obbZmax; public Vector3 m_centroid; public int m_centroidDiv; + + public MeshBuildingData() + { + vertexcomp vcomp = new vertexcomp(); + m_vertices = new Dictionary(vcomp); + m_triangles = new List(); + m_centroid = Vector3.Zero; + m_centroidDiv = 0; + m_obbXmin = float.MaxValue; + m_obbXmax = float.MinValue; + m_obbYmin = float.MaxValue; + m_obbYmax = float.MinValue; + m_obbZmin = float.MaxValue; + m_obbZmax = float.MinValue; + } } [Serializable()] @@ -76,50 +109,20 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing public int RefCount { get; set; } public AMeshKey Key { get; set; } - private class vertexcomp : IEqualityComparer + public Mesh(bool forbuild) { - public bool Equals(Vertex v1, Vertex v2) - { - if (v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z) - return true; - else - return false; - } - public int GetHashCode(Vertex v) - { - int a = v.X.GetHashCode(); - int b = v.Y.GetHashCode(); - int c = v.Z.GetHashCode(); - return (a << 16) ^ (b << 8) ^ c; - } - } - - public Mesh() - { - vertexcomp vcomp = new vertexcomp(); - - m_bdata = new MeshBuildingData(); - m_bdata.m_vertices = new Dictionary(vcomp); - m_bdata.m_triangles = new List(); - m_bdata.m_centroid = Vector3.Zero; - m_bdata.m_centroidDiv = 0; - m_bdata.m_obbXmin = float.MaxValue; - m_bdata.m_obbXmax = float.MinValue; - m_bdata.m_obbYmin = float.MaxValue; - m_bdata.m_obbYmax = float.MinValue; - m_bdata.m_obbZmin = float.MaxValue; - m_bdata.m_obbZmax = float.MinValue; + if(forbuild) + m_bdata = new MeshBuildingData(); m_obb = new Vector3(0.5f, 0.5f, 0.5f); m_obboffset = Vector3.Zero; } - public Mesh Scale(Vector3 scale) { if (m_verticesPtr == null || m_indicesPtr == null) return null; - Mesh result = new Mesh(); + Mesh result = new Mesh(false); float x = scale.X; float y = scale.Y; @@ -167,7 +170,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing public Mesh Clone() { - Mesh result = new Mesh(); + Mesh result = new Mesh(false); if (m_bdata != null) { @@ -514,8 +517,6 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing if (m_indicesPtr == IntPtr.Zero) indexes = getIndexListAsInt(); - pinMemory(); - float x, y, z; if (m_bdata.m_centroidDiv > 0) @@ -543,55 +544,53 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing m_obb = new Vector3(x, y, z); releaseBuildingMeshData(); + pinMemory(); } + public bool ToStream(Stream st) { if (m_indicesPtr == IntPtr.Zero || m_verticesPtr == IntPtr.Zero) return false; - BinaryWriter bw = new BinaryWriter(st); bool ok = true; try { - - bw.Write(m_vertexCount); - bw.Write(m_indexCount); - - for (int i = 0; i < 3 * m_vertexCount; i++) - bw.Write(vertices[i]); - for (int i = 0; i < m_indexCount; i++) - bw.Write(indexes[i]); - bw.Write(m_obb.X); - bw.Write(m_obb.Y); - bw.Write(m_obb.Z); - bw.Write(m_obboffset.X); - bw.Write(m_obboffset.Y); - bw.Write(m_obboffset.Z); + using(BinaryWriter bw = new BinaryWriter(st)) + { + bw.Write(m_vertexCount); + bw.Write(m_indexCount); + + for (int i = 0; i < 3 * m_vertexCount; i++) + bw.Write(vertices[i]); + for (int i = 0; i < m_indexCount; i++) + bw.Write(indexes[i]); + bw.Write(m_obb.X); + bw.Write(m_obb.Y); + bw.Write(m_obb.Z); + bw.Write(m_obboffset.X); + bw.Write(m_obboffset.Y); + bw.Write(m_obboffset.Z); + bw.Flush(); + bw.Close(); + } } catch { ok = false; } - if (bw != null) - { - bw.Flush(); - bw.Close(); - } - return ok; } public static Mesh FromStream(Stream st, AMeshKey key) { - Mesh mesh = new Mesh(); - mesh.releaseBuildingMeshData(); + Mesh mesh = new Mesh(false); bool ok = true; - using(BinaryReader br = new BinaryReader(st)) + try { - try + using(BinaryReader br = new BinaryReader(st)) { mesh.m_vertexCount = br.ReadInt32(); mesh.m_indexCount = br.ReadInt32(); @@ -613,10 +612,10 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing mesh.m_obboffset.Y = br.ReadSingle(); mesh.m_obboffset.Z = br.ReadSingle(); } - catch - { - ok = false; - } + } + catch + { + ok = false; } if (ok) diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs index ca94034..98c2e71 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs @@ -182,7 +182,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing /// private static Mesh CreateSimpleBoxMesh(float minX, float maxX, float minY, float maxY, float minZ, float maxZ) { - Mesh box = new Mesh(); + Mesh box = new Mesh(true); List vertices = new List(); // bottom @@ -357,7 +357,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing int numCoords = coords.Count; int numFaces = faces.Count; - Mesh mesh = new Mesh(); + Mesh mesh = new Mesh(true); // Add the corresponding triangles to the mesh for (int i = 0; i < numFaces; i++) { -- cgit v1.1 From 35b37510fca537d12c2eabc68be51e370dc6d6ce Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 17 Nov 2016 19:15:28 +0000 Subject: explicitly remove some references, and other useless changes --- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 160 ++++++++++----------- .../Region/ClientStack/Linden/UDP/LLUDPClient.cs | 22 ++- .../Linden/UDP/UnackedPacketCollection.cs | 9 ++ OpenSim/Region/Framework/Scenes/ScenePresence.cs | 24 +++- 4 files changed, 124 insertions(+), 91 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 8d07bae..3793712 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -347,12 +347,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP private const uint MaxTransferBytesPerPacket = 600; /// - /// List used in construction of data blocks for an object update packet. This is to stop us having to - /// continually recreate it. - /// - protected List m_fullUpdateDataBlocksBuilder; - - /// /// Maintain a record of all the objects killed. This allows us to stop an update being sent from the /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an /// ownerless phantom. @@ -511,7 +505,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_scene = scene; m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); m_entityProps = new PriorityQueue(m_scene.Entities.Count); - m_fullUpdateDataBlocksBuilder = new List(); m_killRecord = new List(); // m_attachmentsSent = new HashSet(); @@ -594,13 +587,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP OutPacket(disable, ThrottleOutPacketType.Unknown); } - // Shutdown the image manager - ImageManager.Close(); // Fire the callback for this connection closing if (OnConnectionClosed != null) OnConnectionClosed(this); + // Flush all of the packets out of the UDP server for this client if (m_udpServer != null) m_udpServer.Flush(m_udpClient); @@ -615,8 +607,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Disable UDP handling for this client m_udpClient.Shutdown(); - - + + m_udpClient.OnQueueEmpty -= HandleQueueEmpty; + m_udpClient.HasUpdates -= HandleHasUpdates; + m_udpClient.OnPacketStats -= PopulateStats; + + // Shutdown the image manager + ImageManager.Close(); + ImageManager = null; + + m_entityUpdates = null; + m_entityProps = null; + m_killRecord.Clear(); + GroupsInView.Clear(); + m_scene = null; //m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false)); //GC.Collect(); //m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true)); @@ -814,7 +818,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public void ProcessSpecificPacketAsync(object state) { AsyncPacketProcess packetObject = (AsyncPacketProcess)state; - + try { packetObject.result = packetObject.Method(packetObject.ClientView, packetObject.Pack); @@ -4095,19 +4099,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP ResendPrimUpdate(update); } + private List objectUpdateBlocks = new List(); + private List compressedUpdateBlocks = new List(); + private List terseUpdateBlocks = new List(); + private List terseAgentUpdateBlocks = new List(); + private void ProcessEntityUpdates(int maxUpdatesBytes) { - OpenSim.Framework.Lazy> objectUpdateBlocks = new OpenSim.Framework.Lazy>(); - OpenSim.Framework.Lazy> compressedUpdateBlocks = new OpenSim.Framework.Lazy>(); - OpenSim.Framework.Lazy> terseUpdateBlocks = new OpenSim.Framework.Lazy>(); - OpenSim.Framework.Lazy> terseAgentUpdateBlocks = new OpenSim.Framework.Lazy>(); - OpenSim.Framework.Lazy> objectUpdates = new OpenSim.Framework.Lazy>(); OpenSim.Framework.Lazy> compressedUpdates = new OpenSim.Framework.Lazy>(); OpenSim.Framework.Lazy> terseUpdates = new OpenSim.Framework.Lazy>(); OpenSim.Framework.Lazy> terseAgentUpdates = new OpenSim.Framework.Lazy>(); - // Check to see if this is a flush if (maxUpdatesBytes <= 0) { @@ -4328,7 +4331,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP ablock = CreateAvatarUpdateBlock((ScenePresence)update.Entity); else ablock = CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId); - objectUpdateBlocks.Value.Add(ablock); + objectUpdateBlocks.Add(ablock); objectUpdates.Value.Add(update); maxUpdatesBytes -= ablock.Length; @@ -4337,7 +4340,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP { ObjectUpdateCompressedPacket.ObjectDataBlock ablock = CreateCompressedUpdateBlock((SceneObjectPart)update.Entity, updateFlags); - compressedUpdateBlocks.Value.Add(ablock); + compressedUpdateBlocks.Add(ablock); compressedUpdates.Value.Add(update); maxUpdatesBytes -= ablock.Length; } @@ -4348,14 +4351,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP { // ALL presence updates go into a special list ablock = CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)); - terseAgentUpdateBlocks.Value.Add(ablock); + terseAgentUpdateBlocks.Add(ablock); terseAgentUpdates.Value.Add(update); } else { // Everything else goes here ablock = CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)); - terseUpdateBlocks.Value.Add(ablock); + terseUpdateBlocks.Add(ablock); terseUpdates.Value.Add(update); } maxUpdatesBytes -= ablock.Length; @@ -4366,74 +4369,69 @@ namespace OpenSim.Region.ClientStack.LindenUDP #region Packet Sending -// const float TIME_DILATION = 1.0f; ushort timeDilation; -// if(updatesThisCall > 0) -// timeDilation = Utils.FloatToUInt16(avgTimeDilation/updatesThisCall, 0.0f, 1.0f); -// else -// timeDilation = ushort.MaxValue; // 1.0; timeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); - if (terseAgentUpdateBlocks.IsValueCreated) + if (terseAgentUpdateBlocks.Count > 0) { - List blocks = terseAgentUpdateBlocks.Value; - ImprovedTerseObjectUpdatePacket packet = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate); packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; packet.RegionData.TimeDilation = timeDilation; - packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count]; + packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[terseAgentUpdateBlocks.Count]; + + for (int i = 0; i < terseAgentUpdateBlocks.Count; i++) + packet.ObjectData[i] = terseAgentUpdateBlocks[i]; - for (int i = 0; i < blocks.Count; i++) - packet.ObjectData[i] = blocks[i]; + terseAgentUpdateBlocks.Clear(); OutPacket(packet, ThrottleOutPacketType.Unknown, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseAgentUpdates.Value, oPacket); }); } - if (objectUpdateBlocks.IsValueCreated) + if (objectUpdateBlocks.Count > 0) { - List blocks = objectUpdateBlocks.Value; - ObjectUpdatePacket packet = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate); packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; packet.RegionData.TimeDilation = timeDilation; - packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[blocks.Count]; + packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[objectUpdateBlocks.Count]; - for (int i = 0; i < blocks.Count; i++) - packet.ObjectData[i] = blocks[i]; + for (int i = 0; i < objectUpdateBlocks.Count; i++) + packet.ObjectData[i] = objectUpdateBlocks[i]; + + objectUpdateBlocks.Clear(); OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(objectUpdates.Value, oPacket); }); } - if (compressedUpdateBlocks.IsValueCreated) + if (compressedUpdateBlocks.Count > 0) { - List blocks = compressedUpdateBlocks.Value; - ObjectUpdateCompressedPacket packet = (ObjectUpdateCompressedPacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdateCompressed); packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; packet.RegionData.TimeDilation = timeDilation; - packet.ObjectData = new ObjectUpdateCompressedPacket.ObjectDataBlock[blocks.Count]; + packet.ObjectData = new ObjectUpdateCompressedPacket.ObjectDataBlock[compressedUpdateBlocks.Count]; + + for (int i = 0; i < compressedUpdateBlocks.Count; i++) + packet.ObjectData[i] = compressedUpdateBlocks[i]; - for (int i = 0; i < blocks.Count; i++) - packet.ObjectData[i] = blocks[i]; + compressedUpdateBlocks.Clear(); OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(compressedUpdates.Value, oPacket); }); } - if (terseUpdateBlocks.IsValueCreated) + if (terseUpdateBlocks.Count > 0) { - List blocks = terseUpdateBlocks.Value; - ImprovedTerseObjectUpdatePacket packet = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket( PacketType.ImprovedTerseObjectUpdate); packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; packet.RegionData.TimeDilation = timeDilation; - packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[blocks.Count]; + packet.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[terseUpdateBlocks.Count]; - for (int i = 0; i < blocks.Count; i++) - packet.ObjectData[i] = blocks[i]; + for (int i = 0; i < terseUpdateBlocks.Count; i++) + packet.ObjectData[i] = terseUpdateBlocks[i]; + + terseUpdateBlocks.Clear(); OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); } @@ -4828,21 +4826,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_entityProps.Enqueue(priority, new ObjectPropertyUpdate(entity,0,false,true)); } + List objectFamilyBlocks = new + List(); + List objectPropertiesBlocks = + new List(); + List needPhysics = new List(); + private void ProcessEntityPropertyRequests(int maxUpdateBytes) { - OpenSim.Framework.Lazy> objectFamilyBlocks = - new OpenSim.Framework.Lazy>(); - - OpenSim.Framework.Lazy> objectPropertiesBlocks = - new OpenSim.Framework.Lazy>(); +// OpenSim.Framework.Lazy> familyUpdates = +// new OpenSim.Framework.Lazy>(); - OpenSim.Framework.Lazy> familyUpdates = - new OpenSim.Framework.Lazy>(); - - OpenSim.Framework.Lazy> propertyUpdates = - new OpenSim.Framework.Lazy>(); +// OpenSim.Framework.Lazy> propertyUpdates = +// new OpenSim.Framework.Lazy>(); - List needPhysics = new List(); EntityUpdate iupdate; Int32 timeinqueue; // this is just debugging code & can be dropped later @@ -4860,8 +4857,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP { SceneObjectPart sop = (SceneObjectPart)update.Entity; ObjectPropertiesFamilyPacket.ObjectDataBlock objPropDB = CreateObjectPropertiesFamilyBlock(sop,update.Flags); - objectFamilyBlocks.Value.Add(objPropDB); - familyUpdates.Value.Add(update); + objectFamilyBlocks.Add(objPropDB); +// familyUpdates.Value.Add(update); maxUpdateBytes -= objPropDB.Length; } } @@ -4873,23 +4870,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP SceneObjectPart sop = (SceneObjectPart)update.Entity; needPhysics.Add(sop); ObjectPropertiesPacket.ObjectDataBlock objPropDB = CreateObjectPropertiesBlock(sop); - objectPropertiesBlocks.Value.Add(objPropDB); - propertyUpdates.Value.Add(update); + objectPropertiesBlocks.Add(objPropDB); +// propertyUpdates.Value.Add(update); maxUpdateBytes -= objPropDB.Length; } } } - if (objectPropertiesBlocks.IsValueCreated) + if (objectPropertiesBlocks.Count > 0) { - List blocks = objectPropertiesBlocks.Value; - List updates = propertyUpdates.Value; - ObjectPropertiesPacket packet = (ObjectPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ObjectProperties); - packet.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[blocks.Count]; - for (int i = 0; i < blocks.Count; i++) - packet.ObjectData[i] = blocks[i]; + packet.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[objectPropertiesBlocks.Count]; + for (int i = 0; i < objectPropertiesBlocks.Count; i++) + packet.ObjectData[i] = objectPropertiesBlocks[i]; + + objectPropertiesBlocks.Clear(); packet.Header.Zerocoded = true; // Pass in the delegate so that if this packet needs to be resent, we send the current properties @@ -4898,7 +4894,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP //OutPacket(packet, ThrottleOutPacketType.Task, true, // delegate(OutgoingPacket oPacket) // { - // ResendPropertyUpdates(updates, oPacket); + // ResendPropertyUpdates(propertyUpdates.Value, oPacket); // }); OutPacket(packet, ThrottleOutPacketType.Task, true); @@ -4909,23 +4905,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Int32 fpcnt = 0; // Int32 fbcnt = 0; - if (objectFamilyBlocks.IsValueCreated) - { - List blocks = objectFamilyBlocks.Value; - + if (objectFamilyBlocks.Count > 0) + { // one packet per object block... uggh... - for (int i = 0; i < blocks.Count; i++) + for (int i = 0; i < objectFamilyBlocks.Count; i++) { ObjectPropertiesFamilyPacket packet = (ObjectPropertiesFamilyPacket)PacketPool.Instance.GetPacket(PacketType.ObjectPropertiesFamily); - packet.ObjectData = blocks[i]; + packet.ObjectData = objectFamilyBlocks[i]; packet.Header.Zerocoded = true; // Pass in the delegate so that if this packet needs to be resent, we send the current properties // of the object rather than the properties when the packet was created - List updates = new List(); - updates.Add(familyUpdates.Value[i]); +// List updates = new List(); +// updates.Add(familyUpdates.Value[i]); // HACK : Remove intelligent resending until it's fixed in core //OutPacket(packet, ThrottleOutPacketType.Task, true, // delegate(OutgoingPacket oPacket) @@ -4937,6 +4931,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP // fpcnt++; // fbcnt++; } + objectFamilyBlocks.Clear(); } if(needPhysics.Count > 0) @@ -4962,6 +4957,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP eq.Enqueue(BuildEvent("ObjectPhysicsProperties", llsdBody),AgentId); } + needPhysics.Clear(); } // m_log.WarnFormat("[PACKETCOUNTS] queued {0} property packets with {1} blocks",ppcnt,pbcnt); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs index d59b761..e85cee2 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPClient.cs @@ -120,13 +120,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// Circuit code that this client is connected on public readonly uint CircuitCode; /// Sequence numbers of packets we've received (for duplicate checking) - public readonly IncomingPacketHistoryCollection PacketArchive = new IncomingPacketHistoryCollection(200); + public IncomingPacketHistoryCollection PacketArchive = new IncomingPacketHistoryCollection(200); /// Packets we have sent that need to be ACKed by the client - public readonly UnackedPacketCollection NeedAcks = new UnackedPacketCollection(); + public UnackedPacketCollection NeedAcks = new UnackedPacketCollection(); /// ACKs that are queued up, waiting to be sent to the client - public readonly DoubleLocklessQueue PendingAcks = new DoubleLocklessQueue(); + public DoubleLocklessQueue PendingAcks = new DoubleLocklessQueue(); /// Current packet sequence number public int CurrentSequence; @@ -170,7 +170,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private double m_nextOnQueueEmpty = 0; /// Throttle bucket for this agent's connection - private readonly AdaptiveTokenBucket m_throttleClient; + private AdaptiveTokenBucket m_throttleClient; public AdaptiveTokenBucket FlowThrottle { get { return m_throttleClient; } @@ -179,10 +179,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// Throttle buckets for each packet category private readonly TokenBucket[] m_throttleCategories; /// Outgoing queues for throttled packets - private readonly DoubleLocklessQueue[] m_packetOutboxes = new DoubleLocklessQueue[THROTTLE_CATEGORY_COUNT]; + private DoubleLocklessQueue[] m_packetOutboxes = new DoubleLocklessQueue[THROTTLE_CATEGORY_COUNT]; /// A container that can hold one packet for each outbox, used to store /// dequeued packets that are being held for throttling - private readonly OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT]; + private OutgoingPacket[] m_nextPackets = new OutgoingPacket[THROTTLE_CATEGORY_COUNT]; /// A reference to the LLUDPServer that is managing this client private readonly LLUDPServer m_udpServer; @@ -288,14 +288,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP for (int i = 0; i < THROTTLE_CATEGORY_COUNT; i++) { m_packetOutboxes[i].Clear(); + m_throttleCategories[i] = null; m_nextPackets[i] = null; } // pull the throttle out of the scene throttle m_throttleClient.Parent.UnregisterRequest(m_throttleClient); + m_throttleClient = null; OnPacketStats = null; OnQueueEmpty = null; - } + PendingAcks.Clear(); + NeedAcks.Clear(); + NeedAcks = null; + PendingAcks = null; + m_nextPackets = null; + m_packetOutboxes = null; + } /// /// Gets information about this client connection diff --git a/OpenSim/Region/ClientStack/Linden/UDP/UnackedPacketCollection.cs b/OpenSim/Region/ClientStack/Linden/UDP/UnackedPacketCollection.cs index b546a99..c9d5697 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/UnackedPacketCollection.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/UnackedPacketCollection.cs @@ -74,6 +74,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// Holds information about pending removals private LocklessQueue m_pendingRemoves = new LocklessQueue(); + + public void Clear() + { + m_packets.Clear(); + m_pendingAdds = null; + m_pendingAcknowledgements = null; + m_pendingRemoves = null; + } + /// /// Add an unacked packet to the collection /// diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index f73d54e..2cfdd94 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1104,7 +1104,7 @@ namespace OpenSim.Region.Framework.Scenes AdjustKnownSeeds(); - RegisterToEvents(); + RegisterToClientEvents(); SetDirectionVectors(); Appearance = appearance; @@ -1171,7 +1171,7 @@ namespace OpenSim.Region.Framework.Scenes } } - public void RegisterToEvents() + public void RegisterToClientEvents() { ControllingClient.OnCompleteMovementToRegion += CompleteMovement; ControllingClient.OnAgentUpdate += HandleAgentUpdate; @@ -1189,6 +1189,22 @@ namespace OpenSim.Region.Framework.Scenes // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); // ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); } + + public void RemoveClientEvents() + { + ControllingClient.OnCompleteMovementToRegion -= CompleteMovement; + ControllingClient.OnAgentUpdate -= HandleAgentUpdate; + ControllingClient.OnAgentCameraUpdate -= HandleAgentCamerasUpdate; + ControllingClient.OnAgentRequestSit -= HandleAgentRequestSit; + ControllingClient.OnAgentSit -= HandleAgentSit; + ControllingClient.OnSetAlwaysRun -= HandleSetAlwaysRun; + ControllingClient.OnStartAnim -= HandleStartAnim; + ControllingClient.OnStopAnim -= HandleStopAnim; + ControllingClient.OnChangeAnim -= avnHandleChangeAnim; + ControllingClient.OnForceReleaseControls -= HandleForceReleaseControls; + ControllingClient.OnAutoPilotGo -= MoveToTarget; + ControllingClient.OnUpdateThrottles -= RaiseUpdateThrottles; + } private void SetDirectionVectors() { @@ -5016,12 +5032,16 @@ namespace OpenSim.Region.Framework.Scenes RemoveFromPhysicalScene(); m_scene.EventManager.OnRegionHeartbeatEnd -= RegionHeartbeatEnd; + RemoveClientEvents(); // if (Animator != null) // Animator.Close(); Animator = null; + scriptedcontrols.Clear(); + ControllingClient = null; LifecycleState = ScenePresenceState.Removed; + IsDeleted = true; } public void AddAttachment(SceneObjectGroup gobj) -- cgit v1.1 From ba7904a3a80713f726d434fc82e9a80306372e2c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Nov 2016 00:12:09 +0000 Subject: a few more changes on potencial mem issues --- OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs index 98c2e71..2ae0881 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs @@ -1483,6 +1483,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing lock (diskLock) { + Stream stream = null; try { if (!Directory.Exists(dir)) @@ -1490,8 +1491,8 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing Directory.CreateDirectory(dir); } - using(Stream stream = File.Open(filename, FileMode.Create)) - ok = mesh.ToStream(stream); + stream = File.Open(filename, FileMode.Create); + ok = mesh.ToStream(stream); } catch (IOException e) { @@ -1500,6 +1501,11 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing filename, e.Message, e.StackTrace); ok = false; } + finally + { + if(stream != null) + stream.Dispose(); + } if (!ok && File.Exists(filename)) { -- cgit v1.1 From 0a8cf2ff08a958154fd8f9f73ad31b9aba00e8b9 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Nov 2016 02:13:01 +0000 Subject: put back skip of first drip call --- OpenSim/Region/ClientStack/Linden/UDP/TokenBucket.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/TokenBucket.cs b/OpenSim/Region/ClientStack/Linden/UDP/TokenBucket.cs index 7b9661b..d4603f8 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/TokenBucket.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/TokenBucket.cs @@ -193,7 +193,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP Parent = parent; RequestedDripRate = dripRate; RequestedBurst = MaxBurst; - m_lastDrip = Util.GetTimeStampMS() + 50.0; + m_lastDrip = Util.GetTimeStampMS() + 100000.0; // skip first drip } #endregion Constructor -- cgit v1.1 From d8812ba2d1a82bf2e6c945544cb72a6412ef48ae Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Nov 2016 03:00:59 +0000 Subject: revert to lower resolution clock on udpserver for testing --- OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index ffdb639..b491110 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -323,7 +323,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected int m_elapsedMSSinceLastStatReport = 0; /// Environment.TickCount of the last time the outgoing packet handler executed - protected double m_tickLastOutgoingPacketHandler; + protected int m_tickLastOutgoingPacketHandler; /// Keeps track of the number of elapsed milliseconds since the last time the outgoing packet handler looped protected int m_elapsedMSOutgoingPacketHandler; @@ -2073,13 +2073,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_sendPing = false; // Update elapsed time - double thisTick = Util.GetTimeStampMS(); - int deltaMS = (int)(thisTick - m_tickLastOutgoingPacketHandler); + int thisTick = Environment.TickCount & Int32.MaxValue; + if (m_tickLastOutgoingPacketHandler > thisTick) + m_elapsedMSOutgoingPacketHandler += ((Int32.MaxValue - m_tickLastOutgoingPacketHandler) + thisTick); + else + m_elapsedMSOutgoingPacketHandler += (thisTick - m_tickLastOutgoingPacketHandler); + m_tickLastOutgoingPacketHandler = thisTick; // update some 1ms resolution chained timers - - m_elapsedMSOutgoingPacketHandler += deltaMS; // Check for pending outgoing resends every 100ms if (m_elapsedMSOutgoingPacketHandler >= 100) -- cgit v1.1 From e281876ecdb5edff737556c7200b8a902e66d05e Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Nov 2016 03:25:29 +0000 Subject: restore higher resolution clock on udpserver and lower uaeraccouts caching time --- OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 18 +++++++----------- .../UserAccounts/UserAccountCache.cs | 6 ++---- 2 files changed, 9 insertions(+), 15 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index b491110..af33d17 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -323,10 +323,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected int m_elapsedMSSinceLastStatReport = 0; /// Environment.TickCount of the last time the outgoing packet handler executed - protected int m_tickLastOutgoingPacketHandler; + protected double m_tickLastOutgoingPacketHandler; /// Keeps track of the number of elapsed milliseconds since the last time the outgoing packet handler looped - protected int m_elapsedMSOutgoingPacketHandler; + protected double m_elapsedMSOutgoingPacketHandler; /// Keeps track of the number of 100 millisecond periods elapsed in the outgoing packet handler executed protected int m_elapsed100MSOutgoingPacketHandler; @@ -2073,21 +2073,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_sendPing = false; // Update elapsed time - int thisTick = Environment.TickCount & Int32.MaxValue; - if (m_tickLastOutgoingPacketHandler > thisTick) - m_elapsedMSOutgoingPacketHandler += ((Int32.MaxValue - m_tickLastOutgoingPacketHandler) + thisTick); - else - m_elapsedMSOutgoingPacketHandler += (thisTick - m_tickLastOutgoingPacketHandler); - - m_tickLastOutgoingPacketHandler = thisTick; + double thisTick = Util.GetTimeStampMS(); // update some 1ms resolution chained timers + m_elapsedMSOutgoingPacketHandler += thisTick - m_tickLastOutgoingPacketHandler; + m_tickLastOutgoingPacketHandler = thisTick; // Check for pending outgoing resends every 100ms - if (m_elapsedMSOutgoingPacketHandler >= 100) + if (m_elapsedMSOutgoingPacketHandler >= 100.0) { m_resendUnacked = true; - m_elapsedMSOutgoingPacketHandler = 0; + m_elapsedMSOutgoingPacketHandler = 0.0; m_elapsed100MSOutgoingPacketHandler += 1; } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs index 6d2efc6..6c1cc52 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs @@ -36,10 +36,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts { public class UserAccountCache : IUserAccountCacheModule { -// private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour! -// private const double CACHE_NULL_EXPIRATION_SECONDS = 600; // 10minutes - private const double CACHE_EXPIRATION_SECONDS = 120000.0; - private const double CACHE_NULL_EXPIRATION_SECONDS = 120000.0; + private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour! + private const double CACHE_NULL_EXPIRATION_SECONDS = 600; // 10minutes // private static readonly ILog m_log = // LogManager.GetLogger( -- cgit v1.1 From 70eb37433d4cc7512ebe6cac1d7c288c9b1db06f Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Nov 2016 03:40:34 +0000 Subject: avoid a null ref. (needs better way) --- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 3793712..8ba26e8 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -4371,6 +4371,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP ushort timeDilation; + if(m_scene == null) + return; + timeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); if (terseAgentUpdateBlocks.Count > 0) @@ -4632,6 +4635,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP void HandleQueueEmpty(ThrottleOutPacketTypeFlags categories) { + if(m_scene == null) + return; + if ((categories & ThrottleOutPacketTypeFlags.Task) != 0) { int maxUpdateBytes = m_udpClient.GetCatBytesCanSend(ThrottleOutPacketType.Task, 30); -- cgit v1.1 From b43f36abf168a0cce7e71178e3d4766a717c7d60 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Nov 2016 15:16:11 +0000 Subject: add expire time for aliens --- .../UserAccounts/UserAccountCache.cs | 33 +++++++++++++++++----- .../Interfaces/IUserAccountCacheModule.cs | 2 ++ 2 files changed, 28 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs index 6c1cc52..2afd74e 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/UserAccountCache.cs @@ -36,6 +36,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts { public class UserAccountCache : IUserAccountCacheModule { + private const double CACHE_ALIEN_EXPIRATION_SECONDS = 172800; // 48 hours private const double CACHE_EXPIRATION_SECONDS = 3600.0; // 1 hour! private const double CACHE_NULL_EXPIRATION_SECONDS = 600; // 10minutes @@ -60,21 +61,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts { if (account == null) m_UUIDCache.AddOrUpdate(userID, null, CACHE_NULL_EXPIRATION_SECONDS); - else + else if(account.LocalToGrid) { m_UUIDCache.AddOrUpdate(userID, account, CACHE_EXPIRATION_SECONDS); m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, CACHE_EXPIRATION_SECONDS); } - + else + { + m_UUIDCache.AddOrUpdate(userID, account, CACHE_ALIEN_EXPIRATION_SECONDS); + m_NameCache.AddOrUpdate(account.Name, account.PrincipalID, CACHE_ALIEN_EXPIRATION_SECONDS); + } //m_log.DebugFormat("[USER CACHE]: cached user {0}", userID); } } - public void Invalidate(UUID userID) - { - lock(accessLock) - m_UUIDCache.Remove(userID); - } public UserAccount Get(UUID userID, out bool inCache) { @@ -114,6 +114,25 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts return null; } + public void Invalidate(UUID userID) + { + m_UUIDCache.Remove(userID); + } + + public void Remove(UUID id) + { + lock(accessLock) + { + if (!m_UUIDCache.Contains(id)) + return; + + UserAccount account = null; + if (m_UUIDCache.TryGetValue(id, out account) && account != null) + m_NameCache.Remove(account.Name); + m_UUIDCache.Remove(id); + } + } + public void Remove(string name) { lock(accessLock) diff --git a/OpenSim/Region/Framework/Interfaces/IUserAccountCacheModule.cs b/OpenSim/Region/Framework/Interfaces/IUserAccountCacheModule.cs index ed26989..027a7e2 100644 --- a/OpenSim/Region/Framework/Interfaces/IUserAccountCacheModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IUserAccountCacheModule.cs @@ -26,8 +26,10 @@ */ using OpenSim.Region.Framework.Scenes; +using OpenMetaverse; public interface IUserAccountCacheModule { void Remove(string name); + void Remove(UUID id); } -- cgit v1.1 From 1396c466f65de8c1963282e7d59d3fb2acbbfe84 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Nov 2016 17:30:15 +0000 Subject: search accout by id not volatil user name (HG) --- OpenSim/Region/Framework/Scenes/Scene.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index ca32940..c349369 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -4141,7 +4141,8 @@ namespace OpenSim.Region.Framework.Scenes { IUserAccountCacheModule cache = RequestModuleInterface(); if (cache != null) - cache.Remove(acd.firstname + " " + acd.lastname); +// cache.Remove(acd.firstname + " " + acd.lastname); + cache.Remove(acd.AgentID); // Remove any preexisting circuit - we don't want duplicates // This is a stab at preventing avatar "ghosting" -- cgit v1.1