From 0a4a5bbcef8df5447b39c11ba52b2434a2f60be0 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Fri, 14 Dec 2007 08:47:15 +0000 Subject: * ARequest changed name to AssetRequest and moved to own file. * The AssetServerBase is now responsible for dequeueing, the server implementations merely recieves ProcessRequest( AssetRequest req ) * Catchall added around queue processing thread so thread won't abort on exceptions. --- OpenSim/Framework/AssetRequest.cs | 10 +++ .../Framework/Communications/Cache/AssetServer.cs | 54 +++++++------- .../Communications/Cache/AssetServerBase.cs | 25 ++++++- .../Communications/Cache/GridAssetClient.cs | 85 ++++++++++------------ .../Communications/Cache/SQLAssetServer.cs | 37 ++++------ OpenSim/Framework/IAssetServer.cs | 6 -- 6 files changed, 107 insertions(+), 110 deletions(-) create mode 100644 OpenSim/Framework/AssetRequest.cs (limited to 'OpenSim') diff --git a/OpenSim/Framework/AssetRequest.cs b/OpenSim/Framework/AssetRequest.cs new file mode 100644 index 0000000..163ab70 --- /dev/null +++ b/OpenSim/Framework/AssetRequest.cs @@ -0,0 +1,10 @@ +using libsecondlife; + +namespace OpenSim.Framework +{ + public struct AssetRequest + { + public LLUUID AssetID; + public bool IsTexture; + } +} \ No newline at end of file diff --git a/OpenSim/Framework/Communications/Cache/AssetServer.cs b/OpenSim/Framework/Communications/Cache/AssetServer.cs index e5cceaa..00c2b2a 100644 --- a/OpenSim/Framework/Communications/Cache/AssetServer.cs +++ b/OpenSim/Framework/Communications/Cache/AssetServer.cs @@ -72,37 +72,33 @@ namespace OpenSim.Framework.Communications.Cache } } - protected override void RunRequests() + protected override void ProcessRequest(AssetRequest req) { - while (true) + byte[] idata = null; + bool found = false; + AssetStorage foundAsset = null; + IObjectSet result = db.Query(new AssetUUIDQuery(req.AssetID)); + if (result.Count > 0) { - byte[] idata = null; - bool found = false; - AssetStorage foundAsset = null; - ARequest req = _assetRequests.Dequeue(); - IObjectSet result = db.Query(new AssetUUIDQuery(req.AssetID)); - if (result.Count > 0) - { - foundAsset = (AssetStorage) result.Next(); - found = true; - } - - AssetBase asset = new AssetBase(); - if (found) - { - asset.FullID = foundAsset.UUID; - asset.Type = foundAsset.Type; - asset.InvType = foundAsset.Type; - asset.Name = foundAsset.Name; - idata = foundAsset.Data; - asset.Data = idata; - _receiver.AssetReceived(asset, req.IsTexture); - } - else - { - //asset.FullID = ; - _receiver.AssetNotFound(req.AssetID); - } + foundAsset = (AssetStorage)result.Next(); + found = true; + } + + AssetBase asset = new AssetBase(); + if (found) + { + asset.FullID = foundAsset.UUID; + asset.Type = foundAsset.Type; + asset.InvType = foundAsset.Type; + asset.Name = foundAsset.Name; + idata = foundAsset.Data; + asset.Data = idata; + _receiver.AssetReceived(asset, req.IsTexture); + } + else + { + //asset.FullID = ; + _receiver.AssetNotFound(req.AssetID); } } diff --git a/OpenSim/Framework/Communications/Cache/AssetServerBase.cs b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs index e117c93..659b9c9 100644 --- a/OpenSim/Framework/Communications/Cache/AssetServerBase.cs +++ b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs @@ -40,7 +40,7 @@ namespace OpenSim.Framework.Communications.Cache public abstract class AssetServerBase : IAssetServer { protected IAssetReceiver _receiver; - protected BlockingQueue _assetRequests; + protected BlockingQueue _assetRequests; protected Thread _localAssetServerThread; protected IAssetProvider m_assetProviderPlugin; protected object syncLock = new object(); @@ -48,7 +48,7 @@ namespace OpenSim.Framework.Communications.Cache protected abstract void StoreAsset(AssetBase asset); protected abstract void CommitAssets(); - protected abstract void RunRequests(); + protected abstract void ProcessRequest(AssetRequest req); public void LoadDefaultAssets() { @@ -64,13 +64,30 @@ namespace OpenSim.Framework.Communications.Cache public AssetServerBase() { MainLog.Instance.Verbose("ASSETSERVER", "Starting asset storage system"); - _assetRequests = new BlockingQueue(); + _assetRequests = new BlockingQueue(); _localAssetServerThread = new Thread(RunRequests); _localAssetServerThread.IsBackground = true; _localAssetServerThread.Start(); } + private void RunRequests() + { + while (true) // Since it's a 'blocking queue' + { + try + { + AssetRequest req = _assetRequests.Dequeue(); + + ProcessRequest(req); + } + catch(Exception e) + { + MainLog.Instance.Error("ASSETSERVER", e.Message ); + } + } + } + public void LoadAsset(AssetBase info, bool image, string filename) { //should request Asset from storage manager @@ -97,7 +114,7 @@ namespace OpenSim.Framework.Communications.Cache public void RequestAsset(LLUUID assetID, bool isTexture) { - ARequest req = new ARequest(); + AssetRequest req = new AssetRequest(); req.AssetID = assetID; req.IsTexture = isTexture; MainLog.Instance.Verbose("ASSET","Adding {0} to request queue", assetID); diff --git a/OpenSim/Framework/Communications/Cache/GridAssetClient.cs b/OpenSim/Framework/Communications/Cache/GridAssetClient.cs index e2924a4..47104d7 100644 --- a/OpenSim/Framework/Communications/Cache/GridAssetClient.cs +++ b/OpenSim/Framework/Communications/Cache/GridAssetClient.cs @@ -36,7 +36,7 @@ using OpenSim.Framework.Servers; namespace OpenSim.Framework.Communications.Cache { - public class GridAssetClient : AssetServerBase + public class GridAssetClient : AssetServerBase { private string _assetServerUrl; @@ -47,53 +47,44 @@ namespace OpenSim.Framework.Communications.Cache #region IAssetServer Members - protected override void RunRequests() + protected override void ProcessRequest(AssetRequest req) { - while (true) + Stream s = null; + try { - ARequest req = _assetRequests.Dequeue(); + MainLog.Instance.Debug("ASSETCACHE", "Querying for {0}", req.AssetID.ToString()); - //MainLog.Instance.Verbose("AssetStorage","Requesting asset: " + req.AssetID); + RestClient rc = new RestClient(_assetServerUrl); + rc.AddResourcePath("assets"); + rc.AddResourcePath(req.AssetID.ToString()); + if (req.IsTexture) + rc.AddQueryParameter("texture"); + rc.RequestMethod = "GET"; + s = rc.Request(); - Stream s = null; - try + if (s.Length > 0) { - MainLog.Instance.Debug("ASSETCACHE", "Querying for {0}", req.AssetID.ToString()); - - RestClient rc = new RestClient(_assetServerUrl); - rc.AddResourcePath("assets"); - rc.AddResourcePath(req.AssetID.ToString()); - if (req.IsTexture) - rc.AddQueryParameter("texture"); - - rc.RequestMethod = "GET"; - s = rc.Request(); - - if (s.Length > 0) - { - XmlSerializer xs = new XmlSerializer(typeof(AssetBase)); - AssetBase newAsset = (AssetBase)xs.Deserialize(s); - - _receiver.AssetReceived(newAsset, req.IsTexture); - } - else - { - MainLog.Instance.Debug("ASSETCACHE", "Asset not found {0}", req.AssetID.ToString()); - _receiver.AssetNotFound(req.AssetID); - } + XmlSerializer xs = new XmlSerializer(typeof(AssetBase)); + AssetBase newAsset = (AssetBase)xs.Deserialize(s); + + _receiver.AssetReceived(newAsset, req.IsTexture); } - catch (Exception e) + else { - MainLog.Instance.Error("ASSETCACHE", e.Message); - MainLog.Instance.Debug("ASSETCACHE", "Getting asset {0}", req.AssetID.ToString()); - MainLog.Instance.Error("ASSETCACHE", e.StackTrace); + MainLog.Instance.Debug("ASSETCACHE", "Asset not found {0}", req.AssetID.ToString()); + _receiver.AssetNotFound(req.AssetID); } - + } + catch (Exception e) + { + MainLog.Instance.Error("ASSETCACHE", e.Message); + MainLog.Instance.Debug("ASSETCACHE", "Getting asset {0}", req.AssetID.ToString()); + MainLog.Instance.Error("ASSETCACHE", e.StackTrace); } } - + public override void UpdateAsset(AssetBase asset) { @@ -104,18 +95,18 @@ namespace OpenSim.Framework.Communications.Cache { try { - // MemoryStream s = new MemoryStream(); + // MemoryStream s = new MemoryStream(); - // XmlSerializer xs = new XmlSerializer(typeof(AssetBase)); - // xs.Serialize(s, asset); - // RestClient rc = new RestClient(_assetServerUrl); - MainLog.Instance.Verbose("ASSET", "Storing asset"); + // XmlSerializer xs = new XmlSerializer(typeof(AssetBase)); + // xs.Serialize(s, asset); + // RestClient rc = new RestClient(_assetServerUrl); + MainLog.Instance.Verbose("ASSET", "Storing asset"); //rc.AddResourcePath("assets"); - // rc.RequestMethod = "POST"; - // rc.Request(s); - //MainLog.Instance.Verbose("ASSET", "Stored {0}", rc); - MainLog.Instance.Verbose("ASSET", "Sending to " + _assetServerUrl + "/assets/"); - RestObjectPoster.BeginPostObject(_assetServerUrl + "/assets/", asset); + // rc.RequestMethod = "POST"; + // rc.Request(s); + //MainLog.Instance.Verbose("ASSET", "Stored {0}", rc); + MainLog.Instance.Verbose("ASSET", "Sending to " + _assetServerUrl + "/assets/"); + RestObjectPoster.BeginPostObject(_assetServerUrl + "/assets/", asset); } catch (Exception e) { @@ -132,7 +123,7 @@ namespace OpenSim.Framework.Communications.Cache throw new Exception("The method or operation is not implemented."); } - + #endregion } diff --git a/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs b/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs index 9d08785..010581f 100644 --- a/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs +++ b/OpenSim/Framework/Communications/Cache/SQLAssetServer.cs @@ -57,7 +57,7 @@ namespace OpenSim.Framework.Communications.Cache if (typeInterface != null) { IAssetProvider plug = - (IAssetProvider) Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + (IAssetProvider)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); m_assetProviderPlugin = plug; m_assetProviderPlugin.Initialise(); @@ -65,12 +65,8 @@ namespace OpenSim.Framework.Communications.Cache "Added " + m_assetProviderPlugin.Name + " " + m_assetProviderPlugin.Version); } - - typeInterface = null; } } - - pluginAssembly = null; } @@ -81,27 +77,20 @@ namespace OpenSim.Framework.Communications.Cache m_assetProviderPlugin.CommitAssets(); } - protected override void RunRequests() + protected override void ProcessRequest(AssetRequest req) { - while (true) + AssetBase asset; + lock (syncLock) { - ARequest req = _assetRequests.Dequeue(); - - //MainLog.Instance.Verbose("AssetStorage","Requesting asset: " + req.AssetID); - - AssetBase asset = null; - lock (syncLock) - { - asset = m_assetProviderPlugin.FetchAsset(req.AssetID); - } - if (asset != null) - { - _receiver.AssetReceived(asset, req.IsTexture); - } - else - { - _receiver.AssetNotFound(req.AssetID); - } + asset = m_assetProviderPlugin.FetchAsset(req.AssetID); + } + if (asset != null) + { + _receiver.AssetReceived(asset, req.IsTexture); + } + else + { + _receiver.AssetNotFound(req.AssetID); } } diff --git a/OpenSim/Framework/IAssetServer.cs b/OpenSim/Framework/IAssetServer.cs index 2200d90..2fa77a0 100644 --- a/OpenSim/Framework/IAssetServer.cs +++ b/OpenSim/Framework/IAssetServer.cs @@ -60,10 +60,4 @@ namespace OpenSim.Framework { IAssetServer GetAssetServer(); } - - public struct ARequest - { - public LLUUID AssetID; - public bool IsTexture; - } } -- cgit v1.1