mirror of
https://github.com/opensim/opensim.git
synced 2026-08-04 16:22:50 +08:00
A few updates necessary for load balancer.
- handle GetUser request for nonexistent user gracefully - include throttle levels in ClientInfo - code to save/restore throttles in client stack - only update/send updates to active clients - make animation classes serializable
This commit is contained in:
@@ -2584,6 +2584,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
public void SendCoarseLocationUpdate(List<Vector3> CoarseLocations)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -196,13 +196,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
// configuration!
|
||||
//
|
||||
|
||||
if ((m_SynchronizeClient != null) && (!m_Client.IsActive))
|
||||
{
|
||||
if (m_SynchronizeClient(m_Client.Scene, packet,
|
||||
m_Client.AgentId, throttlePacketType))
|
||||
return;
|
||||
}
|
||||
|
||||
packet.Header.Sequence = 0;
|
||||
|
||||
lock (m_NeedAck)
|
||||
@@ -480,26 +473,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
if (packet == null)
|
||||
return;
|
||||
|
||||
// If this client is on another partial instance, no need
|
||||
// to handle packets
|
||||
//
|
||||
if (!m_Client.IsActive && packet.Type != PacketType.LogoutRequest)
|
||||
{
|
||||
PacketPool.Instance.ReturnPacket(packet);
|
||||
return;
|
||||
}
|
||||
|
||||
// Any packet can have some packet acks in the header.
|
||||
// Process them here
|
||||
//
|
||||
if (packet.Header.AppendedAcks)
|
||||
{
|
||||
foreach (uint id in packet.Header.AckList)
|
||||
{
|
||||
ProcessAck(id);
|
||||
}
|
||||
}
|
||||
|
||||
// When too many acks are needed to be sent, the client sends
|
||||
// a packet consisting of acks only
|
||||
//
|
||||
@@ -516,10 +489,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
PacketPool.Instance.ReturnPacket(packet);
|
||||
return;
|
||||
}
|
||||
else if (packet.Type == PacketType.StartPingCheck)
|
||||
|
||||
// Any packet can have some packet acks in the header.
|
||||
// Process them here
|
||||
//
|
||||
if (packet.Header.AppendedAcks)
|
||||
{
|
||||
foreach (uint id in packet.Header.AckList)
|
||||
{
|
||||
ProcessAck(id);
|
||||
}
|
||||
}
|
||||
|
||||
// If this client is on another partial instance, no need
|
||||
// to handle packets
|
||||
//
|
||||
if (!m_Client.IsActive && packet.Type != PacketType.LogoutRequest)
|
||||
{
|
||||
PacketPool.Instance.ReturnPacket(packet);
|
||||
return;
|
||||
}
|
||||
|
||||
if (packet.Type == PacketType.StartPingCheck)
|
||||
{
|
||||
StartPingCheckPacket startPing = (StartPingCheckPacket)packet;
|
||||
CompletePingCheckPacket endPing
|
||||
CompletePingCheckPacket endPing
|
||||
= (CompletePingCheckPacket)PacketPool.Instance.GetPacket(PacketType.CompletePingCheck);
|
||||
|
||||
endPing.PingID.PingID = startPing.PingID.PingID;
|
||||
@@ -639,6 +633,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
|
||||
info.sequence = m_Sequence;
|
||||
|
||||
float multiplier = m_PacketQueue.ThrottleMultiplier;
|
||||
info.resendThrottle = (int) (m_PacketQueue.ResendThrottle.Throttle / multiplier);
|
||||
info.landThrottle = (int) (m_PacketQueue.LandThrottle.Throttle / multiplier);
|
||||
info.windThrottle = (int) (m_PacketQueue.WindThrottle.Throttle / multiplier);
|
||||
info.cloudThrottle = (int) (m_PacketQueue.CloudThrottle.Throttle / multiplier);
|
||||
info.taskThrottle = (int) (m_PacketQueue.TaskThrottle.Throttle / multiplier);
|
||||
info.assetThrottle = (int) (m_PacketQueue.AssetThrottle.Throttle / multiplier);
|
||||
info.textureThrottle = (int) (m_PacketQueue.TextureThrottle.Throttle / multiplier);
|
||||
info.totalThrottle = (int) (m_PacketQueue.TotalThrottle.Throttle / multiplier);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
@@ -676,6 +680,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
}
|
||||
|
||||
m_Sequence = info.sequence;
|
||||
|
||||
m_PacketQueue.ResendThrottle.Throttle = info.resendThrottle;
|
||||
m_PacketQueue.LandThrottle.Throttle = info.landThrottle;
|
||||
m_PacketQueue.WindThrottle.Throttle = info.windThrottle;
|
||||
m_PacketQueue.CloudThrottle.Throttle = info.cloudThrottle;
|
||||
m_PacketQueue.TaskThrottle.Throttle = info.taskThrottle;
|
||||
m_PacketQueue.AssetThrottle.Throttle = info.assetThrottle;
|
||||
m_PacketQueue.TextureThrottle.Throttle = info.textureThrottle;
|
||||
m_PacketQueue.TotalThrottle.Throttle = info.totalThrottle;
|
||||
}
|
||||
|
||||
public void AddImportantPacket(PacketType type)
|
||||
|
||||
@@ -69,18 +69,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
// This value also determines how many times per throttletimems the timer will run
|
||||
// If throttleimems is 1000 ms, then the timer will fire every 1000/7 milliseconds
|
||||
|
||||
private float throttleMultiplier = 2.0f; // Default value really doesn't matter.
|
||||
private int throttleTimeDivisor = 7;
|
||||
|
||||
private int throttletimems = 1000;
|
||||
|
||||
private LLPacketThrottle ResendThrottle;
|
||||
private LLPacketThrottle LandThrottle;
|
||||
private LLPacketThrottle WindThrottle;
|
||||
private LLPacketThrottle CloudThrottle;
|
||||
private LLPacketThrottle TaskThrottle;
|
||||
private LLPacketThrottle AssetThrottle;
|
||||
private LLPacketThrottle TextureThrottle;
|
||||
private LLPacketThrottle TotalThrottle;
|
||||
internal LLPacketThrottle ResendThrottle;
|
||||
internal LLPacketThrottle LandThrottle;
|
||||
internal LLPacketThrottle WindThrottle;
|
||||
internal LLPacketThrottle CloudThrottle;
|
||||
internal LLPacketThrottle TaskThrottle;
|
||||
internal LLPacketThrottle AssetThrottle;
|
||||
internal LLPacketThrottle TextureThrottle;
|
||||
internal LLPacketThrottle TotalThrottle;
|
||||
|
||||
// private long LastThrottle;
|
||||
// private long ThrottleInterval;
|
||||
@@ -108,6 +109,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
TextureOutgoingPacketQueue = new Queue<LLQueItem>();
|
||||
AssetOutgoingPacketQueue = new Queue<LLQueItem>();
|
||||
|
||||
// Store the throttle multiplier for posterity.
|
||||
throttleMultiplier = userSettings.ClientThrottleMultipler;
|
||||
|
||||
// Set up the throttle classes (min, max, current) in bits per second
|
||||
ResendThrottle = new LLPacketThrottle(5000, 100000, 16000, userSettings.ClientThrottleMultipler);
|
||||
LandThrottle = new LLPacketThrottle(1000, 100000, 2000, userSettings.ClientThrottleMultipler);
|
||||
@@ -624,5 +628,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||
{
|
||||
return SendQueue.GetQueueArray();
|
||||
}
|
||||
|
||||
public float ThrottleMultiplier
|
||||
{
|
||||
get { return throttleMultiplier; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user