diff options
author | Diva Canto | 2010-12-23 19:31:37 -0800 |
---|---|---|
committer | Diva Canto | 2010-12-23 19:31:37 -0800 |
commit | 135b012bbd44ba04eca52fb901a93faca97cf02d (patch) | |
tree | 01135345551f290f46f2413a7957f09e11db8305 | |
parent | Merge branch 'master' of ssh://MyConnection/var/git/opensim (diff) | |
download | opensim-SC-135b012bbd44ba04eca52fb901a93faca97cf02d.zip opensim-SC-135b012bbd44ba04eca52fb901a93faca97cf02d.tar.gz opensim-SC-135b012bbd44ba04eca52fb901a93faca97cf02d.tar.bz2 opensim-SC-135b012bbd44ba04eca52fb901a93faca97cf02d.tar.xz |
Hopefully this fixes all prim inventory issues. No more abort, no more keeping track of time. Simply handle the issues, which are: (1) rapid double requests from the viewer for the same file; (2) sometimes the file generation takes too long and the Xfer request arrives at the XferModule before the file name is added.
This still has debug messages commented out, in case this needs more debugging. Pushing it so others can test.
-rw-r--r-- | OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs | 84 |
1 files changed, 49 insertions, 35 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs index 4f9e32b..df4ff05 100644 --- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs | |||
@@ -37,9 +37,9 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
37 | { | 37 | { |
38 | public class XferModule : IRegionModule, IXfer | 38 | public class XferModule : IRegionModule, IXfer |
39 | { | 39 | { |
40 | private static uint counter = 0; | ||
40 | private Scene m_scene; | 41 | private Scene m_scene; |
41 | private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>(); | 42 | private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>(); |
42 | private List<XferRequest> RequestTime = new List<XferRequest>(); | ||
43 | private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>(); | 43 | private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>(); |
44 | private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); | 44 | private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); |
45 | 45 | ||
@@ -95,18 +95,29 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
95 | lock (NewFiles) | 95 | lock (NewFiles) |
96 | { | 96 | { |
97 | if (NewFiles.ContainsKey(fileName)) | 97 | if (NewFiles.ContainsKey(fileName)) |
98 | { | ||
98 | NewFiles[fileName].Count++; | 99 | NewFiles[fileName].Count++; |
100 | //Console.WriteLine("AddNewFile " + fileName + " counter=" + NewFiles[fileName].Count); | ||
101 | } | ||
99 | else | 102 | else |
100 | { | 103 | { |
101 | FileData fd = new FileData(); | 104 | FileData fd = new FileData(); |
102 | fd.Count = 1; | 105 | fd.Count = 1; |
103 | fd.Data = data; | 106 | fd.Data = data; |
104 | NewFiles.Add(fileName, fd); | 107 | NewFiles.Add(fileName, fd); |
108 | //Console.WriteLine("AddNewFile " + fileName); | ||
105 | } | 109 | } |
106 | } | 110 | } |
107 | 111 | ||
112 | // This happens when the Xfer request ends up coming before | ||
113 | // the fileName is added by this method. That may happen when | ||
114 | // the file generation (the event that calle this method) | ||
115 | // takes a long time. In this case, we need to kick the | ||
116 | // Xfer request mannually. | ||
108 | if (Requests.ContainsKey(fileName)) | 117 | if (Requests.ContainsKey(fileName)) |
109 | { | 118 | { |
119 | //Console.WriteLine("*** AddNewFile Requests.Contains " + fileName); | ||
120 | |||
110 | RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName); | 121 | RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName); |
111 | Requests.Remove(fileName); | 122 | Requests.Remove(fileName); |
112 | } | 123 | } |
@@ -133,22 +144,14 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
133 | { | 144 | { |
134 | lock (NewFiles) | 145 | lock (NewFiles) |
135 | { | 146 | { |
136 | if (RequestTime.Count > 0) | 147 | //Console.WriteLine("---- RequestXfer " + fileName + " ----"); |
137 | { | ||
138 | TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - RequestTime[0].timeStamp.Ticks); | ||
139 | if (ts.TotalSeconds > 30) | ||
140 | { | ||
141 | ulong zxferid = RequestTime[0].xferID; | ||
142 | remoteClient.SendAbortXferPacket(zxferid); | ||
143 | RemoveXferData(zxferid); | ||
144 | RemoveOrDecrement(fileName); | ||
145 | } | ||
146 | } | ||
147 | 148 | ||
148 | if (NewFiles.ContainsKey(fileName)) | 149 | if (NewFiles.ContainsKey(fileName)) |
149 | { | 150 | { |
151 | //Console.WriteLine("NewFiles.ContainsKey " + fileName + " with count=" + NewFiles[fileName].Count); | ||
150 | if (!Transfers.ContainsKey(xferID)) | 152 | if (!Transfers.ContainsKey(xferID)) |
151 | { | 153 | { |
154 | //Console.WriteLine("!Transfers.ContainsKey("+xferID+")"); | ||
152 | byte[] fileData = NewFiles[fileName].Data; | 155 | byte[] fileData = NewFiles[fileName].Data; |
153 | XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); | 156 | XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); |
154 | 157 | ||
@@ -166,27 +169,38 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
166 | } | 169 | } |
167 | else | 170 | else |
168 | { | 171 | { |
169 | if (RequestTime.Count > 0) | 172 | ////Console.WriteLine("*** ! NewFiles.ContainsKey " + fileName); |
170 | { | 173 | //if (RequestTime.Count > 0) |
171 | TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - RequestTime[0].timeStamp.Ticks); | 174 | //{ |
172 | if (ts.TotalSeconds > 30) | 175 | // //Console.WriteLine("RequestTime.Count > 0"); |
173 | { | 176 | // TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - RequestTime[0].timeStamp.Ticks); |
174 | Requests.Remove(RequestTime[0].fileName); | 177 | // if (ts.TotalSeconds > 30) |
175 | RequestTime.RemoveAt(0); | 178 | // { |
176 | // Do we want to abort this here? | 179 | // Console.WriteLine("ts.TotalSeconds > 30"); |
177 | //remoteClient.SendAbortXfer(xferID); | 180 | // Requests.Remove(RequestTime[0].fileName); |
178 | } | 181 | // RequestTime.RemoveAt(0); |
179 | } | 182 | // // Do we want to abort this here? |
183 | // //remoteClient.SendAbortXfer(xferID); | ||
184 | // } | ||
185 | //} | ||
186 | |||
187 | XferRequest nRequest = new XferRequest(); | ||
188 | nRequest.remoteClient = remoteClient; | ||
189 | nRequest.xferID = xferID; | ||
190 | nRequest.fileName = fileName; | ||
191 | nRequest.timeStamp = DateTime.UtcNow; | ||
192 | nRequest.fileName = fileName; | ||
180 | 193 | ||
181 | if (!Requests.ContainsKey(fileName)) | 194 | if (!Requests.ContainsKey(fileName)) |
182 | { | 195 | { |
183 | XferRequest nRequest = new XferRequest(); | 196 | //Console.WriteLine("**** !Requests.ContainsKey(" + fileName + ")"); |
184 | nRequest.remoteClient = remoteClient; | ||
185 | nRequest.xferID = xferID; | ||
186 | nRequest.fileName = fileName; | ||
187 | nRequest.timeStamp = DateTime.UtcNow; | ||
188 | Requests.Add(fileName, nRequest); | 197 | Requests.Add(fileName, nRequest); |
189 | RequestTime.Add(nRequest); | 198 | } |
199 | else | ||
200 | { | ||
201 | //Console.WriteLine("**** Requests.ContainsKey(" + fileName + ")"); | ||
202 | Requests.Add(fileName + "-" + counter.ToString(), nRequest); | ||
203 | counter++; | ||
190 | } | 204 | } |
191 | 205 | ||
192 | } | 206 | } |
@@ -203,17 +217,13 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
203 | XferDownLoad dl = Transfers[xferID]; | 217 | XferDownLoad dl = Transfers[xferID]; |
204 | if (Transfers[xferID].AckPacket(packet)) | 218 | if (Transfers[xferID].AckPacket(packet)) |
205 | { | 219 | { |
206 | { | 220 | RemoveXferData(xferID); |
207 | RemoveXferData(xferID); | 221 | RemoveOrDecrement(dl.FileName); |
208 | RemoveOrDecrement(dl.FileName); | ||
209 | } | ||
210 | } | 222 | } |
211 | else | 223 | else |
212 | { | 224 | { |
213 | |||
214 | if (Requests.ContainsKey(dl.FileName)) | 225 | if (Requests.ContainsKey(dl.FileName)) |
215 | { | 226 | { |
216 | // | ||
217 | XferRequest req = Requests[dl.FileName]; | 227 | XferRequest req = Requests[dl.FileName]; |
218 | req.timeStamp = DateTime.UtcNow; | 228 | req.timeStamp = DateTime.UtcNow; |
219 | Requests[dl.FileName] = req; | 229 | Requests[dl.FileName] = req; |
@@ -262,9 +272,13 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
262 | if (NewFiles.ContainsKey(fileName)) | 272 | if (NewFiles.ContainsKey(fileName)) |
263 | { | 273 | { |
264 | if (NewFiles[fileName].Count == 1) | 274 | if (NewFiles[fileName].Count == 1) |
275 | { | ||
265 | NewFiles.Remove(fileName); | 276 | NewFiles.Remove(fileName); |
277 | } | ||
266 | else | 278 | else |
279 | { | ||
267 | NewFiles[fileName].Count--; | 280 | NewFiles[fileName].Count--; |
281 | } | ||
268 | } | 282 | } |
269 | } | 283 | } |
270 | 284 | ||