aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDiva Canto2010-12-22 17:55:58 -0800
committerDiva Canto2010-12-22 17:55:58 -0800
commit862da9a55fe94ae70a5bba306139b5eb1bb7f6f7 (patch)
treebe40d2833338d875835a01dadcdb796200e515dc
parentMerge branch 'master' of melanie@opensimulator.org:/var/git/opensim (diff)
downloadopensim-SC-862da9a55fe94ae70a5bba306139b5eb1bb7f6f7.zip
opensim-SC-862da9a55fe94ae70a5bba306139b5eb1bb7f6f7.tar.gz
opensim-SC-862da9a55fe94ae70a5bba306139b5eb1bb7f6f7.tar.bz2
opensim-SC-862da9a55fe94ae70a5bba306139b5eb1bb7f6f7.tar.xz
Added a counter to NewFiles in Xfers to account for simultaneous object inventory requests, which apparently are happening and may cause race conditions if the file name is removed after the first transfer.
-rw-r--r--OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs58
1 files changed, 42 insertions, 16 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
index 57875da..c5a6e62 100644
--- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs
@@ -40,8 +40,8 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
40 private Scene m_scene; 40 private Scene m_scene;
41 private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>(); 41 private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>();
42 private List<XferRequest> RequestTime = new List<XferRequest>(); 42 private List<XferRequest> RequestTime = new List<XferRequest>();
43 public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>(); 43 private Dictionary<string, FileData> NewFiles = new Dictionary<string, FileData>();
44 public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); 44 private Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>();
45 45
46 46
47 public struct XferRequest 47 public struct XferRequest
@@ -51,6 +51,12 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
51 public string fileName; 51 public string fileName;
52 public DateTime timeStamp; 52 public DateTime timeStamp;
53 } 53 }
54
55 private class FileData
56 {
57 public byte[] Data;
58 public int Count;
59 }
54 60
55 #region IRegionModule Members 61 #region IRegionModule Members
56 62
@@ -89,21 +95,22 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
89 lock (NewFiles) 95 lock (NewFiles)
90 { 96 {
91 if (NewFiles.ContainsKey(fileName)) 97 if (NewFiles.ContainsKey(fileName))
92 { 98 NewFiles[fileName].Count++;
93 NewFiles[fileName] = data;
94 }
95 else 99 else
96 { 100 {
97 NewFiles.Add(fileName, data); 101 FileData fd = new FileData();
102 fd.Count = 1;
103 fd.Data = data;
104 NewFiles.Add(fileName, fd);
98 } 105 }
99 } 106 }
100 string filename = string.Empty;
101 107
102 if (Requests.ContainsKey(fileName)) 108 // This should not be here
103 { 109 //if (Requests.ContainsKey(fileName))
104 RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName); 110 //{
105 Requests.Remove(fileName); 111 // RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName);
106 } 112 // Requests.Remove(fileName);
113 //}
107 114
108 return true; 115 return true;
109 } 116 }
@@ -135,6 +142,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
135 ulong zxferid = RequestTime[0].xferID; 142 ulong zxferid = RequestTime[0].xferID;
136 remoteClient.SendAbortXferPacket(zxferid); 143 remoteClient.SendAbortXferPacket(zxferid);
137 RemoveXferData(zxferid); 144 RemoveXferData(zxferid);
145 RemoveOrDecrement(fileName);
138 } 146 }
139 } 147 }
140 148
@@ -142,16 +150,19 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
142 { 150 {
143 if (!Transfers.ContainsKey(xferID)) 151 if (!Transfers.ContainsKey(xferID))
144 { 152 {
145 byte[] fileData = NewFiles[fileName]; 153 byte[] fileData = NewFiles[fileName].Data;
146 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); 154 XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient);
147 155
148 Transfers.Add(xferID, transaction); 156 Transfers.Add(xferID, transaction);
149 NewFiles.Remove(fileName);
150 157
151 if (transaction.StartSend()) 158 if (transaction.StartSend())
152 { 159 {
153 RemoveXferData(xferID); 160 RemoveXferData(xferID);
154 } 161 }
162
163 // The transaction for this file is either complete or on its way
164 RemoveOrDecrement(fileName);
165
155 } 166 }
156 } 167 }
157 else 168 else
@@ -195,6 +206,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
195 { 206 {
196 { 207 {
197 RemoveXferData(xferID); 208 RemoveXferData(xferID);
209 RemoveOrDecrement(dl.FileName);
198 } 210 }
199 } 211 }
200 else 212 else
@@ -226,8 +238,6 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
226 xferItem.DataPointer = 0; 238 xferItem.DataPointer = 0;
227 239
228 // If the abort comes in 240 // If the abort comes in
229 if (NewFiles.ContainsKey(xferItem.FileName))
230 NewFiles.Remove(xferItem.FileName);
231 241
232 if (Requests.ContainsKey(xferItem.FileName)) 242 if (Requests.ContainsKey(xferItem.FileName))
233 Requests.Remove(xferItem.FileName); 243 Requests.Remove(xferItem.FileName);
@@ -239,10 +249,26 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer
239 { 249 {
240 lock (NewFiles) 250 lock (NewFiles)
241 { 251 {
252 if (Transfers.ContainsKey(xferID))
253 RemoveOrDecrement(Transfers[xferID].FileName);
254
242 RemoveXferData(xferID); 255 RemoveXferData(xferID);
243 } 256 }
244 } 257 }
245 258
259 private void RemoveOrDecrement(string fileName)
260 {
261 // NewFiles must be locked
262
263 if (NewFiles.ContainsKey(fileName))
264 {
265 if (NewFiles[fileName].Count == 1)
266 NewFiles.Remove(fileName);
267 else
268 NewFiles[fileName].Count--;
269 }
270 }
271
246 #region Nested type: XferDownLoad 272 #region Nested type: XferDownLoad
247 273
248 public class XferDownLoad 274 public class XferDownLoad