Fix cluster node deduplication using node names instead of IP

- Changed cluster detection to use sorted node names as cluster key
- Global deduplication by node name prevents duplicates
- Works correctly when cluster servers have different IPs
This commit is contained in:
2025-12-15 21:20:01 +05:00
parent dae3315e36
commit da201d3711

View File

@@ -74,18 +74,12 @@ async function loadProxmoxNodesStats() {
// Собрать все данные сначала, потом отрисовать
const chartsToRender = [];
const seenNodes = new Set(); // Для дедупликации нод кластера
const processedClusterIPs = new Set(); // Для отслеживания обработанных кластеров
const seenNodes = new Set(); // Глобальная дедупликация по имени ноды
const processedClusters = new Set(); // Для дедупликации кластеров по набору нод
// Загрузить данные для каждого сервера
for (const server of onlineServers) {
try {
// Если это кластер и мы уже обработали сервер с таким IP - пропускаем
// (все серверы кластера видят одни и те же ноды)
if (processedClusterIPs.has(server.ip_address)) {
continue;
}
// Получить список нод
const nodesResponse = await fetchWithAuth(`/proxmox/api/${server.id}/nodes`);
if (!nodesResponse || !nodesResponse.ok) {
@@ -101,20 +95,29 @@ async function loadProxmoxNodesStats() {
continue;
}
// Если это кластер (более одной ноды) - запомнить IP чтобы не обрабатывать дубликаты
// Для кластеров: создаём уникальный ключ из отсортированных имён нод
// Это позволяет определить что разные серверы принадлежат одному кластеру
const nodeNames = nodes.map(n => n.node).sort();
const clusterKey = nodeNames.join(',');
// Если это кластер (более 1 ноды) и мы уже обработали этот кластер - пропускаем
if (nodes.length > 1 && processedClusters.has(clusterKey)) {
continue;
}
if (nodes.length > 1) {
processedClusterIPs.add(server.ip_address);
processedClusters.add(clusterKey);
}
// Обработать ВСЕ ноды этого сервера
for (const nodeInfo of nodes) {
const node = nodeInfo.node;
const nodeKey = `${server.ip_address}-${node}`;
if (seenNodes.has(nodeKey)) {
// Глобальная дедупликация по имени ноды
if (seenNodes.has(node)) {
continue; // Уже показали эту ноду
}
seenNodes.add(nodeKey);
seenNodes.add(node);
// Получить данные для графиков
const rrdResponse = await fetchWithAuth(`/proxmox/api/${server.id}/node/rrddata?node=${node}&timeframe=hour`);