diff options
author | UbitUmarov | 2016-08-06 22:12:38 +0100 |
---|---|---|
committer | UbitUmarov | 2016-08-06 22:12:38 +0100 |
commit | 83d6722d31a3deb51b34a18c46bb4a904902dff0 (patch) | |
tree | 04bd8b0ab2f32bc668670eb0d5a8b7f688a95cb4 | |
parent | ubOde revert making vehicle hover height disable hover. This at least breaks... (diff) | |
download | opensim-SC_OLD-83d6722d31a3deb51b34a18c46bb4a904902dff0.zip opensim-SC_OLD-83d6722d31a3deb51b34a18c46bb4a904902dff0.tar.gz opensim-SC_OLD-83d6722d31a3deb51b34a18c46bb4a904902dff0.tar.bz2 opensim-SC_OLD-83d6722d31a3deb51b34a18c46bb4a904902dff0.tar.xz |
if a viewer overloads region capability to process RequestMapBlocks, ignore following requests for 300 seconds. This was necessary becaus some viewers like FireStorm are doing it, saturating region and grid services for no usefull reason
-rw-r--r-- | OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | 75 |
1 files changed, 64 insertions, 11 deletions
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index 6f10f51..959829c 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | |||
@@ -1060,27 +1060,80 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1060 | /// <param name="maxY"></param> | 1060 | /// <param name="maxY"></param> |
1061 | public void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag) | 1061 | public void RequestMapBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag) |
1062 | { | 1062 | { |
1063 | m_log.DebugFormat("[WoldMapModule] RequestMapBlocks {0}={1}={2}={3} {4}", minX, minY, maxX, maxY, flag); | 1063 | // m_log.DebugFormat("[WoldMapModule] RequestMapBlocks {0}={1}={2}={3} {4}", minX, minY, maxX, maxY, flag); |
1064 | 1064 | ||
1065 | GetAndSendBlocks(remoteClient, minX, minY, maxX, maxY, flag); | 1065 | GetAndSendBlocks(remoteClient, minX, minY, maxX, maxY, flag); |
1066 | } | 1066 | } |
1067 | 1067 | ||
1068 | private const double SPAMBLOCKTIMEms = 300000; // 5 minutes | ||
1069 | private Dictionary<UUID,double> spamBlocked = new Dictionary<UUID,double>(); | ||
1070 | |||
1068 | protected virtual List<MapBlockData> GetAndSendBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag) | 1071 | protected virtual List<MapBlockData> GetAndSendBlocks(IClientAPI remoteClient, int minX, int minY, int maxX, int maxY, uint flag) |
1069 | { | 1072 | { |
1070 | MapBlockRequestData req = new MapBlockRequestData(); | 1073 | // anti spam because of FireStorm 4.7.7 absurd request repeat rates |
1074 | // possible others | ||
1071 | 1075 | ||
1072 | req.client = remoteClient; | 1076 | double now = Util.GetTimeStampMS(); |
1073 | req.minX = minX; | 1077 | UUID agentID = remoteClient.AgentId; |
1074 | req.maxX = maxX; | ||
1075 | req.minY = minY; | ||
1076 | req.maxY = maxY; | ||
1077 | req.flags = flag; | ||
1078 | 1078 | ||
1079 | lock (m_mapBlockRequestEvent) | 1079 | lock (m_mapBlockRequestEvent) |
1080 | { | 1080 | { |
1081 | if (!m_mapBlockRequests.ContainsKey(remoteClient.AgentId)) | 1081 | if(spamBlocked.ContainsKey(agentID)) |
1082 | m_mapBlockRequests[remoteClient.AgentId] = new Queue<MapBlockRequestData>(); | 1082 | { |
1083 | m_mapBlockRequests[remoteClient.AgentId].Enqueue(req); | 1083 | if(spamBlocked[agentID] < now && |
1084 | (!m_mapBlockRequests.ContainsKey(agentID) || | ||
1085 | m_mapBlockRequests[agentID].Count == 0 )) | ||
1086 | { | ||
1087 | spamBlocked.Remove(agentID); | ||
1088 | m_log.DebugFormat("[WoldMapModule] RequestMapBlocks release spammer {0}", agentID); | ||
1089 | } | ||
1090 | else | ||
1091 | return new List<MapBlockData>(); | ||
1092 | } | ||
1093 | else | ||
1094 | { | ||
1095 | // ugly slow expire spammers | ||
1096 | if(spamBlocked.Count > 0) | ||
1097 | { | ||
1098 | UUID k = UUID.Zero; | ||
1099 | bool expireone = false; | ||
1100 | foreach(UUID k2 in spamBlocked.Keys) | ||
1101 | { | ||
1102 | if(spamBlocked[k2] < now && | ||
1103 | (!m_mapBlockRequests.ContainsKey(k2) || | ||
1104 | m_mapBlockRequests[k2].Count == 0 )) | ||
1105 | { | ||
1106 | m_log.DebugFormat("[WoldMapModule] RequestMapBlocks release spammer {0}", k2); | ||
1107 | k = k2; | ||
1108 | expireone = true; | ||
1109 | } | ||
1110 | break; // doing one at a time | ||
1111 | } | ||
1112 | if(expireone) | ||
1113 | spamBlocked.Remove(k); | ||
1114 | } | ||
1115 | } | ||
1116 | |||
1117 | // m_log.DebugFormat("[WoldMapModule] RequestMapBlocks {0}={1}={2}={3} {4}", minX, minY, maxX, maxY, flag); | ||
1118 | |||
1119 | MapBlockRequestData req = new MapBlockRequestData(); | ||
1120 | |||
1121 | req.client = remoteClient; | ||
1122 | req.minX = minX; | ||
1123 | req.maxX = maxX; | ||
1124 | req.minY = minY; | ||
1125 | req.maxY = maxY; | ||
1126 | req.flags = flag; | ||
1127 | |||
1128 | if (!m_mapBlockRequests.ContainsKey(agentID)) | ||
1129 | m_mapBlockRequests[agentID] = new Queue<MapBlockRequestData>(); | ||
1130 | if(m_mapBlockRequests[agentID].Count < 150 ) | ||
1131 | m_mapBlockRequests[agentID].Enqueue(req); | ||
1132 | else | ||
1133 | { | ||
1134 | spamBlocked[agentID] = now + SPAMBLOCKTIMEms; | ||
1135 | m_log.DebugFormat("[WoldMapModule] RequestMapBlocks blocking spammer {0} for {1} s",agentID, SPAMBLOCKTIMEms/1000.0); | ||
1136 | } | ||
1084 | m_mapBlockRequestEvent.Set(); | 1137 | m_mapBlockRequestEvent.Set(); |
1085 | } | 1138 | } |
1086 | 1139 | ||