From 410ae96d044f234f35a0824d934d72e77155d62f Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 11 Sep 2015 22:26:05 +0100 Subject: [PATCH] put back diva's cache with her recent fix but also avoid duplicated InventoryService.UpdateItem call in case of m_uploadState is complete. In that case CompleteItemUpload will do it --- .../AssetTransaction/AssetXferUploader.cs | 35 +++++++++++++------ .../Inventory/XInventoryServicesConnector.cs | 9 ++++- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs index fdff199986..fabb4092dd 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs @@ -337,12 +337,16 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction m_asset.Description = item.Description; m_asset.Type = (sbyte)item.AssetType; - // We must always store the item at this point even if the asset hasn't finished uploading, in order - // to avoid a race condition when the appearance module retrieves the item to set the asset id in - // the AvatarAppearance structure. - item.AssetID = m_asset.FullID; - if (item.AssetID != UUID.Zero) - m_Scene.InventoryService.UpdateItem(item); + // remove redundante m_Scene.InventoryService.UpdateItem + // if uploadState == UploadState.Complete) +// if (m_asset.FullID != UUID.Zero) +// { + // We must always store the item at this point even if the asset hasn't finished uploading, in order + // to avoid a race condition when the appearance module retrieves the item to set the asset id in + // the AvatarAppearance structure. +// item.AssetID = m_asset.FullID; +// m_Scene.InventoryService.UpdateItem(item); +// } if (m_uploadState == UploadState.Complete) { @@ -350,10 +354,21 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction } else { -// m_log.DebugFormat( -// "[ASSET XFER UPLOADER]: Holding update inventory item request {0} for {1} pending completion of asset xfer for transaction {2}", -// item.Name, remoteClient.Name, transactionID); - + // do it here to avoid the eventual race condition + if (m_asset.FullID != UUID.Zero) + { + // We must always store the item at this point even if the asset hasn't finished uploading, in order + // to avoid a race condition when the appearance module retrieves the item to set the asset id in + // the AvatarAppearance structure. + item.AssetID = m_asset.FullID; + m_Scene.InventoryService.UpdateItem(item); + } + + + // m_log.DebugFormat( + // "[ASSET XFER UPLOADER]: Holding update inventory item request {0} for {1} pending completion of asset xfer for transaction {2}", + // item.Name, remoteClient.Name, transactionID); + m_updateItem = true; m_updateItemData = item; } diff --git a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs index f235446ac9..243da52f39 100644 --- a/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs +++ b/OpenSim/Services/Connectors/Inventory/XInventoryServicesConnector.cs @@ -474,7 +474,13 @@ namespace OpenSim.Services.Connectors { "CreationDate", item.CreationDate.ToString() } }); - return CheckReturn(ret); + bool result = CheckReturn(ret); + if (result) + { + m_ItemCache.AddOrUpdate(item.ID, item, CACHE_EXPIRATION_SECONDS); + } + + return result; } public bool MoveItems(UUID principalID, List items) @@ -551,6 +557,7 @@ namespace OpenSim.Services.Connectors List pending = new List(); InventoryItemBase item = null; int i = 0; + foreach (UUID id in itemIDs) { if (m_ItemCache.TryGetValue(id, out item))