* Added better logging to AssetCache

* AssetCache now ignores duplicate uploads
* some m_ refactoring
* ignored some bins
afrisby
lbsa71 2007-11-06 11:10:45 +00:00
parent 06e7b6bd98
commit ee1fcc729c
5 changed files with 104 additions and 97 deletions

View File

@ -58,37 +58,40 @@ namespace OpenSim.Framework.Communications.Cache
//Textures requested from the asset server //Textures requested from the asset server
public Dictionary<LLUUID, TextureSender> SendingTextures = new Dictionary<LLUUID, TextureSender>(); public Dictionary<LLUUID, TextureSender> SendingTextures = new Dictionary<LLUUID, TextureSender>();
private BlockingQueue<TextureSender> QueueTextures = new BlockingQueue<TextureSender>();
private Dictionary<LLUUID, List<LLUUID>> AvatarRecievedTextures = new Dictionary<LLUUID, List<LLUUID>>();
private Dictionary<LLUUID, Dictionary<LLUUID, int>> TimesTextureSent =
new Dictionary<LLUUID, Dictionary<LLUUID, int>>();
public Dictionary<LLUUID, AssetRequestsList> RequestLists = new Dictionary<LLUUID, AssetRequestsList>(); public Dictionary<LLUUID, AssetRequestsList> RequestLists = new Dictionary<LLUUID, AssetRequestsList>();
private IAssetServer _assetServer; private BlockingQueue<TextureSender> m_queueTextures = new BlockingQueue<TextureSender>();
private Thread _assetCacheThread; private Dictionary<LLUUID, List<LLUUID>> m_avatarReceivedTextures = new Dictionary<LLUUID, List<LLUUID>>();
private Thread TextureSenderThread; private Dictionary<LLUUID, Dictionary<LLUUID, int>> m_timesTextureSent =
new Dictionary<LLUUID, Dictionary<LLUUID, int>>();
private IAssetServer m_assetServer;
private Thread m_assetCacheThread;
private Thread m_textureSenderThread;
private LogBase m_log;
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public AssetCache(IAssetServer assetServer) public AssetCache(IAssetServer assetServer, LogBase log)
{ {
MainLog.Instance.Verbose("ASSETSTORAGE", "Creating Asset cache"); log.Verbose("ASSETSTORAGE", "Creating Asset cache");
_assetServer = assetServer; m_assetServer = assetServer;
_assetServer.SetReceiver(this); m_assetServer.SetReceiver(this);
Assets = new Dictionary<LLUUID, AssetInfo>(); Assets = new Dictionary<LLUUID, AssetInfo>();
Textures = new Dictionary<LLUUID, TextureImage>(); Textures = new Dictionary<LLUUID, TextureImage>();
_assetCacheThread = new Thread(new ThreadStart(RunAssetManager)); m_assetCacheThread = new Thread(new ThreadStart(RunAssetManager));
_assetCacheThread.IsBackground = true; m_assetCacheThread.IsBackground = true;
_assetCacheThread.Start(); m_assetCacheThread.Start();
TextureSenderThread = new Thread(new ThreadStart(ProcessTextureSenders)); m_textureSenderThread = new Thread(new ThreadStart(ProcessTextureSenders));
TextureSenderThread.IsBackground = true; m_textureSenderThread.IsBackground = true;
TextureSenderThread.Start(); m_textureSenderThread.Start();
m_log = log;
} }
/// <summary> /// <summary>
@ -161,7 +164,7 @@ namespace OpenSim.Framework.Communications.Cache
RequestLists.Add(assetID, reqList); RequestLists.Add(assetID, reqList);
} }
} }
_assetServer.RequestAsset(assetID, false); m_assetServer.RequestAsset(assetID, false);
} }
} }
@ -171,46 +174,67 @@ namespace OpenSim.Framework.Communications.Cache
AssetBase asset = GetAsset(assetID); AssetBase asset = GetAsset(assetID);
if (asset == null) if (asset == null)
{ {
_assetServer.RequestAsset(assetID, isTexture); m_assetServer.RequestAsset(assetID, isTexture);
} }
return asset; return asset;
} }
public void AddAsset(AssetBase asset) public void AddAsset(AssetBase asset)
{ {
//System.Console.WriteLine("adding asset " + asset.FullID.ToStringHyphenated()); string temporary = asset.Temporary ? "temporary" : "";
string type = asset.Type == 0 ? "texture" : "asset";
string result = "Ignored";
if (asset.Type == 0) if (asset.Type == 0)
{ {
//Console.WriteLine("which is a texture"); if(Textures.ContainsKey(asset.FullID))
if (!Textures.ContainsKey(asset.FullID)) {
result = "Duplicate ignored.";
}
else
{ {
//texture
TextureImage textur = new TextureImage(asset); TextureImage textur = new TextureImage(asset);
Textures.Add(textur.FullID, textur); Textures.Add(textur.FullID, textur);
if (!asset.Temporary) if (asset.Temporary)
_assetServer.StoreAndCommitAsset(asset); {
result = "Added to cache";
} }
else else
{ {
TextureImage textur = new TextureImage(asset); m_assetServer.StoreAndCommitAsset(asset);
Textures[asset.FullID] = textur; result = "Added to server";
}
} }
} }
else else
{ {
if (!Assets.ContainsKey(asset.FullID)) if (Assets.ContainsKey(asset.FullID))
{
result = "Duplicate ignored.";
}
else
{ {
AssetInfo assetInf = new AssetInfo(asset); AssetInfo assetInf = new AssetInfo(asset);
Assets.Add(assetInf.FullID, assetInf); Assets.Add(assetInf.FullID, assetInf);
if (!asset.Temporary) if (asset.Temporary)
_assetServer.StoreAndCommitAsset(asset); {
result = "Added to cache";
}
else
{
m_assetServer.StoreAndCommitAsset(asset);
result = "Added to server";
} }
} }
} }
m_log.Verbose("ASSETCACHE", "Adding {0} {1} [{2}]: {3}.", temporary, type, asset.FullID, result);
}
public void DeleteAsset(LLUUID assetID) public void DeleteAsset(LLUUID assetID)
{ {
// this._assetServer.DeleteAsset(assetID); // this.m_assetServer.DeleteAsset(assetID);
//Todo should delete it from memory too //Todo should delete it from memory too
} }
@ -238,7 +262,7 @@ namespace OpenSim.Framework.Communications.Cache
TextureSender sender = new TextureSender(req); TextureSender sender = new TextureSender(req);
//sender.OnComplete += this.TextureSent; //sender.OnComplete += this.TextureSent;
SendingTextures.Add(req.ImageInfo.FullID, sender); SendingTextures.Add(req.ImageInfo.FullID, sender);
QueueTextures.Enqueue(sender); m_queueTextures.Enqueue(sender);
} }
} }
@ -249,7 +273,7 @@ namespace OpenSim.Framework.Communications.Cache
{ {
while (true) while (true)
{ {
TextureSender sender = QueueTextures.Dequeue(); TextureSender sender = m_queueTextures.Dequeue();
bool finished = sender.SendTexture(); bool finished = sender.SendTexture();
if (finished) if (finished)
@ -259,7 +283,7 @@ namespace OpenSim.Framework.Communications.Cache
else else
{ {
// Console.WriteLine("readding texture"); // Console.WriteLine("readding texture");
QueueTextures.Enqueue(sender); m_queueTextures.Enqueue(sender);
} }
} }
} }
@ -273,7 +297,7 @@ namespace OpenSim.Framework.Communications.Cache
if (SendingTextures.ContainsKey(sender.request.ImageInfo.FullID)) if (SendingTextures.ContainsKey(sender.request.ImageInfo.FullID))
{ {
SendingTextures.Remove(sender.request.ImageInfo.FullID); SendingTextures.Remove(sender.request.ImageInfo.FullID);
// this.AvatarRecievedTextures[sender.request.RequestUser.AgentId].Add(sender.request.ImageInfo.FullID); // this.m_avatarReceivedTextures[sender.request.RequestUser.AgentId].Add(sender.request.ImageInfo.FullID);
} }
} }
@ -409,7 +433,7 @@ namespace OpenSim.Framework.Communications.Cache
request.AssetRequestSource = source; request.AssetRequestSource = source;
request.Params = transferRequest.TransferInfo.Params; request.Params = transferRequest.TransferInfo.Params;
RequestedAssets.Add(requestID, request); RequestedAssets.Add(requestID, request);
_assetServer.RequestAsset(requestID, false); m_assetServer.RequestAsset(requestID, false);
} }
return; return;
} }
@ -555,11 +579,11 @@ namespace OpenSim.Framework.Communications.Cache
{ {
// System.Console.WriteLine("texture request for " + imageID.ToStringHyphenated() + " packetnumber= " + packetNumber); // System.Console.WriteLine("texture request for " + imageID.ToStringHyphenated() + " packetnumber= " + packetNumber);
//check to see if texture is in local cache, if not request from asset server //check to see if texture is in local cache, if not request from asset server
if (!AvatarRecievedTextures.ContainsKey(userInfo.AgentId)) if (!m_avatarReceivedTextures.ContainsKey(userInfo.AgentId))
{ {
AvatarRecievedTextures.Add(userInfo.AgentId, new List<LLUUID>()); m_avatarReceivedTextures.Add(userInfo.AgentId, new List<LLUUID>());
} }
/* if(this.AvatarRecievedTextures[userInfo.AgentId].Contains(imageID)) /* if(this.m_avatarReceivedTextures[userInfo.AgentId].Contains(imageID))
{ {
//Console.WriteLine(userInfo.AgentId +" is requesting a image( "+ imageID+" that has already been sent to them"); //Console.WriteLine(userInfo.AgentId +" is requesting a image( "+ imageID+" that has already been sent to them");
return; return;
@ -576,7 +600,7 @@ namespace OpenSim.Framework.Communications.Cache
request.IsTextureRequest = true; request.IsTextureRequest = true;
request.DiscardLevel = discard; request.DiscardLevel = discard;
RequestedTextures.Add(imageID, request); RequestedTextures.Add(imageID, request);
_assetServer.RequestAsset(imageID, true); m_assetServer.RequestAsset(imageID, true);
} }
return; return;
} }

View File

@ -23,7 +23,7 @@ namespace OpenSim.Framework.Communications.Cache
public void LoadDefaultAssets() public void LoadDefaultAssets()
{ {
MainLog.Instance.Verbose("SQL ASSET SERVER", "Setting up asset database"); MainLog.Instance.Verbose("ASSETSERVER", "Setting up asset database");
ForEachDefaultAsset(StoreAsset); ForEachDefaultAsset(StoreAsset);
ForEachXmlAsset(StoreAsset); ForEachXmlAsset(StoreAsset);
@ -106,24 +106,6 @@ namespace OpenSim.Framework.Communications.Cache
public virtual List<AssetBase> GetDefaultAssets() public virtual List<AssetBase> GetDefaultAssets()
{ {
List<AssetBase> assets = new List<AssetBase>(); List<AssetBase> assets = new List<AssetBase>();
// These assets have been moved into the OpenSimAssetSet.XML file
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000001", "Bricks", "bricks.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000002", "Plywood", "plywood.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000003", "Rocks", "rocks.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000004", "Granite", "granite.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000005", "Hardwood", "hardwood.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-5005-000000000005", "Prim Base Texture", "plywood.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000006", "Map Base Texture", "map_base.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000007", "Map Texture", "map1.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000010", "Female Body Texture", "femalebody.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000011", "Female Bottom Texture", "femalebottom.jp2"));
//assets.Add(CreateImageAsset("00000000-0000-1111-9999-000000000012", "Female Face Texture", "femaleface.jp2"));
//assets.Add(CreateAsset("77c41e39-38f9-f75a-024e-585989bbabbb", "Skin", "base_skin.dat", false));
//assets.Add(CreateAsset("66c41e39-38f9-f75a-024e-585989bfab73", "Shape", "base_shape.dat", false));
//assets.Add(CreateAsset("00000000-38f9-1111-024e-222222111110", "Shirt", "newshirt.dat", false));
//assets.Add(CreateAsset("00000000-38f9-1111-024e-222222111120", "Shirt", "newpants.dat", false));
return assets; return assets;
} }

View File

@ -58,24 +58,25 @@ namespace OpenSim.Region.Capabilities
//private string m_requestTexture = "0003/"; //private string m_requestTexture = "0003/";
private string m_notecardUpdatePath = "0004/"; private string m_notecardUpdatePath = "0004/";
//private string eventQueue = "0100/"; //private string eventQueue = "0100/";
private BaseHttpServer httpListener; private BaseHttpServer m_httpListener;
private LLUUID agentID; private LLUUID m_agentID;
private AssetCache assetCache; private AssetCache m_assetCache;
private int eventQueueCount = 1; private int m_eventQueueCount = 1;
private Queue<string> CapsEventQueue = new Queue<string>(); private Queue<string> m_capsEventQueue = new Queue<string>();
public NewInventoryItem AddNewInventoryItem = null;
public ItemUpdatedCallback ItemUpdatedCall = null;
private bool m_dumpAssetsToFile; private bool m_dumpAssetsToFile;
public Caps(AssetCache assetCach, BaseHttpServer httpServer, string httpListen, int httpPort, string capsPath, public NewInventoryItem AddNewInventoryItem = null;
public ItemUpdatedCallback ItemUpdatedCall = null;
public Caps(AssetCache assetCache, BaseHttpServer httpServer, string httpListen, int httpPort, string capsPath,
LLUUID agent, bool dumpAssetsToFile) LLUUID agent, bool dumpAssetsToFile)
{ {
assetCache = assetCach; m_assetCache = assetCache;
m_capsObjectPath = capsPath; m_capsObjectPath = capsPath;
httpListener = httpServer; m_httpListener = httpServer;
m_httpListenerHostName = httpListen; m_httpListenerHostName = httpListen;
m_httpListenPort = httpPort; m_httpListenPort = httpPort;
agentID = agent; m_agentID = agent;
m_dumpAssetsToFile = dumpAssetsToFile; m_dumpAssetsToFile = dumpAssetsToFile;
} }
@ -88,17 +89,17 @@ namespace OpenSim.Region.Capabilities
string capsBase = "/CAPS/" + m_capsObjectPath; string capsBase = "/CAPS/" + m_capsObjectPath;
try try
{ {
httpListener.AddStreamHandler( m_httpListener.AddStreamHandler(
new LLSDStreamhandler<LLSDMapRequest, LLSDMapLayerResponse>("POST", capsBase + m_mapLayerPath, new LLSDStreamhandler<LLSDMapRequest, LLSDMapLayerResponse>("POST", capsBase + m_mapLayerPath,
GetMapLayer)); GetMapLayer));
httpListener.AddStreamHandler( m_httpListener.AddStreamHandler(
new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>("POST", new LLSDStreamhandler<LLSDAssetUploadRequest, LLSDAssetUploadResponse>("POST",
capsBase + m_newInventory, capsBase + m_newInventory,
NewAgentInventoryRequest)); NewAgentInventoryRequest));
AddLegacyCapsHandler(httpListener, m_requestPath, CapsRequest); AddLegacyCapsHandler(m_httpListener, m_requestPath, CapsRequest);
//AddLegacyCapsHandler(httpListener, m_requestTexture , RequestTexture); //AddLegacyCapsHandler(m_httpListener, m_requestTexture , RequestTexture);
AddLegacyCapsHandler(httpListener, m_notecardUpdatePath, NoteCardAgentInventory); AddLegacyCapsHandler(m_httpListener, m_notecardUpdatePath, NoteCardAgentInventory);
} }
catch catch
{ {
@ -198,11 +199,11 @@ namespace OpenSim.Region.Capabilities
{ {
string res = ""; string res = "";
if (CapsEventQueue.Count > 0) if (m_capsEventQueue.Count > 0)
{ {
lock (CapsEventQueue) lock (m_capsEventQueue)
{ {
string item = CapsEventQueue.Dequeue(); string item = m_capsEventQueue.Dequeue();
res = item; res = item;
} }
} }
@ -222,13 +223,13 @@ namespace OpenSim.Region.Capabilities
public string CreateEstablishAgentComms(string caps, string ipAddressPort) public string CreateEstablishAgentComms(string caps, string ipAddressPort)
{ {
LLSDCapEvent eventItem = new LLSDCapEvent(); LLSDCapEvent eventItem = new LLSDCapEvent();
eventItem.id = eventQueueCount; eventItem.id = m_eventQueueCount;
//should be creating a EstablishAgentComms item, but there isn't a class for it yet //should be creating a EstablishAgentComms item, but there isn't a class for it yet
eventItem.events.Array.Add(new LLSDEmpty()); eventItem.events.Array.Add(new LLSDEmpty());
string res = LLSDHelpers.SerialiseLLSDReply(eventItem); string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
eventQueueCount++; m_eventQueueCount++;
CapsEventQueue.Enqueue(res); m_capsEventQueue.Enqueue(res);
return res; return res;
} }
@ -239,10 +240,10 @@ namespace OpenSim.Region.Capabilities
public string CreateEmptyEventResponse() public string CreateEmptyEventResponse()
{ {
LLSDCapEvent eventItem = new LLSDCapEvent(); LLSDCapEvent eventItem = new LLSDCapEvent();
eventItem.id = eventQueueCount; eventItem.id = m_eventQueueCount;
eventItem.events.Array.Add(new LLSDEmpty()); eventItem.events.Array.Add(new LLSDEmpty());
string res = LLSDHelpers.SerialiseLLSDReply(eventItem); string res = LLSDHelpers.SerialiseLLSDReply(eventItem);
eventQueueCount++; m_eventQueueCount++;
return res; return res;
} }
@ -266,10 +267,10 @@ namespace OpenSim.Region.Capabilities
string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000"); string uploaderPath = Util.RandomClass.Next(5000, 8000).ToString("0000");
ItemUpdater uploader = ItemUpdater uploader =
new ItemUpdater(newInvItem, capsBase + uploaderPath, httpListener, m_dumpAssetsToFile); new ItemUpdater(newInvItem, capsBase + uploaderPath, m_httpListener, m_dumpAssetsToFile);
uploader.OnUpLoad += ItemUpdated; uploader.OnUpLoad += ItemUpdated;
httpListener.AddStreamHandler( m_httpListener.AddStreamHandler(
new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase + string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase +
uploaderPath; uploaderPath;
@ -300,8 +301,8 @@ namespace OpenSim.Region.Capabilities
AssetUploader uploader = AssetUploader uploader =
new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type, new AssetUploader(assetName, assetDes, newAsset, newInvItem, parentFolder, llsdRequest.inventory_type,
llsdRequest.asset_type, capsBase + uploaderPath, httpListener, m_dumpAssetsToFile); llsdRequest.asset_type, capsBase + uploaderPath, m_httpListener, m_dumpAssetsToFile);
httpListener.AddStreamHandler( m_httpListener.AddStreamHandler(
new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps)); new BinaryStreamHandler("POST", capsBase + uploaderPath, uploader.uploaderCaps));
string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase + string uploaderURL = "http://" + m_httpListenerHostName + ":" + m_httpListenPort.ToString() + capsBase +
uploaderPath; uploaderPath;
@ -344,11 +345,11 @@ namespace OpenSim.Region.Capabilities
asset.InvType = inType; asset.InvType = inType;
asset.Name = assetName; asset.Name = assetName;
asset.Data = data; asset.Data = data;
assetCache.AddAsset(asset); m_assetCache.AddAsset(asset);
InventoryItemBase item = new InventoryItemBase(); InventoryItemBase item = new InventoryItemBase();
item.avatarID = agentID; item.avatarID = m_agentID;
item.creatorsID = agentID; item.creatorsID = m_agentID;
item.inventoryID = inventoryItem; item.inventoryID = inventoryItem;
item.assetID = asset.FullID; item.assetID = asset.FullID;
item.inventoryDescription = assetDescription; item.inventoryDescription = assetDescription;
@ -361,7 +362,7 @@ namespace OpenSim.Region.Capabilities
if (AddNewInventoryItem != null) if (AddNewInventoryItem != null)
{ {
AddNewInventoryItem(agentID, item); AddNewInventoryItem(m_agentID, item);
} }
} }
@ -369,7 +370,7 @@ namespace OpenSim.Region.Capabilities
{ {
if (ItemUpdatedCall != null) if (ItemUpdatedCall != null)
{ {
return ItemUpdatedCall(agentID, itemID, data); return ItemUpdatedCall(m_agentID, itemID, data);
} }
return LLUUID.Zero; return LLUUID.Zero;
} }

View File

@ -386,7 +386,7 @@ namespace OpenSim
assetServer = sqlAssetServer; assetServer = sqlAssetServer;
} }
m_assetCache = new AssetCache(assetServer); m_assetCache = new AssetCache(assetServer, m_log);
// m_assetCache = new assetCache("OpenSim.Region.GridInterfaces.Local.dll", m_networkServersInfo.AssetURL, m_networkServersInfo.AssetSendKey); // m_assetCache = new assetCache("OpenSim.Region.GridInterfaces.Local.dll", m_networkServersInfo.AssetURL, m_networkServersInfo.AssetSendKey);
} }

View File

@ -61,7 +61,7 @@ namespace SimpleApp
LocalAssetServer assetServer = new LocalAssetServer(); LocalAssetServer assetServer = new LocalAssetServer();
m_assetCache = new AssetCache(assetServer); m_assetCache = new AssetCache(assetServer, m_log);
} }
public void Run() public void Run()