aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2012-09-25 22:54:20 +0100
committerJustin Clark-Casey (justincc)2012-09-25 22:54:20 +0100
commiteb5bec96e49466ede4ece376cb15cd68477ce983 (patch)
treef18a2e8bb10a36066349c7ea9bc35d83ece30354
parentMove UDP update task item code to AssetXferUploader to match existing create ... (diff)
downloadopensim-SC_OLD-eb5bec96e49466ede4ece376cb15cd68477ce983.zip
opensim-SC_OLD-eb5bec96e49466ede4ece376cb15cd68477ce983.tar.gz
opensim-SC_OLD-eb5bec96e49466ede4ece376cb15cd68477ce983.tar.bz2
opensim-SC_OLD-eb5bec96e49466ede4ece376cb15cd68477ce983.tar.xz
Insert transaction ID into AssetXferUploader constructor rather than at UploadAsset() to prevent item creation failure when NewInventoryItem thread reachs the object first.
This was preventing the previous race condition fix in 4fc0cfb from actually working. This commit also removes some of the pointless transaction id checks - these conditions are already being enforced in AgentAssetsTransactions.
-rw-r--r--OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs8
-rw-r--r--OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs77
2 files changed, 49 insertions, 36 deletions
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
index 59d0075..0271738 100644
--- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
+++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
@@ -73,7 +73,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
73 { 73 {
74 if (!XferUploaders.ContainsKey(transactionID)) 74 if (!XferUploaders.ContainsKey(transactionID))
75 { 75 {
76 uploader = new AssetXferUploader(this, m_Scene, m_dumpAssetsToFile); 76 uploader = new AssetXferUploader(this, m_Scene, transactionID, m_dumpAssetsToFile);
77 77
78// m_log.DebugFormat( 78// m_log.DebugFormat(
79// "[AGENT ASSETS TRANSACTIONS]: Adding asset xfer uploader {0} since it didn't previously exist", transactionID); 79// "[AGENT ASSETS TRANSACTIONS]: Adding asset xfer uploader {0} since it didn't previously exist", transactionID);
@@ -151,7 +151,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
151 AssetXferUploader uploader = RequestXferUploader(transactionID); 151 AssetXferUploader uploader = RequestXferUploader(transactionID);
152 152
153 uploader.RequestCreateInventoryItem( 153 uploader.RequestCreateInventoryItem(
154 remoteClient, transactionID, folderID, callbackID, 154 remoteClient, folderID, callbackID,
155 description, name, invType, type, wearableType, nextOwnerMask); 155 description, name, invType, type, wearableType, nextOwnerMask);
156 } 156 }
157 157
@@ -161,7 +161,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
161 { 161 {
162 AssetXferUploader uploader = RequestXferUploader(transactionID); 162 AssetXferUploader uploader = RequestXferUploader(transactionID);
163 163
164 uploader.RequestUpdateTaskInventoryItem(remoteClient, transactionID, item); 164 uploader.RequestUpdateTaskInventoryItem(remoteClient, item);
165 } 165 }
166 166
167 public void RequestUpdateInventoryItem(IClientAPI remoteClient, 167 public void RequestUpdateInventoryItem(IClientAPI remoteClient,
@@ -169,7 +169,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
169 { 169 {
170 AssetXferUploader uploader = RequestXferUploader(transactionID); 170 AssetXferUploader uploader = RequestXferUploader(transactionID);
171 171
172 uploader.RequestUpdateInventoryItem(remoteClient, transactionID, item); 172 uploader.RequestUpdateInventoryItem(remoteClient, item);
173 } 173 }
174 } 174 }
175} \ No newline at end of file 175} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
index 08c3134..52d7d57 100644
--- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
+++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs
@@ -80,15 +80,32 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
80 private bool m_storeLocal; 80 private bool m_storeLocal;
81 private uint nextPerm = 0; 81 private uint nextPerm = 0;
82 private IClientAPI ourClient; 82 private IClientAPI ourClient;
83 private UUID TransactionID = UUID.Zero; 83
84 private UUID m_transactionID;
85
84 private sbyte type = 0; 86 private sbyte type = 0;
85 private byte wearableType = 0; 87 private byte wearableType = 0;
86 public ulong XferID; 88 public ulong XferID;
87 private Scene m_Scene; 89 private Scene m_Scene;
88 90
89 public AssetXferUploader(AgentAssetTransactions transactions, Scene scene, bool dumpAssetToFile) 91 /// <summary>
92 /// AssetXferUploader constructor
93 /// </summary>
94 /// <param name='transactions'>/param>
95 /// <param name='scene'></param>
96 /// <param name='transactionID'></param>
97 /// <param name='dumpAssetToFile'>
98 /// If true then when the asset is uploaded it is dumped to a file with the format
99 /// String.Format("{6}_{7}_{0:d2}{1:d2}{2:d2}_{3:d2}{4:d2}{5:d2}.dat",
100 /// now.Year, now.Month, now.Day, now.Hour, now.Minute,
101 /// now.Second, m_asset.Name, m_asset.Type);
102 /// for debugging purposes.
103 /// </param>
104 public AssetXferUploader(
105 AgentAssetTransactions transactions, Scene scene, UUID transactionID, bool dumpAssetToFile)
90 { 106 {
91 m_transactions = transactions; 107 m_transactions = transactions;
108 m_transactionID = transactionID;
92 m_Scene = scene; 109 m_Scene = scene;
93 m_dumpAssetToFile = dumpAssetToFile; 110 m_dumpAssetToFile = dumpAssetToFile;
94 } 111 }
@@ -180,7 +197,6 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
180 m_asset.Local = storeLocal; 197 m_asset.Local = storeLocal;
181 m_asset.Temporary = tempFile; 198 m_asset.Temporary = tempFile;
182 199
183 TransactionID = transaction;
184 m_storeLocal = storeLocal; 200 m_storeLocal = storeLocal;
185 201
186 if (m_asset.Data.Length > 2) 202 if (m_asset.Data.Length > 2)
@@ -225,13 +241,13 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
225 // Remove ourselves from the list of transactions if completion was delayed until the transaction 241 // Remove ourselves from the list of transactions if completion was delayed until the transaction
226 // was complete. 242 // was complete.
227 // TODO: Should probably do the same for create item. 243 // TODO: Should probably do the same for create item.
228 m_transactions.RemoveXferUploader(TransactionID); 244 m_transactions.RemoveXferUploader(m_transactionID);
229 } 245 }
230 else if (m_updateTaskItem) 246 else if (m_updateTaskItem)
231 { 247 {
232 StoreAssetForTaskItemUpdate(m_updateTaskItemData); 248 StoreAssetForTaskItemUpdate(m_updateTaskItemData);
233 249
234 m_transactions.RemoveXferUploader(TransactionID); 250 m_transactions.RemoveXferUploader(m_transactionID);
235 } 251 }
236 else if (m_storeLocal) 252 else if (m_storeLocal)
237 { 253 {
@@ -241,7 +257,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
241 257
242 m_log.DebugFormat( 258 m_log.DebugFormat(
243 "[ASSET XFER UPLOADER]: Uploaded asset {0} for transaction {1}", 259 "[ASSET XFER UPLOADER]: Uploaded asset {0} for transaction {1}",
244 m_asset.FullID, TransactionID); 260 m_asset.FullID, m_transactionID);
245 261
246 if (m_dumpAssetToFile) 262 if (m_dumpAssetToFile)
247 { 263 {
@@ -269,40 +285,37 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
269 } 285 }
270 286
271 public void RequestCreateInventoryItem(IClientAPI remoteClient, 287 public void RequestCreateInventoryItem(IClientAPI remoteClient,
272 UUID transactionID, UUID folderID, uint callbackID, 288 UUID folderID, uint callbackID,
273 string description, string name, sbyte invType, 289 string description, string name, sbyte invType,
274 sbyte type, byte wearableType, uint nextOwnerMask) 290 sbyte type, byte wearableType, uint nextOwnerMask)
275 { 291 {
276 if (TransactionID == transactionID) 292 InventFolder = folderID;
293 m_name = name;
294 m_description = description;
295 this.type = type;
296 this.invType = invType;
297 this.wearableType = wearableType;
298 nextPerm = nextOwnerMask;
299 m_asset.Name = name;
300 m_asset.Description = description;
301 m_asset.Type = type;
302
303 // We must lock to avoid a race with a separate thread uploading the asset.
304 lock (this)
277 { 305 {
278 InventFolder = folderID; 306 if (m_uploadState == UploadState.Complete)
279 m_name = name; 307 {
280 m_description = description; 308 DoCreateItem(callbackID);
281 this.type = type; 309 }
282 this.invType = invType; 310 else
283 this.wearableType = wearableType;
284 nextPerm = nextOwnerMask;
285 m_asset.Name = name;
286 m_asset.Description = description;
287 m_asset.Type = type;
288
289 // We must lock to avoid a race with a separate thread uploading the asset.
290 lock (this)
291 { 311 {
292 if (m_uploadState == UploadState.Complete) 312 m_createItem = true; //set flag so the inventory item is created when upload is complete
293 { 313 m_createItemCallback = callbackID;
294 DoCreateItem(callbackID);
295 }
296 else
297 {
298 m_createItem = true; //set flag so the inventory item is created when upload is complete
299 m_createItemCallback = callbackID;
300 }
301 } 314 }
302 } 315 }
303 } 316 }
304 317
305 public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID, InventoryItemBase item) 318 public void RequestUpdateInventoryItem(IClientAPI remoteClient, InventoryItemBase item)
306 { 319 {
307 // We must lock to avoid a race with a separate thread uploading the asset. 320 // We must lock to avoid a race with a separate thread uploading the asset.
308 lock (this) 321 lock (this)
@@ -333,7 +346,7 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
333 } 346 }
334 } 347 }
335 348
336 public void RequestUpdateTaskInventoryItem(IClientAPI remoteClient, UUID transactionID, TaskInventoryItem taskItem) 349 public void RequestUpdateTaskInventoryItem(IClientAPI remoteClient, TaskInventoryItem taskItem)
337 { 350 {
338 // We must lock to avoid a race with a separate thread uploading the asset. 351 // We must lock to avoid a race with a separate thread uploading the asset.
339 lock (this) 352 lock (this)