Add some asset cache plumbing. Change the generic cache from UUID to string

keys to allow caching the new crop of URI identified objects.
0.6.5-rc1
Melanie Thielker 2009-05-10 12:27:05 +00:00
parent 14a6880352
commit d8e1842d25
8 changed files with 106 additions and 46 deletions

View File

@ -33,8 +33,8 @@ namespace OpenSim.Framework
{ {
// The delegate we will use for performing fetch from backing store // The delegate we will use for performing fetch from backing store
// //
public delegate Object FetchDelegate(UUID index); public delegate Object FetchDelegate(string index);
public delegate bool ExpireDelegate(UUID index); public delegate bool ExpireDelegate(string index);
// Strategy // Strategy
// //
@ -64,14 +64,14 @@ namespace OpenSim.Framework
} }
// The base class of all cache objects. Implements comparison and sorting // The base class of all cache objects. Implements comparison and sorting
// by the UUID member. // by the string member.
// //
// This is not abstract because we need to instantiate it briefly as a // This is not abstract because we need to instantiate it briefly as a
// method parameter // method parameter
// //
public class CacheItemBase : IEquatable<CacheItemBase>, IComparable<CacheItemBase> public class CacheItemBase : IEquatable<CacheItemBase>, IComparable<CacheItemBase>
{ {
public UUID uuid; public string uuid;
public DateTime entered; public DateTime entered;
public DateTime lastUsed; public DateTime lastUsed;
public DateTime expires = new DateTime(0); public DateTime expires = new DateTime(0);
@ -86,14 +86,14 @@ namespace OpenSim.Framework
{ {
} }
public CacheItemBase(UUID index) public CacheItemBase(string index)
{ {
uuid = index; uuid = index;
entered = DateTime.Now; entered = DateTime.Now;
lastUsed = entered; lastUsed = entered;
} }
public CacheItemBase(UUID index, DateTime ttl) public CacheItemBase(string index, DateTime ttl)
{ {
uuid = index; uuid = index;
entered = DateTime.Now; entered = DateTime.Now;
@ -123,23 +123,23 @@ namespace OpenSim.Framework
{ {
private Object m_Data; private Object m_Data;
public MemoryCacheItem(UUID index) : public MemoryCacheItem(string index) :
base(index) base(index)
{ {
} }
public MemoryCacheItem(UUID index, DateTime ttl) : public MemoryCacheItem(string index, DateTime ttl) :
base(index, ttl) base(index, ttl)
{ {
} }
public MemoryCacheItem(UUID index, Object data) : public MemoryCacheItem(string index, Object data) :
base(index) base(index)
{ {
Store(data); Store(data);
} }
public MemoryCacheItem(UUID index, DateTime ttl, Object data) : public MemoryCacheItem(string index, DateTime ttl, Object data) :
base(index, ttl) base(index, ttl)
{ {
Store(data); Store(data);
@ -160,23 +160,23 @@ namespace OpenSim.Framework
// //
public class FileCacheItem : CacheItemBase public class FileCacheItem : CacheItemBase
{ {
public FileCacheItem(UUID index) : public FileCacheItem(string index) :
base(index) base(index)
{ {
} }
public FileCacheItem(UUID index, DateTime ttl) : public FileCacheItem(string index, DateTime ttl) :
base(index, ttl) base(index, ttl)
{ {
} }
public FileCacheItem(UUID index, Object data) : public FileCacheItem(string index, Object data) :
base(index) base(index)
{ {
Store(data); Store(data);
} }
public FileCacheItem(UUID index, DateTime ttl, Object data) : public FileCacheItem(string index, DateTime ttl, Object data) :
base(index, ttl) base(index, ttl)
{ {
Store(data); Store(data);
@ -200,8 +200,8 @@ namespace OpenSim.Framework
public class Cache public class Cache
{ {
private List<CacheItemBase> m_Index = new List<CacheItemBase>(); private List<CacheItemBase> m_Index = new List<CacheItemBase>();
private Dictionary<UUID, CacheItemBase> m_Lookup = private Dictionary<string, CacheItemBase> m_Lookup =
new Dictionary<UUID, CacheItemBase>(); new Dictionary<string, CacheItemBase>();
private CacheStrategy m_Strategy; private CacheStrategy m_Strategy;
private CacheMedium m_Medium; private CacheMedium m_Medium;
@ -312,7 +312,7 @@ namespace OpenSim.Framework
// Get an item from cache. Return the raw item, not it's data // Get an item from cache. Return the raw item, not it's data
// //
protected virtual CacheItemBase GetItem(UUID index) protected virtual CacheItemBase GetItem(string index)
{ {
CacheItemBase item = null; CacheItemBase item = null;
@ -339,7 +339,7 @@ namespace OpenSim.Framework
// Get an item from cache. Do not try to fetch from source if not // Get an item from cache. Do not try to fetch from source if not
// present. Just return null // present. Just return null
// //
public virtual Object Get(UUID index) public virtual Object Get(string index)
{ {
CacheItemBase item = GetItem(index); CacheItemBase item = GetItem(index);
@ -352,7 +352,7 @@ namespace OpenSim.Framework
// Fetch an object from backing store if not cached, serve from // Fetch an object from backing store if not cached, serve from
// cache if it is. // cache if it is.
// //
public virtual Object Get(UUID index, FetchDelegate fetch) public virtual Object Get(string index, FetchDelegate fetch)
{ {
Object item = Get(index); Object item = Get(index);
if (item != null) if (item != null)
@ -393,7 +393,7 @@ namespace OpenSim.Framework
return item.Retrieve(); return item.Retrieve();
} }
public virtual void Store(UUID index, Object data) public virtual void Store(string index, Object data)
{ {
Type container; Type container;
@ -411,12 +411,12 @@ namespace OpenSim.Framework
Store(index, data, container); Store(index, data, container);
} }
public virtual void Store(UUID index, Object data, Type container) public virtual void Store(string index, Object data, Type container)
{ {
Store(index, data, container, new Object[] { index }); Store(index, data, container, new Object[] { index });
} }
public virtual void Store(UUID index, Object data, Type container, public virtual void Store(string index, Object data, Type container,
Object[] parameters) Object[] parameters)
{ {
Expire(false); Expire(false);
@ -520,7 +520,7 @@ namespace OpenSim.Framework
} }
} }
public void Invalidate(UUID uuid) public void Invalidate(string uuid)
{ {
if (!m_Lookup.ContainsKey(uuid)) if (!m_Lookup.ContainsKey(uuid))
return; return;

View File

@ -45,8 +45,6 @@ namespace OpenSim.Region.CoreModules.Asset
MethodBase.GetCurrentMethod().DeclaringType); MethodBase.GetCurrentMethod().DeclaringType);
private bool m_Enabled = false; private bool m_Enabled = false;
private Dictionary<Scene, IAssetService> m_AssetService =
new Dictionary<Scene, IAssetService>();
public string Name public string Name
{ {
@ -85,10 +83,6 @@ namespace OpenSim.Region.CoreModules.Asset
public void AddRegion(Scene scene) public void AddRegion(Scene scene)
{ {
if (!m_Enabled)
return;
scene.RegisterModuleInterface<IImprovedAssetCache>(this);
} }
public void RemoveRegion(Scene scene) public void RemoveRegion(Scene scene)
@ -97,15 +91,27 @@ namespace OpenSim.Region.CoreModules.Asset
public void RegionLoaded(Scene scene) public void RegionLoaded(Scene scene)
{ {
if (!m_Enabled) }
return;
m_AssetService[scene] = ////////////////////////////////////////////////////////////
scene.RequestModuleInterface<IAssetService>(); // IImprovedAssetCache
//
if (m_AssetService[scene] != null) public void Cache(AssetBase asset)
m_log.InfoFormat("[ASSET CACHE]: Enabled for region {0}", {
scene.RegionInfo.RegionName); }
public AssetBase Get(string id)
{
return null;
}
public void Expire(string id)
{
}
public void Clear()
{
} }
} }
} }

View File

@ -624,8 +624,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
// a new friend was added in the initiator's and friend's data, so the cache entries are wrong now. // a new friend was added in the initiator's and friend's data, so the cache entries are wrong now.
lock (m_friendLists) lock (m_friendLists)
{ {
m_friendLists.Invalidate(fromAgentID); m_friendLists.Invalidate(fromAgentID.ToString());
m_friendLists.Invalidate(toAgentID); m_friendLists.Invalidate(toAgentID.ToString());
} }
// now send presence update and add a calling card for the new friend // now send presence update and add a calling card for the new friend
@ -664,8 +664,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
// The cache entries aren't valid anymore either, as we just added a friend to both sides. // The cache entries aren't valid anymore either, as we just added a friend to both sides.
lock (m_friendLists) lock (m_friendLists)
{ {
m_friendLists.Invalidate(agentID); m_friendLists.Invalidate(agentID.ToString());
m_friendLists.Invalidate(friendID); m_friendLists.Invalidate(friendID.ToString());
} }
// if it's a local friend, we don't have to do the lookup // if it's a local friend, we don't have to do the lookup
@ -782,8 +782,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
// clean up cache: FriendList is wrong now... // clean up cache: FriendList is wrong now...
lock (m_friendLists) lock (m_friendLists)
{ {
m_friendLists.Invalidate(agentID); m_friendLists.Invalidate(agentID.ToString());
m_friendLists.Invalidate(exfriendID); m_friendLists.Invalidate(exfriendID.ToString());
} }
} }
@ -1070,7 +1070,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
List<FriendListItem> fl; List<FriendListItem> fl;
lock (m_friendLists) lock (m_friendLists)
{ {
fl = (List<FriendListItem>)m_friendLists.Get(agent.ControllingClient.AgentId, fl = (List<FriendListItem>)m_friendLists.Get(agent.ControllingClient.AgentId.ToString(),
m_initialScene.GetFriendList); m_initialScene.GetFriendList);
} }
@ -1083,7 +1083,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
List<FriendListItem> fl; List<FriendListItem> fl;
lock (m_friendLists) lock (m_friendLists)
{ {
fl = (List<FriendListItem>)m_friendLists.Get(remoteClient.AgentId, fl = (List<FriendListItem>)m_friendLists.Get(remoteClient.AgentId.ToString(),
m_initialScene.GetFriendList); m_initialScene.GetFriendList);
} }

View File

@ -28,6 +28,7 @@
using log4net; using log4net;
using Nini.Config; using Nini.Config;
using System; using System;
using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using OpenSim.Servers.Base; using OpenSim.Servers.Base;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
@ -42,6 +43,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
LogManager.GetLogger( LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType); MethodBase.GetCurrentMethod().DeclaringType);
private Dictionary<Scene, IImprovedAssetCache> m_AssetCache =
new Dictionary<Scene, IImprovedAssetCache>();
private IAssetService m_AssetService; private IAssetService m_AssetService;
private bool m_Enabled = false; private bool m_Enabled = false;
@ -109,10 +113,29 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
public void RemoveRegion(Scene scene) public void RemoveRegion(Scene scene)
{ {
if (!m_Enabled)
return;
m_AssetCache.Remove(scene);
} }
public void RegionLoaded(Scene scene) public void RegionLoaded(Scene scene)
{ {
if (!m_Enabled)
return;
m_AssetCache[scene] =
scene.RequestModuleInterface<IImprovedAssetCache>();
m_log.InfoFormat("[ASSET CONNECTOR]: Enabled local assets for region {0}", scene.RegionInfo.RegionName);
m_AssetCache[scene] =
scene.RequestModuleInterface<IImprovedAssetCache>();
if (m_AssetCache[scene] != null)
{
m_log.InfoFormat("[ASSET CONNECTOR]: Enabled asset caching for region {0}", scene.RegionInfo.RegionName);
}
} }
} }
} }

View File

@ -27,6 +27,7 @@
using log4net; using log4net;
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using Nini.Config; using Nini.Config;
@ -48,6 +49,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
private bool m_Enabled = false; private bool m_Enabled = false;
private string m_ServerURI = String.Empty; private string m_ServerURI = String.Empty;
private Dictionary<Scene, IImprovedAssetCache> m_AssetCache =
new Dictionary<Scene, IImprovedAssetCache>();
public string Name public string Name
{ {
@ -103,10 +106,26 @@ namespace OpenSim.Region.CoreModules.ServiceConnectors.Asset
public void RemoveRegion(Scene scene) public void RemoveRegion(Scene scene)
{ {
if (!m_Enabled)
return;
m_AssetCache.Remove(scene);
} }
public void RegionLoaded(Scene scene) public void RegionLoaded(Scene scene)
{ {
if (!m_Enabled)
return;
m_AssetCache[scene] =
scene.RequestModuleInterface<IImprovedAssetCache>();
m_log.InfoFormat("[ASSET CONNECTOR]: Enabled remote assets for region {0}", scene.RegionInfo.RegionName);
if (m_AssetCache[scene] != null)
{
m_log.InfoFormat("[ASSET CONNECTOR]: Enabled asset caching for region {0}", scene.RegionInfo.RegionName);
}
} }
public AssetBase Get(string id) public AssetBase Get(string id)

View File

@ -1302,7 +1302,9 @@ namespace OpenSim.Region.CoreModules.World.Land
if (parcelID == UUID.Zero) if (parcelID == UUID.Zero)
return; return;
ExtendedLandData data = (ExtendedLandData)parcelInfoCache.Get(parcelID, delegate(UUID parcel) { ExtendedLandData data = (ExtendedLandData)parcelInfoCache.Get(parcelID.ToString(), delegate(string id) {
UUID parcel = UUID.Zero;
UUID.TryParse(id, out parcel);
// assume we've got the parcelID we just computed in RemoteParcelRequest // assume we've got the parcelID we just computed in RemoteParcelRequest
ExtendedLandData extLandData = new ExtendedLandData(); ExtendedLandData extLandData = new ExtendedLandData();
Util.ParseFakeParcelID(parcel, out extLandData.regionHandle, out extLandData.x, out extLandData.y); Util.ParseFakeParcelID(parcel, out extLandData.regionHandle, out extLandData.x, out extLandData.y);

View File

@ -25,9 +25,15 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using OpenSim.Framework;
namespace OpenSim.Region.Framework.Interfaces namespace OpenSim.Region.Framework.Interfaces
{ {
public interface IImprovedAssetCache public interface IImprovedAssetCache
{ {
void Cache(AssetBase asset);
AssetBase Get(string id);
void Expire(string id);
void Clear();
} }
} }

View File

@ -2825,8 +2825,12 @@ namespace OpenSim.Region.Framework.Scenes
objectCapacity = objects; objectCapacity = objects;
} }
public List<FriendListItem> GetFriendList(UUID avatarID) public List<FriendListItem> GetFriendList(string id)
{ {
UUID avatarID;
if (!UUID.TryParse(id, out avatarID))
return new List<FriendListItem>();
return CommsManager.GetUserFriendList(avatarID); return CommsManager.GetUserFriendList(avatarID);
} }