diff --git a/BGPLite.Providers/PrefixService.cs b/BGPLite.Providers/PrefixService.cs index d33d4f8..6f3cb4d 100644 --- a/BGPLite.Providers/PrefixService.cs +++ b/BGPLite.Providers/PrefixService.cs @@ -78,6 +78,38 @@ public sealed class PrefixService : IPrefixService return GetPrefixesForAsns(ruAsns); } + public async Task WarmUpAsync() + { + var lists = _config.RipeStat?.AsnLists ?? []; + + var allAsns = lists.SelectMany(l => l.Asns).Distinct().ToList(); + foreach (var asn in allAsns) + { + try + { + await GetPrefixesAsync(asn); + Console.WriteLine($" WarmUp: AS{asn} cached"); + } + catch (Exception ex) + { + Console.WriteLine($" WarmUp: AS{asn} failed — {ex.Message}"); + } + } + + if (lists.Any(l => l.Country is not null)) + { + try + { + var ru = await GetRuPrefixesAsync(); + Console.WriteLine($" WarmUp: RU prefixes — {ru.Count} entries"); + } + catch (Exception ex) + { + Console.WriteLine($" WarmUp: RU prefixes failed — {ex.Message}"); + } + } + } + private static IReadOnlyList<(uint Prefix, byte Length)> LoadFromFile(string path) { var result = new List<(uint Prefix, byte Length)>(); diff --git a/BGPLite.Server/IPrefixService.cs b/BGPLite.Server/IPrefixService.cs index 2ee7e84..3cd37d3 100644 --- a/BGPLite.Server/IPrefixService.cs +++ b/BGPLite.Server/IPrefixService.cs @@ -6,4 +6,5 @@ public interface IPrefixService Task> GetPrefixesForAsns(IEnumerable asns); Task GetPrefixCountAsync(uint asn); Task> GetRuPrefixesAsync(); + Task WarmUpAsync(); } diff --git a/BGPLite/Program.cs b/BGPLite/Program.cs index 440068e..b0d3745 100644 --- a/BGPLite/Program.cs +++ b/BGPLite/Program.cs @@ -135,6 +135,12 @@ var logger = host.Services.GetRequiredService>(); logger.LogInformation("BGPLite starting — ASN={Asn}, RouterId={RouterId}", config.Bgp.Asn, config.Bgp.RouterId); logger.LogInformation("Loaded routes: {RouteCount}", routeTable.Count); +// Pre-warm prefix cache before accepting BGP connections +Console.WriteLine("Warming up prefix cache..."); +var prefixService = host.Services.GetRequiredService(); +await prefixService.WarmUpAsync(); +Console.WriteLine("Prefix cache ready"); + await host.RunAsync(); return;