From 13da5a9fbaa0c50a8a49da1a30b2cd6ce75a3648 Mon Sep 17 00:00:00 2001 From: diva Date: Mon, 18 May 2009 20:04:59 +0000 Subject: Finished HG Service Store. Not fully functional because of problems with asset.ID insisting on being a UUID string. --- .../ServiceConnectors/Asset/HGAssetBroker.cs | 9 ++- .../Framework/Scenes/Hypergrid/HGAssetMapper.cs | 66 ++++++++++------------ OpenSim/Services/AssetService/HGAssetService.cs | 13 ++++- 3 files changed, 48 insertions(+), 40 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetBroker.cs index 34bb85a..aef04bf 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectors/Asset/HGAssetBroker.cs @@ -178,8 +178,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset if (asset != null) return asset; - else - m_log.DebugFormat("[HG ASSSET CONNECTOR]: Requested asset is not in cache. This shouldn't happen."); } if (IsHG(id)) @@ -295,7 +293,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset public string Store(AssetBase asset) { - if (m_Cache != null) + bool isHG = IsHG(asset.ID); + + if ((m_Cache != null) && !isHG) + // Don't store it in the cache if the asset is to + // be sent to the other grid, because this is already + // a copy of the local asset. m_Cache.Cache(asset); if (asset.Temporary || asset.Local) diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs index e659ad1..b6b2172 100644 --- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs +++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs @@ -120,25 +120,30 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid return null; } - private bool PostAsset(GridAssetClient asscli, UUID assetID, bool isTexture) + private bool PostAsset(string url, AssetBase asset) { - AssetBase asset1; - //m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out asset1); - asset1 = m_scene.CommsManager.AssetCache.GetAsset(assetID, isTexture); - - if (asset1 != null) + if (asset != null) { // See long comment in AssetCache.AddAsset - if (!asset1.Temporary || asset1.Local) + if (!asset.Temporary || asset.Local) { - // The asset cache returns instances of subclasses of AssetBase: - // TextureImage or AssetInfo. So in passing them to the remote - // server we first need to convert this to instances of AssetBase, - // which is the serializable class for assets. - AssetBase asset = new AssetBase(); - Copy(asset1, asset); - - asscli.StoreAsset(asset); + // We need to copy the asset into a new asset, because + // we need to set its ID to be URL+UUID, so that the + // HGAssetService dispatches it to the remote grid. + // It's not pretty, but the best that can be done while + // not having a global naming infrastructure + AssetBase asset1 = new AssetBase(); + Copy(asset, asset1); + try + { + asset1.ID = url + "/" + asset.ID; + } + catch + { + m_log.Warn("[HGScene]: This won't work until Melanie kills a few more dragons"); + } + + m_scene.AssetService.Store(asset1); } return true; } @@ -315,46 +320,35 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid { if (!IsLocalUser(ownerID)) { - // Post the item from the local AssetCache ontp the remote asset server + // Post the item from the local AssetCache onto the remote asset server // and place an entry in m_assetMap - GridAssetClient asscli = null; string userAssetURL = UserAssetURL(ownerID); if (userAssetURL != null) { - m_assetServers.TryGetValue(userAssetURL, out asscli); - if (asscli == null) - { - m_log.Debug("[HGScene]: Starting new GridAssetClient for " + userAssetURL); - asscli = new GridAssetClient(userAssetURL); - asscli.SetReceiver(m_scene.CommsManager.AssetCache); // Straight to the asset cache! - m_assetServers.Add(userAssetURL, asscli); - } m_log.Debug("[HGScene]: Posting object " + assetID + " to asset server " + userAssetURL); - AssetBase ass1 = null; - m_scene.CommsManager.AssetCache.TryGetCachedAsset(assetID, out ass1); + AssetBase ass1 = m_scene.AssetService.Get(assetID.ToString()); if (ass1 != null) { - bool success = PostAsset(asscli, assetID, (ass1.Type == (sbyte)AssetType.Texture)); + bool success = PostAsset(userAssetURL, ass1); // Now the inside Dictionary ids = SniffUUIDs(assetID); Dump(ids); foreach (KeyValuePair kvp in ids) - PostAsset(asscli, kvp.Key, kvp.Value); - - if (success) { - m_log.Debug("[HGScene]: Successfully posted item to remote asset server " + userAssetURL); - if (!m_assetMap.ContainsKey(assetID)) - m_assetMap.Add(assetID, asscli); + ass1 = m_scene.AssetService.Get(kvp.Key.ToString()); + PostAsset(userAssetURL, ass1); } + + if (success) + m_log.DebugFormat("[HGScene]: Successfully posted item {0} to remote asset server {1}", assetID, userAssetURL); else - m_log.Warn("[HGScene]: Could not post asset to remote asset server " + userAssetURL); + m_log.WarnFormat("[HGScene]: Could not post asset {0} to remote asset server {1}", assetID, userAssetURL); } else - m_log.Debug("[HGScene]: Something wrong with asset"); + m_log.Debug("[HGScene]: Something wrong with asset, it could not be found"); } else m_log.Warn("[HGScene]: Unable to locate foreign user's asset server"); diff --git a/OpenSim/Services/AssetService/HGAssetService.cs b/OpenSim/Services/AssetService/HGAssetService.cs index 415a0f5..cf275ab 100644 --- a/OpenSim/Services/AssetService/HGAssetService.cs +++ b/OpenSim/Services/AssetService/HGAssetService.cs @@ -94,7 +94,7 @@ namespace OpenSim.Services.AssetService // We're instantiating this class explicitly, but this won't // work in general, because the remote grid may be running // an asset server that has a different protocol. - // Eventually we will want a piece of meta-protocol asking + // Eventually we will want a piece of protocol asking // the remote server about its kind. Definitely cool thing to do! connector = new AssetServicesConnector(url); m_connectors.Add(url, connector); @@ -152,6 +152,17 @@ namespace OpenSim.Services.AssetService public string Store(AssetBase asset) { + string url = string.Empty; + string assetID = string.Empty; + + if (StringToUrlAndAssetID(asset.ID, out url, out assetID)) + { + IAssetService connector = GetConnector(url); + // Restore the assetID to a simple UUID + asset.ID = assetID; + return connector.Store(asset); + } + return String.Empty; } -- cgit v1.1