From bf21705ead558eeb52168b9a74a7765f830e26ac Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 3 Jun 2025 14:51:47 +0200 Subject: [PATCH] attempt to sort queue by length --- Tools/AutoClient/CodexWrapper.cs | 8 +++---- Tools/AutoClient/LoadBalancer.cs | 36 ++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/Tools/AutoClient/CodexWrapper.cs b/Tools/AutoClient/CodexWrapper.cs index 550d913d..d4a60c7f 100644 --- a/Tools/AutoClient/CodexWrapper.cs +++ b/Tools/AutoClient/CodexWrapper.cs @@ -74,10 +74,10 @@ namespace AutoClient (6, 2), (6, 3), (10, 2), - (10, 4), - (20, 2), - (20, 4), - (20, 10) + //(10, 4), + //(20, 2), + //(20, 4), + //(20, 10) ]; return options[r.Next(0, options.Length)]; diff --git a/Tools/AutoClient/LoadBalancer.cs b/Tools/AutoClient/LoadBalancer.cs index 56f640d8..1c3cf980 100644 --- a/Tools/AutoClient/LoadBalancer.cs +++ b/Tools/AutoClient/LoadBalancer.cs @@ -6,6 +6,8 @@ namespace AutoClient { private readonly List instances; private readonly object instanceLock = new object(); + private readonly App app; + private int printDelay = 10; private class Cdx { @@ -24,6 +26,7 @@ namespace AutoClient } public string Id { get; } + public int QueueSize => queue.Count; public void Start() { @@ -82,9 +85,19 @@ namespace AutoClient } } + private class CdxComparer : IComparer + { + public int Compare(Cdx? x, Cdx? y) + { + if (x == null || y == null) return 0; + return x.QueueSize - y.QueueSize; + } + } + public LoadBalancer(App app, CodexWrapper[] instances) { this.instances = instances.Select(i => new Cdx(app, i)).ToList(); + this.app = app; } public void Start() @@ -101,24 +114,39 @@ namespace AutoClient { lock (instanceLock) { + instances.Sort(new CdxComparer()); var i = instances.First(); - instances.RemoveAt(0); - instances.Add(i); i.Queue(action); } + PrintQueue(); } public void DispatchOnSpecificCodex(Action action, string id) { lock (instanceLock) { + instances.Sort(new CdxComparer()); var i = instances.Single(a => a.Id == id); - instances.Remove(i); - instances.Add(i); i.Queue(action); } + PrintQueue(); + } + + private void PrintQueue() + { + printDelay--; + if (printDelay > 0) return; + printDelay = 10; + + lock (instanceLock) + { + foreach (var i in instances) + { + app.Log.Log($"Queue[{i.Id}] = {i.QueueSize} entries"); + } + } } public void CheckErrors()