diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs
index d1ff9c9211..4765548bbe 100644
--- a/OpenSim/Framework/Communications/Cache/AssetCache.cs
+++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs
@@ -156,16 +156,58 @@ namespace OpenSim.Framework.Communications.Cache
}
}
+ ///
+ /// Get an asset. If the asset isn't in the cache, a request will be made to the persistent store to
+ /// load it into the cache.
+ ///
+ /// XXX We'll keep polling the cache until we get the asset or we exceed
+ /// the allowed number of polls. This isn't a very good way of doing things since a single thread
+ /// is processing inbound packets, so if the asset server is slow, we could block this for up to
+ /// the timeout period. What we might want to do is register asynchronous callbacks on asset
+ /// receipt in the same manner as the nascent (but not yet active) TextureDownloadModule. Of course,
+ /// a timeout before asset receipt usually isn't fatal, the operation will work on the retry when the
+ /// asset is much more likely to have made it into the cache.
+ ///
+ ///
+ ///
+ /// null if the asset could not be retrieved
public AssetBase GetAsset(LLUUID assetID, bool isTexture)
{
+ // I'm not going over 3 seconds since this will be blocking processing of all the other inbound
+ // packets from the client.
+ int pollPeriod = 200;
+ int maxPolls = 15;
+
AssetBase asset = GetCachedAsset(assetID);
- if (asset == null)
+ if (asset != null)
{
- m_assetServer.RequestAsset(assetID, isTexture);
+ return asset;
}
- return asset;
+
+ m_assetServer.RequestAsset(assetID, isTexture);
+
+ do
+ {
+ Thread.Sleep(pollPeriod);
+
+ asset = GetCachedAsset(assetID);
+ if (asset != null)
+ {
+ return asset;
+ }
+ }
+ while (--maxPolls > 0);
+
+ MainLog.Instance.Warn(
+ "ASSETCACHE", "Asset {0} was not received before the retrieval timeout was reached");
+
+ return null;
}
+ ///
+ /// Add an asset to both the persistent store and the cache.
+ ///
+ ///
public void AddAsset(AssetBase asset)
{
string temporary = asset.Temporary ? "temporary" : "";
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs
index 8ba161a587..18ecd92b71 100644
--- a/OpenSim/Framework/IClientAPI.cs
+++ b/OpenSim/Framework/IClientAPI.cs
@@ -473,8 +473,6 @@ namespace OpenSim.Framework
event RegionInfoRequest OnRegionInfoRequest;
event EstateCovenantRequest OnEstateCovenantRequest;
-
-
LLVector3 StartPos { get; set; }
LLUUID AgentId { get; }
@@ -486,6 +484,13 @@ namespace OpenSim.Framework
string FirstName { get; }
string LastName { get; }
+
+ ///
+ /// Returns the full name of the agent/avatar represented by this client
+ ///
+ ///
+ ///
+ string Name { get; }
uint CircuitCode { get; }
diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs
index 34a9b094e2..9e695eab55 100644
--- a/OpenSim/Region/ClientStack/ClientView.cs
+++ b/OpenSim/Region/ClientStack/ClientView.cs
@@ -130,7 +130,7 @@ namespace OpenSim.Region.ClientStack
}
///
- ///
+ /// First name of the agent/avatar represented by the client
///
public string FirstName
{
@@ -138,12 +138,20 @@ namespace OpenSim.Region.ClientStack
}
///
- ///
+ /// Last name of the agent/avatar represented by the client
///
public string LastName
{
get { return m_lastName; }
}
+
+ ///
+ /// Full name of the client (first name and last name)
+ ///
+ public string Name
+ {
+ get { return FirstName + " " + LastName; }
+ }
public uint CircuitCode
{
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index efd96d2e01..2d0ffd80ba 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -429,16 +429,15 @@ namespace OpenSim.Region.Environment.Scenes
//group.AddInventoryItem(rmoteClient, primLocalID, null);
MainLog.Instance.Verbose(
"PRIMINVENTORY",
- "UpdateTaskInventory called with item {0}, folder {1}, primLocalID {2}",
- itemID, folderID, primLocalID);
+ "UpdateTaskInventory called with script {0}, folder {1}, primLocalID {2}, user {3}",
+ itemID, folderID, primLocalID, remoteClient.Name);
}
else
{
MainLog.Instance.Warn(
"PRIMINVENTORY",
- "Update with item {0} requested of prim {1} but this prim does not exist",
- itemID,
- primLocalID);
+ "Update with script {0} requested of prim {1} for {2} but this prim does not exist",
+ itemID, primLocalID, remoteClient.Name);
}
}
@@ -465,14 +464,9 @@ namespace OpenSim.Region.Environment.Scenes
{
isTexture = true;
}
+
AssetBase rezAsset = AssetCache.GetAsset(item.assetID, isTexture);
- if (rezAsset == null)
- {
- // lets try once more in case the asset cache is being slow getting the asset from server
- rezAsset = AssetCache.GetAsset(item.assetID, isTexture);
- }
-
if (rezAsset != null)
{
string script = Util.FieldToString(rezAsset.Data);
@@ -489,32 +483,35 @@ namespace OpenSim.Region.Environment.Scenes
// TODO: do we care about the value of this bool?
group.AddInventoryItem(remoteClient, localID, item, copyID);
group.GetProperites(remoteClient);
+
+ MainLog.Instance.Verbose(
+ "PRIMINVENTORY",
+ "Rezzed script {0} (asset {1}) into prim {2} for user {3}",
+ item.inventoryName, rezAsset.FullID, localID, remoteClient.Name);
}
else
{
MainLog.Instance.Warn(
"PRIMINVENTORY",
- "Could not rez item {0} into prim {1}"
+ "Could not rez script {0} into prim {1} for user {2}"
+ " because the prim could not be found in the region!",
- item.inventoryName,
- localID);
+ item.inventoryName, localID, remoteClient.Name);
}
}
else
{
MainLog.Instance.Warn(
"PRIMINVENTORY",
- "Could not rez item {0} into prim {1}"
- + " because the item asset {2} could not be found!",
- item.inventoryName,
- localID,
- item.assetID);
+ "Could not rez script {0} into prim {1} for user {2}"
+ + " because the item asset {3} could not be found!",
+ item.inventoryName, localID, item.assetID, remoteClient.Name);
}
}
else
{
MainLog.Instance.Warn(
- "PRIMINVENTORY", "Could not find script inventory item {0} to rez!", itemID);
+ "PRIMINVENTORY", "Could not find script inventory item {0} to rez for {1}!",
+ itemID, remoteClient.Name);
}
}
}
@@ -625,12 +622,6 @@ namespace OpenSim.Region.Environment.Scenes
{
AssetBase rezAsset = AssetCache.GetAsset(item.assetID, false);
- if (rezAsset == null)
- {
- // lets try once more in case the asset cache is being slow getting the asset from server
- rezAsset = AssetCache.GetAsset(item.assetID, false);
- }
-
if (rezAsset != null)
{
AddRezObject(Util.FieldToString(rezAsset.Data), pos);
diff --git a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
index b31784e46e..ec93362c62 100644
--- a/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
+++ b/OpenSim/Region/Examples/SimpleApp/MyNpcCharacter.cs
@@ -185,6 +185,11 @@ namespace SimpleApp
{
get { return lastName; }
}
+
+ public virtual String Name
+ {
+ get { return FirstName + LastName; }
+ }
public virtual void OutPacket(Packet newPack, ThrottleOutPacketType packType)
@@ -394,8 +399,6 @@ namespace SimpleApp
private void Update()
{
- Encoding enc = Encoding.ASCII;
-
if (OnAgentUpdate != null)
{
AgentUpdatePacket pack = new AgentUpdatePacket();