mirror of
https://github.com/opensim/opensim.git
synced 2026-08-04 16:22:50 +08:00
Merge branch 'master' of ssh://justincc@opensimulator.org/var/git/opensim
This commit is contained in:
@@ -3196,12 +3196,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
if (!IsActive) return; // We don't need to update inactive clients.
|
||||
|
||||
CoarseLocationUpdatePacket loc = (CoarseLocationUpdatePacket)PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate);
|
||||
// TODO: don't create new blocks if recycling an old packet
|
||||
int total = CoarseLocations.Count;
|
||||
CoarseLocationUpdatePacket.IndexBlock ib =
|
||||
new CoarseLocationUpdatePacket.IndexBlock();
|
||||
loc.Header.Reliable = false;
|
||||
|
||||
// Each packet can only hold around 62 avatar positions and the client clears the mini-map each time
|
||||
// a CoarseLocationUpdate packet is received. Oh well.
|
||||
int total = Math.Min(CoarseLocations.Count, 60);
|
||||
|
||||
CoarseLocationUpdatePacket.IndexBlock ib = new CoarseLocationUpdatePacket.IndexBlock();
|
||||
|
||||
loc.Location = new CoarseLocationUpdatePacket.LocationBlock[total];
|
||||
loc.AgentData = new CoarseLocationUpdatePacket.AgentDataBlock[total];
|
||||
|
||||
int selfindex = -1;
|
||||
for (int i = 0; i < total; i++)
|
||||
{
|
||||
@@ -3211,18 +3216,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
lb.X = (byte)CoarseLocations[i].X;
|
||||
lb.Y = (byte)CoarseLocations[i].Y;
|
||||
|
||||
lb.Z = CoarseLocations[i].Z > 1024 ? (byte)0 : (byte)(CoarseLocations[i].Z * 0.25);
|
||||
lb.Z = CoarseLocations[i].Z > 1024 ? (byte)0 : (byte)(CoarseLocations[i].Z * 0.25f);
|
||||
loc.Location[i] = lb;
|
||||
loc.AgentData[i] = new CoarseLocationUpdatePacket.AgentDataBlock();
|
||||
loc.AgentData[i].AgentID = users[i];
|
||||
if (users[i] == AgentId)
|
||||
selfindex = i;
|
||||
}
|
||||
|
||||
ib.You = (short)selfindex;
|
||||
ib.Prey = -1;
|
||||
loc.Index = ib;
|
||||
loc.Header.Reliable = false;
|
||||
loc.Header.Zerocoded = true;
|
||||
|
||||
OutPacket(loc, ThrottleOutPacketType.Task);
|
||||
}
|
||||
@@ -4905,6 +4909,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
/// <param name="throttlePacketType">Throttling category for the packet</param>
|
||||
protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType)
|
||||
{
|
||||
#region BinaryStats
|
||||
LLUDPServer.LogPacketHeader(false, m_circuitCode, 0, packet.Type, (ushort)packet.Length);
|
||||
#endregion BinaryStats
|
||||
|
||||
m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -197,11 +197,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
private void Initialise(UUID fileID, string fileName)
|
||||
{
|
||||
m_asset = new AssetBase();
|
||||
m_asset.FullID = fileID;
|
||||
m_asset.Type = type;
|
||||
m_asset = new AssetBase(fileID, fileName, type);
|
||||
m_asset.Data = new byte[0];
|
||||
m_asset.Name = fileName;
|
||||
m_asset.Description = "empty";
|
||||
m_asset.Local = true;
|
||||
m_asset.Temporary = true;
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Reflection;
|
||||
@@ -204,6 +205,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
TextureSendLimit = 20;
|
||||
}
|
||||
|
||||
#region BinaryStats
|
||||
config = configSource.Configs["Statistics.Binary"];
|
||||
m_shouldCollectStats = false;
|
||||
if (config != null)
|
||||
{
|
||||
if (config.Contains("enabled") && config.GetBoolean("enabled"))
|
||||
{
|
||||
if (config.Contains("collect_packet_headers"))
|
||||
m_shouldCollectStats = config.GetBoolean("collect_packet_headers");
|
||||
if (config.Contains("packet_headers_period_seconds"))
|
||||
{
|
||||
binStatsMaxFilesize = TimeSpan.FromSeconds(config.GetInt("region_stats_period_seconds"));
|
||||
}
|
||||
if (config.Contains("stats_dir"))
|
||||
{
|
||||
binStatsDir = config.GetString("stats_dir");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_shouldCollectStats = false;
|
||||
}
|
||||
}
|
||||
#endregion BinaryStats
|
||||
|
||||
m_throttle = new TokenBucket(null, sceneThrottleBps, sceneThrottleBps);
|
||||
m_throttleRates = new ThrottleRates(configSource);
|
||||
}
|
||||
@@ -679,6 +705,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
#endregion Incoming Packet Accounting
|
||||
|
||||
#region BinaryStats
|
||||
LogPacketHeader(true, udpClient.CircuitCode, 0, packet.Type, (ushort)packet.Length);
|
||||
#endregion BinaryStats
|
||||
|
||||
#region Ping Check Handling
|
||||
|
||||
if (packet.Type == PacketType.StartPingCheck)
|
||||
@@ -700,6 +730,87 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
packetInbox.Enqueue(new IncomingPacket(udpClient, packet));
|
||||
}
|
||||
|
||||
#region BinaryStats
|
||||
|
||||
public class PacketLogger
|
||||
{
|
||||
public DateTime StartTime;
|
||||
public string Path = null;
|
||||
public System.IO.BinaryWriter Log = null;
|
||||
}
|
||||
|
||||
public static PacketLogger PacketLog;
|
||||
|
||||
protected static bool m_shouldCollectStats = false;
|
||||
// Number of seconds to log for
|
||||
static TimeSpan binStatsMaxFilesize = TimeSpan.FromSeconds(300);
|
||||
static object binStatsLogLock = new object();
|
||||
static string binStatsDir = "";
|
||||
|
||||
public static void LogPacketHeader(bool incoming, uint circuit, byte flags, PacketType packetType, ushort size)
|
||||
{
|
||||
if (!m_shouldCollectStats) return;
|
||||
|
||||
// Binary logging format is TTTTTTTTCCCCFPPPSS, T=Time, C=Circuit, F=Flags, P=PacketType, S=size
|
||||
|
||||
// Put the incoming bit into the least significant bit of the flags byte
|
||||
if (incoming)
|
||||
flags |= 0x01;
|
||||
else
|
||||
flags &= 0xFE;
|
||||
|
||||
// Put the flags byte into the most significant bits of the type integer
|
||||
uint type = (uint)packetType;
|
||||
type |= (uint)flags << 24;
|
||||
|
||||
// m_log.Debug("1 LogPacketHeader(): Outside lock");
|
||||
lock (binStatsLogLock)
|
||||
{
|
||||
DateTime now = DateTime.Now;
|
||||
|
||||
// m_log.Debug("2 LogPacketHeader(): Inside lock. now is " + now.Ticks);
|
||||
try
|
||||
{
|
||||
if (PacketLog == null || (now > PacketLog.StartTime + binStatsMaxFilesize))
|
||||
{
|
||||
if (PacketLog != null && PacketLog.Log != null)
|
||||
{
|
||||
PacketLog.Log.Close();
|
||||
}
|
||||
|
||||
// First log file or time has expired, start writing to a new log file
|
||||
PacketLog = new PacketLogger();
|
||||
PacketLog.StartTime = now;
|
||||
PacketLog.Path = (binStatsDir.Length > 0 ? binStatsDir + System.IO.Path.DirectorySeparatorChar.ToString() : "")
|
||||
+ String.Format("packets-{0}.log", now.ToString("yyyyMMddHHmmss"));
|
||||
PacketLog.Log = new BinaryWriter(File.Open(PacketLog.Path, FileMode.Append, FileAccess.Write));
|
||||
}
|
||||
|
||||
// Serialize the data
|
||||
byte[] output = new byte[18];
|
||||
Buffer.BlockCopy(BitConverter.GetBytes(now.Ticks), 0, output, 0, 8);
|
||||
Buffer.BlockCopy(BitConverter.GetBytes(circuit), 0, output, 8, 4);
|
||||
Buffer.BlockCopy(BitConverter.GetBytes(type), 0, output, 12, 4);
|
||||
Buffer.BlockCopy(BitConverter.GetBytes(size), 0, output, 16, 2);
|
||||
|
||||
// Write the serialized data to disk
|
||||
if (PacketLog != null && PacketLog.Log != null)
|
||||
PacketLog.Log.Write(output);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
m_log.Error("Packet statistics gathering failed: " + ex.Message, ex);
|
||||
if (PacketLog.Log != null)
|
||||
{
|
||||
PacketLog.Log.Close();
|
||||
}
|
||||
PacketLog = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion BinaryStats
|
||||
|
||||
private void HandleUseCircuitCode(object o)
|
||||
{
|
||||
object[] array = (object[])o;
|
||||
|
||||
Reference in New Issue
Block a user