пофикшено падение при получении префиксов

This commit is contained in:
kirillius 2025-12-18 14:13:14 +03:00
parent 1bcf317c8f
commit 218e21220f
2 changed files with 72 additions and 67 deletions

View File

@ -13,6 +13,7 @@ import java.net.URI;
import java.net.http.HttpClient; import java.net.http.HttpClient;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
@ -33,7 +34,9 @@ public class HEInfoProvider implements ASInfoProvider {
@SneakyThrows @SneakyThrows
public List<IPv4Subnet> getPrefixes(int as) { public List<IPv4Subnet> getPrefixes(int as) {
try (var client = HttpClient.newHttpClient()) { try (var client = HttpClient.newHttpClient()) {
var request = HttpRequest.newBuilder().uri(URI.create("https://bgp.he.net/super-lg/report/api/v1/prefixes/originated/" + as)).header("Accept", "application/json").GET().build(); var request = HttpRequest.newBuilder()
.uri(URI.create("https://bgp.he.net/super-lg/report/api/v1/prefixes/originated/" + as))
.header("Accept", "application/json").timeout(Duration.ofMinutes(2)).GET().build();
var response = client.send(request, HttpResponse.BodyHandlers.ofInputStream()); var response = client.send(request, HttpResponse.BodyHandlers.ofInputStream());
if (response.statusCode() == 200) { if (response.statusCode() == 200) {
try (var inputStream = response.body()) { try (var inputStream = response.body()) {

View File

@ -92,85 +92,88 @@ public class NetworkingService extends AppService {
SystemLogger.message("Updating network manager", CTX); SystemLogger.message("Updating network manager", CTX);
updateProcess.set(executor.submit(() -> { updateProcess.set(executor.submit(() -> {
SystemLogger.message("Update is started", CTX); try {
var config = context.getConfig(); SystemLogger.message("Update is started", CTX);
var filteredResources = config.getFilteredResources(); var config = context.getConfig();
var asn = new ArrayList<>(inputResources.getASN()); var filteredResources = config.getFilteredResources();
asn.removeAll(filteredResources.getASN()); var asn = new ArrayList<>(inputResources.getASN());
asn.removeAll(filteredResources.getASN());
var asnToFetch = new ArrayList<>(asn); var asnToFetch = new ArrayList<>(asn);
if (!ignoreCache) { if (!ignoreCache) {
asnToFetch.removeAll(prefixCache.keySet()); asnToFetch.removeAll(prefixCache.keySet());
}
fetchPrefixes(asnToFetch);
if (config.isCachingAS()) {
try (var os = new FileOutputStream(cacheFile)) {
var json = new JSONObject();
prefixCache.forEach((key, asnList) -> {
json.put(String.valueOf(key), JSONUtility.serializeCollection(asnList, IPv4Subnet.class, null));
});
os.write(json.toString().getBytes());
} catch (IOException e) {
SystemLogger.error("Unable to write file " + cacheFile.getPath(), CTX, e);
} }
}
var subnets = new HashSet<>(inputResources.getSubnets()); fetchPrefixes(asnToFetch);
asn.forEach(n -> {
var cached = prefixCache.get(n);
if (cached == null) {
return;
}
subnets.addAll(cached);
SystemLogger.message("Using " + cached.size() + " subnets from AS" + n, CTX);
});
filteredResources.getSubnets().forEach(subnets::remove);
SystemLogger.message("Trying to summary " + subnets.size() + " subnets...", CTX); if (config.isCachingAS()) {
try (var os = new FileOutputStream(cacheFile)) {
var merged = IPv4Util.summarySubnets(subnets, config.getMergeSubnetsWithUsage()); var json = new JSONObject();
var unmerged = new AtomicInteger(); prefixCache.forEach((key, asnList) -> {
subnets.forEach(subnet -> { json.put(String.valueOf(key), JSONUtility.serializeCollection(asnList, IPv4Subnet.class, null));
if (!merged.getMergedSubnets().contains(subnet)) { });
unmerged.getAndIncrement(); os.write(json.toString().getBytes());
} } catch (IOException e) {
}); SystemLogger.error("Unable to write file " + cacheFile.getPath(), CTX, e);
SystemLogger.message(subnets.size() + " subnets has been summarized and merged to " + merged.getResult().size() + " new subnets. Unmerged: " + unmerged.get(), CTX);
var domains = new HashSet<>(inputResources.getDomains());
filteredResources.getDomains().forEach(domains::remove);
//check domain overlaps
var domainsToRemove = new HashSet<String>();
for (var domainToMatch : domains) {
var pattern = "." + domainToMatch;
for (var domain : domains) {
if (domain.endsWith(pattern)) {
domainsToRemove.add(domain);
} }
} }
}
domains.removeAll(domainsToRemove); var subnets = new HashSet<>(inputResources.getSubnets());
asn.forEach(n -> {
var cached = prefixCache.get(n);
if (cached == null) {
return;
}
subnets.addAll(cached);
SystemLogger.message("Using " + cached.size() + " subnets from AS" + n, CTX);
});
filteredResources.getSubnets().forEach(subnets::remove);
outputResources.setASN(Collections.unmodifiableList(asn)); SystemLogger.message("Trying to summary " + subnets.size() + " subnets...", CTX);
outputResources.setSubnets(merged.getResult());
outputResources.setDomains(domains.stream().toList());
SystemLogger.message("Update is complete", CTX); var merged = IPv4Util.summarySubnets(subnets, config.getMergeSubnetsWithUsage());
var unmerged = new AtomicInteger();
subnets.forEach(subnet -> {
if (!merged.getMergedSubnets().contains(subnet)) {
unmerged.getAndIncrement();
}
});
try { SystemLogger.message(subnets.size() + " subnets has been summarized and merged to " + merged.getResult().size() + " new subnets. Unmerged: " + unmerged.get(), CTX);
context.getEventsHandler().getNetworkManagerUpdateEvent().invoke(outputResources);
var domains = new HashSet<>(inputResources.getDomains());
filteredResources.getDomains().forEach(domains::remove);
//check domain overlaps
var domainsToRemove = new HashSet<String>();
for (var domainToMatch : domains) {
var pattern = "." + domainToMatch;
for (var domain : domains) {
if (domain.endsWith(pattern)) {
domainsToRemove.add(domain);
}
}
}
domains.removeAll(domainsToRemove);
outputResources.setASN(Collections.unmodifiableList(asn));
outputResources.setSubnets(merged.getResult());
outputResources.setDomains(domains.stream().toList());
SystemLogger.message("Update is complete", CTX);
try {
context.getEventsHandler().getNetworkManagerUpdateEvent().invoke(outputResources);
} catch (Exception e) {
SystemLogger.error("Unable to invoke update event", CTX, e);
}
} catch (Exception e) { } catch (Exception e) {
SystemLogger.error("Unable to invoke update event", CTX, e); SystemLogger.error("Something went wrong on update", CTX, e);
} }
})); }));
} }
/** /**
* Fetches prefixes for the given autonomous systems and stores them in the cache. * Fetches prefixes for the given autonomous systems and stores them in the cache.
*/ */
@ -188,12 +191,11 @@ public class NetworkingService extends AppService {
var iPv4Subnets = future.get(); var iPv4Subnets = future.get();
prefixCache.put(as, iPv4Subnets); prefixCache.put(as, iPv4Subnets);
} catch (InterruptedException | ExecutionException e) { } catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e); SystemLogger.error("Error happened while fetching AS" + as + " prefixes. Trying to use cached prefixes...", CTX, e);
} }
}); });
} }
/** /**
* Removes event subscriptions and shuts down the executor. * Removes event subscriptions and shuts down the executor.
*/ */