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();