* re-enabled AssetNotFound code

* turned script asset fetching asynchronous
ThreadPoolClientBranch
lbsa71 2008-02-20 13:11:19 +00:00
parent 4c2e304ce6
commit 4c6e5a5090
2 changed files with 95 additions and 91 deletions

View File

@ -457,21 +457,22 @@ namespace OpenSim.Framework.Communications.Cache
public void AssetNotFound(LLUUID assetID) public void AssetNotFound(LLUUID assetID)
{ {
m_log.ErrorFormat("[ASSET CACHE]: Unhandled AssetNotFound for {0}", assetID); //m_log.ErrorFormat("[ASSET CACHE]: Unhandled AssetNotFound for {0}", assetID);
//if (this.RequestedTextures.ContainsKey(assetID)) AssetRequest req;
//{
// m_log.WarnFormat("[ASSET CACHE]: sending image not found for {0}", assetID); if (RequestedTextures.TryGetValue(assetID, out req))
// AssetRequest req = this.RequestedTextures[assetID]; {
// ImageNotInDatabasePacket notFound = new ImageNotInDatabasePacket(); m_log.WarnFormat("[ASSET CACHE]: sending image not found for {0}", assetID);
// notFound.ImageID.ID = assetID; ImageNotInDatabasePacket notFound = new ImageNotInDatabasePacket();
// req.RequestUser.OutPacket(notFound); notFound.ImageID.ID = assetID;
// this.RequestedTextures.Remove(assetID); req.RequestUser.OutPacket(notFound, ThrottleOutPacketType.Unknown);
//} RequestedTextures.Remove(assetID);
//else }
//{ else
// m_log.ErrorFormat("[ASSET CACHE]: Cound not send image not found for {0}", assetID); {
//} m_log.ErrorFormat("[ASSET CACHE]: Asset [{0}] not found, but couldn't find any users to send to ", assetID);
}
} }
private int CalculateNumPackets(byte[] data) private int CalculateNumPackets(byte[] data)

View File

