Pools admin log lists (#11462)

Co-authored-by: metalgearsloth <metalgearsloth@gmail.com>
This commit is contained in:
Paul Ritter
2022-10-17 00:00:30 +02:00
committed by GitHub
parent 64926102ff
commit 8b1580ee30
3 changed files with 21 additions and 10 deletions

View File

@@ -299,7 +299,7 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
Add(type, LogImpact.Medium, ref handler); Add(type, LogImpact.Medium, ref handler);
} }
public async Task<List<SharedAdminLog>> All(LogFilter? filter = null) public async Task<List<SharedAdminLog>> All(LogFilter? filter = null, Func<List<SharedAdminLog>>? listProvider = null)
{ {
if (TrySearchCache(filter, out var results)) if (TrySearchCache(filter, out var results))
{ {
@@ -307,7 +307,16 @@ public sealed partial class AdminLogManager : SharedAdminLogManager, IAdminLogMa
} }
var initialSize = Math.Min(filter?.Limit ?? 0, 1000); var initialSize = Math.Min(filter?.Limit ?? 0, 1000);
var list = new List<SharedAdminLog>(initialSize); List<SharedAdminLog> list;
if (listProvider != null)
{
list = listProvider();
list.EnsureCapacity(initialSize);
}
else
{
list = new List<SharedAdminLog>(initialSize);
}
await foreach (var log in _db.GetAdminLogs(filter).WithCancellation(filter?.CancellationToken ?? default)) await foreach (var log in _db.GetAdminLogs(filter).WithCancellation(filter?.CancellationToken ?? default))
{ {

View File

@@ -8,8 +8,10 @@ using Content.Shared.Administration;
using Content.Shared.Administration.Logs; using Content.Shared.Administration.Logs;
using Content.Shared.CCVar; using Content.Shared.CCVar;
using Content.Shared.Eui; using Content.Shared.Eui;
using Microsoft.Extensions.ObjectPool;
using Robust.Shared.Configuration; using Robust.Shared.Configuration;
using Robust.Shared.Timing; using Robust.Shared.Timing;
using Robust.Shared.Utility;
using static Content.Shared.Administration.Logs.AdminLogsEuiMsg; using static Content.Shared.Administration.Logs.AdminLogsEuiMsg;
namespace Content.Server.Administration.Logs; namespace Content.Server.Administration.Logs;
@@ -29,6 +31,9 @@ public sealed class AdminLogsEui : BaseEui
private CancellationTokenSource _logSendCancellation = new(); private CancellationTokenSource _logSendCancellation = new();
private LogFilter _filter; private LogFilter _filter;
private DefaultObjectPool<List<SharedAdminLog>> _adminLogListPool =
new(new ListPolicy<SharedAdminLog>());
public AdminLogsEui() public AdminLogsEui()
{ {
IoCManager.InjectDependencies(this); IoCManager.InjectDependencies(this);
@@ -140,13 +145,8 @@ public sealed class AdminLogsEui : BaseEui
var stopwatch = new Stopwatch(); var stopwatch = new Stopwatch();
stopwatch.Start(); stopwatch.Start();
// TODO ADMIN LOGS array pool var logs = await Task.Run(async () => await _adminLogs.All(_filter, _adminLogListPool.Get),
List<SharedAdminLog> logs = default!; _filter.CancellationToken);
await Task.Run(async () =>
{
logs = await _adminLogs.All(_filter);
}, _filter.CancellationToken);
if (logs.Count > 0) if (logs.Count > 0)
{ {
@@ -167,6 +167,8 @@ public sealed class AdminLogsEui : BaseEui
SendMessage(message); SendMessage(message);
_sawmill.Info($"Sent {logs.Count} logs to {Player.Name} in {stopwatch.Elapsed.TotalMilliseconds} ms"); _sawmill.Info($"Sent {logs.Count} logs to {Player.Name} in {stopwatch.Elapsed.TotalMilliseconds} ms");
_adminLogListPool.Return(logs);
} }
public override void Closed() public override void Closed()

View File

@@ -15,7 +15,7 @@ public interface IAdminLogManager : ISharedAdminLogManager
void RoundStarting(int id); void RoundStarting(int id);
void RunLevelChanged(GameRunLevel level); void RunLevelChanged(GameRunLevel level);
Task<List<SharedAdminLog>> All(LogFilter? filter = null); Task<List<SharedAdminLog>> All(LogFilter? filter = null, Func<List<SharedAdminLog>>? listProvider = null);
IAsyncEnumerable<string> AllMessages(LogFilter? filter = null); IAsyncEnumerable<string> AllMessages(LogFilter? filter = null);
IAsyncEnumerable<JsonDocument> AllJson(LogFilter? filter = null); IAsyncEnumerable<JsonDocument> AllJson(LogFilter? filter = null);
Task<Round> Round(int roundId); Task<Round> Round(int roundId);