diff --git a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
index bbd2c43606..afbe56b093 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs
@@ -45,6 +45,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private const int IMAGE_PACKET_SIZE = 1000;
private const int FIRST_PACKET_SIZE = 600;
+ ///
+ /// If we've requested an asset but not received it in this ticks timeframe, then allow a duplicate
+ /// request from the client to trigger a fresh asset request.
+ ///
+ ///
+ /// There are 10,000 ticks in a millisecond
+ ///
+ private const int ASSET_REQUEST_TIMEOUT = 100000000;
+
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public uint LastSequence;
@@ -57,8 +66,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public UUID AgentID;
public IInventoryAccessModule InventoryAccessModule;
private OpenJPEG.J2KLayerInfo[] m_layers;
+
+ ///
+ /// Has this request decoded the asset data?
+ ///
public bool IsDecoded { get; private set; }
+
+ ///
+ /// Has this request received the required asset data?
+ ///
public bool HasAsset { get; private set; }
+
+ ///
+ /// Time in milliseconds at which the asset was requested.
+ ///
+ public long AssetRequestTime { get; private set; }
+
public C5.IPriorityQueueHandle PriorityQueueHandle;
private uint m_currentPacket;
@@ -123,10 +146,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
if (!HasAsset)
{
- if (!m_assetRequested)
+ if (!m_assetRequested || DateTime.UtcNow.Ticks > AssetRequestTime + ASSET_REQUEST_TIMEOUT)
{
+// m_log.DebugFormat(
+// "[J2KIMAGE]: Requesting asset {0} from request in packet {1}, already requested? {2}, due to timeout? {3}",
+// TextureID, LastSequence, m_assetRequested, DateTime.UtcNow.Ticks > AssetRequestTime + ASSET_REQUEST_TIMEOUT);
+
m_assetRequested = true;
-// m_log.DebugFormat("[J2KIMAGE]: Requesting asset {0}", TextureID);
+ AssetRequestTime = DateTime.UtcNow.Ticks;
+
AssetService.Get(TextureID.ToString(), this, AssetReceived);
}
}
@@ -377,6 +405,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private void AssetReceived(string id, Object sender, AssetBase asset)
{
+// m_log.DebugFormat(
+// "[J2KIMAGE]: Received asset {0} ({1} bytes)", id, asset != null ? asset.Data.Length.ToString() : "n/a");
+
UUID assetID = UUID.Zero;
if (asset != null)
{
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
index 7bfb844b8e..073c357d1a 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs
@@ -55,18 +55,29 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private bool m_shuttingdown;
private AssetBase m_missingImage;
- private IClientAPI m_client; //Client we're assigned to
- private IAssetService m_assetCache; //Asset Cache
- private IJ2KDecoder m_j2kDecodeModule; //Our J2K module
+ private IAssetService m_assetCache;
+ private IJ2KDecoder m_j2kDecodeModule;
+
+ ///
+ /// Priority queue for determining which image to send first.
+ ///
private C5.IntervalHeap m_priorityQueue = new C5.IntervalHeap(10, new J2KImageComparer());
+
+ ///
+ /// Used to control thread access to the priority queue.
+ ///
private object m_syncRoot = new object();
- public IClientAPI Client { get { return m_client; } }
+ ///
+ /// Client served by this image manager
+ ///
+ public IClientAPI Client { get; private set; }
+
public AssetBase MissingImage { get { return m_missingImage; } }
public LLImageManager(IClientAPI client, IAssetService pAssetCache, IJ2KDecoder pJ2kDecodeModule)
{
- m_client = client;
+ Client = client;
m_assetCache = pAssetCache;
if (pAssetCache != null)
@@ -111,8 +122,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// "[LL IMAGE MANAGER]: Received duplicate of existing request for {0}, start packet {1} from {2}",
// newRequest.RequestedAssetID, newRequest.PacketNumber, m_client.Name);
- //m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}",
- // newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority);
+// m_log.DebugFormat("[TEX]: (UPD) ID={0}: D={1}, S={2}, P={3}",
+// newRequest.RequestedAssetID, newRequest.DiscardLevel, newRequest.PacketNumber, newRequest.Priority);
//Check the packet sequence to make sure this isn't older than
//one we've already received
@@ -178,8 +189,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
imgrequest = new J2KImage(this);
imgrequest.J2KDecoder = m_j2kDecodeModule;
imgrequest.AssetService = m_assetCache;
- imgrequest.AgentID = m_client.AgentId;
- imgrequest.InventoryAccessModule = m_client.Scene.RequestModuleInterface();
+ imgrequest.AgentID = Client.AgentId;
+ imgrequest.InventoryAccessModule = Client.Scene.RequestModuleInterface();
imgrequest.DiscardLevel = newRequest.DiscardLevel;
imgrequest.StartPacket = Math.Max(1, newRequest.PacketNumber);
imgrequest.Priority = newRequest.Priority;
@@ -210,7 +221,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (image.IsDecoded)
{
int sent;
- bool imageDone = image.SendPackets(m_client, packetsToSend - packetsSent, out sent);
+ bool imageDone = image.SendPackets(Client, packetsToSend - packetsSent, out sent);
packetsSent += sent;
// If the send is complete, destroy any knowledge of this transfer
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
index bdc9c7d9ea..1b68d68765 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
@@ -45,24 +45,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
[TestFixture]
public class LLImageManagerTests
{
- [Test]
- public void TestRequestAndSendImage()
+ private AssetBase m_testImageAsset;
+ private Scene scene;
+ private LLImageManager llim;
+ private TestClient tc;
+
+ [TestFixtureSetUp]
+ public void FixtureInit()
{
- TestHelpers.InMethod();
-// XmlConfigurator.Configure();
-
- UUID imageId = TestHelpers.ParseTail(0x1);
- string creatorId = TestHelpers.ParseTail(0x2).ToString();
- UUID userId = TestHelpers.ParseTail(0x3);
-
- J2KDecoderModule j2kdm = new J2KDecoderModule();
-
- Scene scene = SceneHelpers.SetupScene();
- SceneHelpers.SetupSceneModules(scene, j2kdm);
-
- TestClient tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene);
- LLImageManager llim = new LLImageManager(tc, scene.AssetService, j2kdm);
-
using (
Stream resource
= GetType().Assembly.GetManifestResourceStream(
@@ -70,14 +60,42 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
{
using (BinaryReader br = new BinaryReader(resource))
{
- AssetBase asset = new AssetBase(imageId, "Test Image", (sbyte)AssetType.Texture, creatorId);
- asset.Data = br.ReadBytes(99999999);
- scene.AssetService.Store(asset);
+ m_testImageAsset
+ = new AssetBase(
+ TestHelpers.ParseTail(0x1),
+ "Test Image",
+ (sbyte)AssetType.Texture,
+ TestHelpers.ParseTail(0x2).ToString());
+
+ m_testImageAsset.Data = br.ReadBytes(99999999);
}
}
+ }
+
+ [SetUp]
+ public void SetUp()
+ {
+ UUID userId = TestHelpers.ParseTail(0x3);
+
+ J2KDecoderModule j2kdm = new J2KDecoderModule();
+
+ scene = SceneHelpers.SetupScene();
+ SceneHelpers.SetupSceneModules(scene, j2kdm);
+
+ tc = new TestClient(SceneHelpers.GenerateAgentData(userId), scene);
+ llim = new LLImageManager(tc, scene.AssetService, j2kdm);
+ }
+
+ [Test]
+ public void TestSendImage()
+ {
+ TestHelpers.InMethod();
+// XmlConfigurator.Configure();
+
+ scene.AssetService.Store(m_testImageAsset);
TextureRequestArgs args = new TextureRequestArgs();
- args.RequestedAssetID = TestHelpers.ParseTail(0x1);
+ args.RequestedAssetID = m_testImageAsset.FullID;
args.DiscardLevel = 0;
args.PacketNumber = 1;
args.Priority = 5;
@@ -88,5 +106,55 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(1));
}
+
+ [Test]
+ public void TestDiscardImage()
+ {
+ TestHelpers.InMethod();
+// XmlConfigurator.Configure();
+
+ scene.AssetService.Store(m_testImageAsset);
+
+ TextureRequestArgs args = new TextureRequestArgs();
+ args.RequestedAssetID = m_testImageAsset.FullID;
+ args.DiscardLevel = 0;
+ args.PacketNumber = 1;
+ args.Priority = 5;
+ args.requestSequence = 1;
+ llim.EnqueueReq(args);
+
+ // Now create a discard request
+ TextureRequestArgs discardArgs = new TextureRequestArgs();
+ discardArgs.RequestedAssetID = m_testImageAsset.FullID;
+ discardArgs.DiscardLevel = -1;
+ discardArgs.PacketNumber = 1;
+ discardArgs.Priority = 0;
+ discardArgs.requestSequence = 2;
+ llim.EnqueueReq(discardArgs);
+
+ llim.ProcessImageQueue(20);
+
+ Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(0));
+ }
+
+ [Test]
+ public void TestMissingImage()
+ {
+ TestHelpers.InMethod();
+// XmlConfigurator.Configure();
+
+ TextureRequestArgs args = new TextureRequestArgs();
+ args.RequestedAssetID = m_testImageAsset.FullID;
+ args.DiscardLevel = 0;
+ args.PacketNumber = 1;
+ args.Priority = 5;
+ args.requestSequence = 1;
+
+ llim.EnqueueReq(args);
+ llim.ProcessImageQueue(20);
+
+ Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(0));
+ Assert.That(tc.SentImageNotInDatabasePackets.Count, Is.EqualTo(1));
+ }
}
}
\ No newline at end of file
diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs
index 8a71dfda89..ab89fe02b4 100644
--- a/OpenSim/Tests/Common/Mock/TestClient.cs
+++ b/OpenSim/Tests/Common/Mock/TestClient.cs
@@ -60,6 +60,7 @@ namespace OpenSim.Tests.Common.Mock
public List SentImageDataPackets { get; private set; }
public List SentImagePacketPackets { get; private set; }
+ public List SentImageNotInDatabasePackets { get; private set; }
// disable warning: public events, part of the public API
#pragma warning disable 67
@@ -456,6 +457,7 @@ namespace OpenSim.Tests.Common.Mock
SentImageDataPackets = new List();
SentImagePacketPackets = new List();
+ SentImageNotInDatabasePackets = new List();
}
///
@@ -823,6 +825,10 @@ namespace OpenSim.Tests.Common.Mock
public void SendImageNotFound(UUID imageid)
{
+ ImageNotInDatabasePacket p = new ImageNotInDatabasePacket();
+ p.ImageID.ID = imageid;
+
+ SentImageNotInDatabasePackets.Add(p);
}
public void SendShutdownConnectionNotice()
diff --git a/bin/Physics-previous-ode-libs/libode-x86_64.so b/bin/Physics-previous-ode-libs/libode-x86_64.so
deleted file mode 100644
index 9c3070abf4..0000000000
Binary files a/bin/Physics-previous-ode-libs/libode-x86_64.so and /dev/null differ
diff --git a/bin/Physics-previous-ode-libs/libode.dylib b/bin/Physics-previous-ode-libs/libode.dylib
deleted file mode 100644
index 958d2021fb..0000000000
Binary files a/bin/Physics-previous-ode-libs/libode.dylib and /dev/null differ
diff --git a/bin/Physics-previous-ode-libs/libode.so b/bin/Physics-previous-ode-libs/libode.so
deleted file mode 100644
index 6bb85fb72a..0000000000
Binary files a/bin/Physics-previous-ode-libs/libode.so and /dev/null differ
diff --git a/bin/libode-x86_64.so b/bin/libode-x86_64.so
index 6fcf815d62..9c3070abf4 100644
Binary files a/bin/libode-x86_64.so and b/bin/libode-x86_64.so differ
diff --git a/bin/libode.dylib b/bin/libode.dylib
index 7ad0ef00fa..958d2021fb 100644
Binary files a/bin/libode.dylib and b/bin/libode.dylib differ
diff --git a/bin/libode.so b/bin/libode.so
index f7ab065252..6bb85fb72a 100644
Binary files a/bin/libode.so and b/bin/libode.so differ
diff --git a/bin/ode.dll b/bin/ode.dll
index 886b685de5..f310358693 100755
Binary files a/bin/ode.dll and b/bin/ode.dll differ