@ -33,6 +33,7 @@ using System.Xml.Serialization;
using libsecondlife; using libsecondlife;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Region.Environment.Scenes.Scripting;
@ -44,12 +45,12 @@ namespace OpenSim.Region.Environment.Scenes
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private string m_inventoryFileName = String.Empty; private string m_inventoryFileName = String.Empty;
/// <summary> /// <summary>
/// The inventory folder for this prim /// The inventory folder for this prim
/// </summary> /// </summary>
private LLUUID m_folderID = LLUUID.Zero; private LLUUID m_folderID = LLUUID.Zero;
/// <summary> /// <summary>
/// Exposing this is not particularly good, but it's one of the least evils at the moment to see /// Exposing this is not particularly good, but it's one of the least evils at the moment to see
/// folder id from prim inventory item data, since it's not (yet) actually stored with the prim. /// folder id from prim inventory item data, since it's not (yet) actually stored with the prim.
@ -58,8 +59,8 @@ namespace OpenSim.Region.Environment.Scenes
{ {
get { return m_folderID; } get { return m_folderID; }
set { m_folderID = value; } set { m_folderID = value; }
} }
/// <summary> /// <summary>
/// Serial count for inventory file , used to tell if inventory has changed /// Serial count for inventory file , used to tell if inventory has changed
/// no need for this to be part of Database backup /// no need for this to be part of Database backup
@ -70,24 +71,24 @@ namespace OpenSim.Region.Environment.Scenes
{ {
get { return m_inventorySerial; } get { return m_inventorySerial; }
set { m_inventorySerial = value; } set { m_inventorySerial = value; }
} }
/// <summary> /// <summary>
/// Holds in memory prim inventory /// Holds in memory prim inventory
/// </summary> /// </summary>
protected TaskInventoryDictionary m_taskInventory = new TaskInventoryDictionary(); protected TaskInventoryDictionary m_taskInventory = new TaskInventoryDictionary();
public TaskInventoryDictionary TaskInventory public TaskInventoryDictionary TaskInventory
{ {
get { return m_taskInventory; } get { return m_taskInventory; }
set { m_taskInventory = value; } set { m_taskInventory = value; }
} }
/// <summary> /// <summary>
/// Tracks whether inventory has changed since the last persistent backup /// Tracks whether inventory has changed since the last persistent backup
/// </summary> /// </summary>
private bool HasInventoryChanged; private bool HasInventoryChanged;
/// <summary> /// <summary>
/// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating /// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating
/// new ones or setting existing UUIDs to the correct parent UUIDs /// new ones or setting existing UUIDs to the correct parent UUIDs
@ -96,18 +97,18 @@ namespace OpenSim.Region.Environment.Scenes
public void ResetInventoryIDs() public void ResetInventoryIDs()
{ {
lock (TaskInventory) lock (TaskInventory)
{ {
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values); IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values);
TaskInventory.Clear(); TaskInventory.Clear();
foreach (TaskInventoryItem item in items) foreach (TaskInventoryItem item in items)
{ {
item.ResetIDs(UUID); item.ResetIDs(UUID);
TaskInventory.Add(item.ItemID, item); TaskInventory.Add(item.ItemID, item);
} }
} }
} }
/// <summary> /// <summary>
/// Start all the scripts contained in this prim's inventory /// Start all the scripts contained in this prim's inventory
/// </summary> /// </summary>
@ -139,7 +140,7 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
} }
/// <summary> /// <summary>
/// Start a script which is in this prim's inventory. /// Start a script which is in this prim's inventory.
/// </summary> /// </summary>
@ -147,34 +148,36 @@ namespace OpenSim.Region.Environment.Scenes
/// <returns></returns> /// <returns></returns>
public void StartScript(TaskInventoryItem item) public void StartScript(TaskInventoryItem item)
{ {
// m_log.InfoFormat( // m_log.InfoFormat(
// "[PRIMINVENTORY]: " + // "[PRIMINVENTORY]: " +
// "Starting script {0}, {1} in prim {2}, {3}", // "Starting script {0}, {1} in prim {2}, {3}",
// item.Name, item.ItemID, Name, UUID); // item.Name, item.ItemID, Name, UUID);
AddFlag(LLObject.ObjectFlags.Scripted); AddFlag(LLObject.ObjectFlags.Scripted);
if (!((m_parentGroup.Scene.RegionInfo.EstateSettings.regionFlags & Simulator.RegionFlags.SkipScripts) == Simulator.RegionFlags.SkipScripts)) if (!((m_parentGroup.Scene.RegionInfo.EstateSettings.regionFlags & Simulator.RegionFlags.SkipScripts) == Simulator.RegionFlags.SkipScripts))
{ {
AssetBase rezAsset = m_parentGroup.Scene.AssetCache.GetAsset(item.AssetID, false); AssetCache cache = m_parentGroup.Scene.AssetCache;
if (rezAsset != null) cache.GetAsset(item.AssetID, delegate(LLUUID assetID, AssetBase asset)
{ {
if (asset.FullID == LLUUID.Zero)
string script = Helpers.FieldToUTF8String(rezAsset.Data); {
m_parentGroup.Scene.EventManager.TriggerRezScript(LocalID, item.ItemID, script); m_log.ErrorFormat(
m_parentGroup.AddActiveScriptCount(1); "[PRIMINVENTORY]: " +
} "Couldn't start script {0}, {1} since asset ID {2} could not be found",
else item.Name, item.ItemID, item.AssetID);
{ }
m_log.ErrorFormat( else
"[PRIMINVENTORY]: " + {
"Couldn't start script {0}, {1} since asset ID {2} could not be found", string script = Helpers.FieldToUTF8String(asset.Data);
item.Name, item.ItemID, item.AssetID); m_parentGroup.Scene.EventManager.TriggerRezScript(LocalID,item.ItemID,script);
} m_parentGroup.AddActiveScriptCount(1);
ScheduleFullUpdate();
}
});
} }
ScheduleFullUpdate(); }
}
/// <summary> /// <summary>
/// Start a script which is in this prim's inventory. /// Start a script which is in this prim's inventory.
/// </summary> /// </summary>
@ -184,22 +187,22 @@ namespace OpenSim.Region.Environment.Scenes
public void StartScript(LLUUID itemId) public void StartScript(LLUUID itemId)
{ {
lock (m_taskInventory) lock (m_taskInventory)
{ {
if (m_taskInventory.ContainsKey(itemId)) if (m_taskInventory.ContainsKey(itemId))
{ {
StartScript(m_taskInventory[itemId]); StartScript(m_taskInventory[itemId]);
} }
else else
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[PRIMINVENTORY]: " + "[PRIMINVENTORY]: " +
"Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}", "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
itemId, Name, UUID); itemId, Name, UUID);
} }
} }
} }
/// <summary> /// <summary>
/// Stop a script which is in this prim's inventory. /// Stop a script which is in this prim's inventory.
/// </summary> /// </summary>
@ -210,15 +213,15 @@ namespace OpenSim.Region.Environment.Scenes
{ {
m_parentGroup.Scene.EventManager.TriggerRemoveScript(LocalID, itemId); m_parentGroup.Scene.EventManager.TriggerRemoveScript(LocalID, itemId);
m_parentGroup.AddActiveScriptCount(-1); m_parentGroup.AddActiveScriptCount(-1);
} }
else else
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[PRIMINVENTORY]: " + "[PRIMINVENTORY]: " +
"Couldn't stop script with ID {0} since it couldn't be found for prim {1}, {2}", "Couldn't stop script with ID {0} since it couldn't be found for prim {1}, {2}",
itemId, Name, UUID); itemId, Name, UUID);
} }
} }
/// <summary> /// <summary>
/// Add an item to this prim's inventory. /// Add an item to this prim's inventory.
@ -229,17 +232,17 @@ namespace OpenSim.Region.Environment.Scenes
item.ParentID = m_folderID; item.ParentID = m_folderID;
item.CreationDate = 1000; item.CreationDate = 1000;
item.ParentPartID = UUID; item.ParentPartID = UUID;
lock (m_taskInventory) lock (m_taskInventory)
{ {
m_taskInventory.Add(item.ItemID, item); m_taskInventory.Add(item.ItemID, item);
TriggerScriptChangedEvent(Changed.INVENTORY); TriggerScriptChangedEvent(Changed.INVENTORY);
} }
m_inventorySerial++; m_inventorySerial++;
HasInventoryChanged = true; HasInventoryChanged = true;
} }
/// <summary> /// <summary>
/// Restore a whole collection of items to the prim's inventory at once. /// Restore a whole collection of items to the prim's inventory at once.
/// We assume that the items already have all their fields correctly filled out. /// We assume that the items already have all their fields correctly filled out.
@ -250,17 +253,17 @@ namespace OpenSim.Region.Environment.Scenes
public void RestoreInventoryItems(ICollection<TaskInventoryItem> items) public void RestoreInventoryItems(ICollection<TaskInventoryItem> items)
{ {
lock (m_taskInventory) lock (m_taskInventory)
{ {
foreach (TaskInventoryItem item in items) foreach (TaskInventoryItem item in items)
{ {
m_taskInventory.Add(item.ItemID, item); m_taskInventory.Add(item.ItemID, item);
TriggerScriptChangedEvent(Changed.INVENTORY); TriggerScriptChangedEvent(Changed.INVENTORY);
} }
} }
m_inventorySerial++; m_inventorySerial++;
} }
/// <summary> /// <summary>
/// Returns an existing inventory item. Returns the original, so any changes will be live. /// Returns an existing inventory item. Returns the original, so any changes will be live.
/// </summary> /// </summary>
@ -269,7 +272,7 @@ namespace OpenSim.Region.Environment.Scenes
public TaskInventoryItem GetInventoryItem(LLUUID itemID) public TaskInventoryItem GetInventoryItem(LLUUID itemID)
{ {
lock (m_taskInventory) lock (m_taskInventory)
{ {
if (m_taskInventory.ContainsKey(itemID)) if (m_taskInventory.ContainsKey(itemID))
{ {
return m_taskInventory[itemID]; return m_taskInventory[itemID];
@ -295,15 +298,15 @@ namespace OpenSim.Region.Environment.Scenes
public bool UpdateInventoryItem(TaskInventoryItem item) public bool UpdateInventoryItem(TaskInventoryItem item)
{ {
lock (m_taskInventory) lock (m_taskInventory)
{ {
if (m_taskInventory.ContainsKey(item.ItemID)) if (m_taskInventory.ContainsKey(item.ItemID))
{ {
m_taskInventory[item.ItemID] = item; m_taskInventory[item.ItemID] = item;
m_inventorySerial++; m_inventorySerial++;
TriggerScriptChangedEvent(Changed.INVENTORY); TriggerScriptChangedEvent(Changed.INVENTORY);
HasInventoryChanged = true; HasInventoryChanged = true;
return true; return true;
} }
else else
@ -312,9 +315,9 @@ namespace OpenSim.Region.Environment.Scenes
"[PRIMINVENTORY]: " + "[PRIMINVENTORY]: " +
"Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory", "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
item.ItemID, Name, UUID); item.ItemID, Name, UUID);
} }
} }
return false; return false;
} }
@ -332,14 +335,14 @@ namespace OpenSim.Region.Environment.Scenes
public int RemoveInventoryItem(LLUUID itemID) public int RemoveInventoryItem(LLUUID itemID)
{ {
lock (m_taskInventory) lock (m_taskInventory)
{ {
if (m_taskInventory.ContainsKey(itemID)) if (m_taskInventory.ContainsKey(itemID))
{ {
int type = m_taskInventory[itemID].InvType; int type = m_taskInventory[itemID].InvType;
m_taskInventory.Remove(itemID); m_taskInventory.Remove(itemID);
m_inventorySerial++; m_inventorySerial++;
TriggerScriptChangedEvent(Changed.INVENTORY); TriggerScriptChangedEvent(Changed.INVENTORY);
HasInventoryChanged = true; HasInventoryChanged = true;
int scriptcount = 0; int scriptcount = 0;
@ -359,7 +362,7 @@ namespace OpenSim.Region.Environment.Scenes
RemFlag(LLObject.ObjectFlags.Scripted); RemFlag(LLObject.ObjectFlags.Scripted);
ScheduleFullUpdate(); ScheduleFullUpdate();
} }
ScheduleFullUpdate(); ScheduleFullUpdate();
return type; return type;
} }
@ -369,7 +372,7 @@ namespace OpenSim.Region.Environment.Scenes
"[PRIMINVENTORY]: " + "[PRIMINVENTORY]: " +
"Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory", "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
itemID, Name, UUID); itemID, Name, UUID);
} }
} }
return -1; return -1;
@ -384,7 +387,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (m_inventorySerial > 0) if (m_inventorySerial > 0)
{ {
client.SendTaskInventory(m_uuid, (short) m_inventorySerial, client.SendTaskInventory(m_uuid, (short)m_inventorySerial,
Helpers.StringToField(m_inventoryFileName)); Helpers.StringToField(m_inventoryFileName));
return true; return true;
} }
@ -399,15 +402,15 @@ namespace OpenSim.Region.Environment.Scenes
{ {
byte[] fileData = new byte[0]; byte[] fileData = new byte[0];
InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, UUID); InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, UUID);
lock (m_taskInventory) lock (m_taskInventory)
{ {
foreach (TaskInventoryItem item in m_taskInventory.Values) foreach (TaskInventoryItem item in m_taskInventory.Values)
{ {
invString.AddItemStart(); invString.AddItemStart();
invString.AddNameValueLine("item_id", item.ItemID.ToString()); invString.AddNameValueLine("item_id", item.ItemID.ToString());
invString.AddNameValueLine("parent_id", item.ParentID.ToString()); invString.AddNameValueLine("parent_id", item.ParentID.ToString());
invString.AddPermissionsStart(); invString.AddPermissionsStart();
invString.AddNameValueLine("base_mask", "0x7FFFFFFF"); invString.AddNameValueLine("base_mask", "0x7FFFFFFF");
invString.AddNameValueLine("owner_mask", "0x7FFFFFFF"); invString.AddNameValueLine("owner_mask", "0x7FFFFFFF");
@ -419,7 +422,7 @@ namespace OpenSim.Region.Environment.Scenes
invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
invString.AddNameValueLine("group_id", item.GroupID.ToString()); invString.AddNameValueLine("group_id", item.GroupID.ToString());
invString.AddSectionEnd(); invString.AddSectionEnd();
invString.AddNameValueLine("asset_id", item.AssetID.ToString()); invString.AddNameValueLine("asset_id", item.AssetID.ToString());
invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
@ -430,18 +433,18 @@ namespace OpenSim.Region.Environment.Scenes
invString.AddSectionEnd(); invString.AddSectionEnd();
} }
} }
fileData = Helpers.StringToField(invString.BuildString); fileData = Helpers.StringToField(invString.BuildString);
// m_log.InfoFormat( // m_log.InfoFormat(
// "[PRIMINVENTORY]: RequestInventoryFile fileData: {0}", Helpers.FieldToUTF8String(fileData)); // "[PRIMINVENTORY]: RequestInventoryFile fileData: {0}", Helpers.FieldToUTF8String(fileData));
if (fileData.Length > 2) if (fileData.Length > 2)
{ {
xferManager.AddNewFile(m_inventoryFileName, fileData); xferManager.AddNewFile(m_inventoryFileName, fileData);
} }
} }
/// <summary> /// <summary>
/// Process inventory backup /// Process inventory backup
/// </summary> /// </summary>
@ -454,10 +457,10 @@ namespace OpenSim.Region.Environment.Scenes
{ {
datastore.StorePrimInventory(UUID, TaskInventory.Values); datastore.StorePrimInventory(UUID, TaskInventory.Values);
} }
HasInventoryChanged = false; HasInventoryChanged = false;
} }
} }
public class InventoryStringBuilder public class InventoryStringBuilder
{ {
@ -505,6 +508,6 @@ namespace OpenSim.Region.Environment.Scenes
public void Close() public void Close()
{ {
} }
} }
} }
} }