From 3debc83ba1aa59b2c266e7fcb31030ac4ffb6455 Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Wed, 7 Dec 2022 11:04:24 -0500 Subject: [PATCH 01/15] rename 'Account ID' column to 'PeerId' --- chain/jsonrpc/res/network_info.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/jsonrpc/res/network_info.html b/chain/jsonrpc/res/network_info.html index b65c1aa4dde..c1007260867 100644 --- a/chain/jsonrpc/res/network_info.html +++ b/chain/jsonrpc/res/network_info.html @@ -407,7 +407,7 @@

Address Validator? - Account ID + PeerId Last ping Height Last Block Hash From 10092a478181e7967154822738fbfa8434d74e10 Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Wed, 7 Dec 2022 11:50:10 -0500 Subject: [PATCH 02/15] add PeerId of node to network_info page --- chain/jsonrpc/res/network_info.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/chain/jsonrpc/res/network_info.html b/chain/jsonrpc/res/network_info.html index c1007260867..1d96aa71da1 100644 --- a/chain/jsonrpc/res/network_info.html +++ b/chain/jsonrpc/res/network_info.html @@ -217,8 +217,10 @@ $('.js-unknown-chunk-producers').text(Array.from(chunk_uknown_set).join(",")); $('.js-unreachable-chunk-producers').text(Array.from(chunk_known_but_unreachable).join(",")); + let node_public_key = data.node_public_key; let sync_status = data.detailed_debug_status.sync_status; let network_info = data.detailed_debug_status.network_info; + $('.js-node-public-key').text(node_public_key); $('.js-sync-status').text(sync_status); $('.js-max-peers').text(network_info.peer_max_count); $('.js-num-peers').text(network_info.num_connected_peers); @@ -354,6 +356,10 @@

Welcome to the Network Info page!

+

+ PeerId: + +

Current Sync Status: From 7d77cbbd2a9492c1398e763bf3080482ed96bd86 Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Wed, 7 Dec 2022 18:39:16 -0500 Subject: [PATCH 03/15] typo --- chain/jsonrpc/res/network_info.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/jsonrpc/res/network_info.html b/chain/jsonrpc/res/network_info.html index 1d96aa71da1..b07559baaf7 100644 --- a/chain/jsonrpc/res/network_info.html +++ b/chain/jsonrpc/res/network_info.html @@ -376,7 +376,7 @@

-Uknown: 
+Unknown: 
 Unreachable: 
     

@@ -387,7 +387,7 @@

-Uknown: 
+Unknown: 
 Unreachable: 
     
From 5594ce5185e04ab3ad01fec4c0e00b0a9355fd81 Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Thu, 8 Dec 2022 11:37:48 -0500 Subject: [PATCH 04/15] externalize js functions from network_info.html --- chain/jsonrpc/res/network_info.html | 109 +--------------------------- chain/jsonrpc/res/network_info.js | 109 ++++++++++++++++++++++++++++ chain/jsonrpc/src/lib.rs | 1 + 3 files changed, 111 insertions(+), 108 deletions(-) create mode 100644 chain/jsonrpc/res/network_info.js diff --git a/chain/jsonrpc/res/network_info.html b/chain/jsonrpc/res/network_info.html index b07559baaf7..a238e6fe00b 100644 --- a/chain/jsonrpc/res/network_info.html +++ b/chain/jsonrpc/res/network_info.html @@ -55,82 +55,8 @@ } + + + + + + +

+ Welcome to the TIER1 Network Info page! +

+ + +
+ + + + + + + + + + + + + + + + + + + + + +
AddressValidator?PeerIdLast pingHeightLast Block HashTracked ShardsArchivalConnection typeNonceFirst connectionTraffic (last minute)Route to validators
+ + + diff --git a/chain/jsonrpc/src/lib.rs b/chain/jsonrpc/src/lib.rs index 0a40ec5a91b..41f46e0afc8 100644 --- a/chain/jsonrpc/src/lib.rs +++ b/chain/jsonrpc/src/lib.rs @@ -300,6 +300,9 @@ impl JsonRpcHandler { process_method_call(request, |params| self.next_light_client_block(params)).await } "network_info" => process_method_call(request, |_params: ()| self.network_info()).await, + "tier1_network_info" => { + process_method_call(request, |_params: ()| self.tier1_network_info()).await + } "query" => { let params = RpcRequest::parse(request.params)?; let query_response = self.query(params).await; @@ -1008,6 +1011,16 @@ impl JsonRpcHandler { Ok(network_info.rpc_into()) } + async fn tier1_network_info( + &self, + ) -> Result< + near_jsonrpc_primitives::types::network_info::RpcNetworkInfoResponse, + near_jsonrpc_primitives::types::network_info::RpcNetworkInfoError, + > { + let network_info = self.client_send(GetNetworkInfo {}).await?; + Ok(network_info.rpc_into()) + } + async fn gas_price( &self, request_data: near_jsonrpc_primitives::types::gas_price::RpcGasPriceRequest, @@ -1371,6 +1384,18 @@ fn network_info_handler( response.boxed() } +fn tier1_network_info_handler( + handler: web::Data, +) -> impl Future> { + let response = async move { + match handler.tier1_network_info().await { + Ok(value) => Ok(HttpResponse::Ok().json(&value)), + Err(_) => Ok(HttpResponse::ServiceUnavailable().finish()), + } + }; + response.boxed() +} + pub async fn prometheus_handler() -> Result { metrics::PROMETHEUS_REQUEST_COUNT.inc(); @@ -1425,6 +1450,7 @@ async fn display_debug_html( "network_info" => Some(debug_page_string!("network_info.html", handler)), "network_info.css" => Some(debug_page_string!("network_info.css", handler)), "network_info.js" => Some(debug_page_string!("network_info.js", handler)), + "tier1_network_info" => Some(debug_page_string!("tier1_network_info.html", handler)), "epoch_info" => Some(debug_page_string!("epoch_info.html", handler)), "chain_n_chunk_info" => Some(debug_page_string!("chain_n_chunk_info.html", handler)), "sync" => Some(debug_page_string!("sync.html", handler)), @@ -1497,6 +1523,10 @@ pub fn start_http( .route(web::head().to(health_handler)), ) .service(web::resource("/network_info").route(web::get().to(network_info_handler))) + .service( + web::resource("/tier1_network_info") + .route(web::get().to(tier1_network_info_handler)), + ) .service(web::resource("/metrics").route(web::get().to(prometheus_handler))) .service(web::resource("/debug/api/{api}").route(web::get().to(debug_handler))) .service( From 4a18931a0973f047850db96635d02d7ddadf16de Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Thu, 8 Dec 2022 12:41:35 -0500 Subject: [PATCH 07/15] clean up producers code, show tier1 connections --- chain/jsonrpc/res/tier1_network_info.html | 152 +++++++--------------- 1 file changed, 46 insertions(+), 106 deletions(-) diff --git a/chain/jsonrpc/res/tier1_network_info.html b/chain/jsonrpc/res/tier1_network_info.html index 9859c0bbc0e..4ca081f2669 100644 --- a/chain/jsonrpc/res/tier1_network_info.html +++ b/chain/jsonrpc/res/tier1_network_info.html @@ -38,115 +38,56 @@ type: "GET", url: "../api/status", success: data => { - - fetchProducers(data.sync_info.epoch_id, (block_producers, chunk_producers) => { - let block_producer_set = new Set(); - block_producers.forEach(element => { - block_producer_set.add(element.account_id); - }); - let chunk_producer_set = new Set(); - chunk_producers.forEach(element => { - chunk_producer_set.add(element); - }); - - let known_set = new Set(); - data.detailed_debug_status.network_info.known_producers.forEach(element => { - known_set.add(element.account_id); - }); - - let reachable_set = new Set(); + let node_public_key = data.node_public_key; + let sync_status = data.detailed_debug_status.sync_status; + let network_info = data.detailed_debug_status.network_info; + let current_height = data.sync_info.latest_block_height; + let peer_status_map = new Map(); + network_info.tier1_connections.forEach(function (peer, index) { + let peer_id = peer.peer_id; + let validator = new Array(); data.detailed_debug_status.network_info.known_producers.forEach(element => { - if (element.next_hops != null && element.next_hops.length > 0) { - reachable_set.add(element.account_id); + if (element.peer_id == peer_id) { + // TIER1 connections are only to validators + validator.push(element.account_id); } }); + let peer_class = peerClass(current_height, peer.height) + if (peer_status_map.has(peer_class)) { + peer_status_map.set(peer_class, peer_status_map.get(peer_class) + 1); + } else { + peer_status_map.set(peer_class, 1); + } - $('.js-num-block-producers').text(block_producers.length); - $('.js-num-known-block-producers').text(getIntersection(block_producer_set, known_set).size); - $('.js-num-reachable-block-producers').text(getIntersection(block_producer_set, reachable_set).size); - let uknown_set = getDifference(block_producer_set, known_set); - let known_but_unreachable = getIntersection(block_producer_set, getDifference(known_set, reachable_set)); - $('.js-unknown-block-producers').text(Array.from(uknown_set).join(",")); - $('.js-unreachable-block-producers').text(Array.from(known_but_unreachable).join(",")); - - - - $('.js-num-chunk-producers').text(chunk_producers.length); - $('.js-num-known-chunk-producers').text(getIntersection(chunk_producer_set, known_set).size); - $('.js-num-reachable-chunk-producers').text(getIntersection(chunk_producer_set, reachable_set).size); - let chunk_uknown_set = getDifference(chunk_producer_set, known_set); - let chunk_known_but_unreachable = getIntersection(chunk_producer_set, getDifference(known_set, reachable_set)); - $('.js-unknown-chunk-producers').text(Array.from(chunk_uknown_set).join(",")); - $('.js-unreachable-chunk-producers').text(Array.from(chunk_known_but_unreachable).join(",")); - - let node_public_key = data.node_public_key; - let sync_status = data.detailed_debug_status.sync_status; - let network_info = data.detailed_debug_status.network_info; - $('.js-node-public-key').text(node_public_key); - $('.js-sync-status').text(sync_status); - $('.js-max-peers').text(network_info.peer_max_count); - $('.js-num-peers').text(network_info.num_connected_peers); - let current_height = data.sync_info.latest_block_height; - let peer_status_map = new Map(); - network_info.connected_peers.forEach(function (peer, index) { - let peer_id = peer.peer_id; - let validator = new Array(); - let routedValidator = new Array(); - data.detailed_debug_status.network_info.known_producers.forEach(element => { - if (block_producer_set.has(element.account_id) || chunk_producer_set.has(element.account_id)) { - if (element.peer_id == peer_id) { - // This means that the peer that we're connected to is a validator. - validator.push(element.account_id); - } else { - if (element.next_hops != null) { - if (element.next_hops.includes(peer_id)) { - // This means that the peer that we're connected to is on the shortest path - // to this validator. - routedValidator.push(element.account_id); - } - } - } - } - }); - let peer_class = peerClass(current_height, peer.height) - if (peer_status_map.has(peer_class)) { - peer_status_map.set(peer_class, peer_status_map.get(peer_class) + 1); - } else { - peer_status_map.set(peer_class, 1); - } - - let last_ping_class = "" - if (peer.last_time_received_message_millis > 60 * 1000) { - last_ping_class = "peer_far_behind"; - } - + let last_ping_class = "" + if (peer.last_time_received_message_millis > 60 * 1000) { + last_ping_class = "peer_far_behind"; + } - let row = $('.js-tbody-peers').append($('') - .append($('').append(add_debug_port_link(peer.addr))) - .append($('').append(validator.join(","))) - .append($('').append(peer.peer_id.substr(8, 5) + "...")) - .append($('').append(convertTime(peer.last_time_received_message_millis)).addClass(last_ping_class)) - .append($('').append(JSON.stringify(peer.height)).addClass(peer_class)) - .append($('').append(displayHash(peer))) - .append($('').append(JSON.stringify(peer.tracked_shards))) - .append($('').append(JSON.stringify(peer.archival))) - .append($('').append(((peer.is_outbound_peer) ? 'OUT' : 'IN'))) - // If this is a new style nonce - show the approx time since it was created. - .append($('').append(peer.nonce + "
" + ((peer.nonce > 1660000000) ? convertTime(Date.now() - peer.nonce * 1000) : "old style nonce"))) - .append($('').append(convertTime(peer.connection_established_time_millis))) - .append($('').append(computeTraffic(peer.received_bytes_per_sec, peer.sent_bytes_per_sec))) - .append($('').append(routedValidator.join(","))) - ) - }); - let legend = [["peer_ahead_alot", "Peer ahead a lot"], - ["peer_ahead", "Peer ahead"], - ["peer_in_sync", "Peer in sync"], - ["peer_behind_a_little", "Peer behind a little"], - ["peer_behind", "Peer behind"], - ["peer_far_behind", "Peer far behind"]] - legend.forEach(function (elem) { - $('.legend').append($('').addClass(elem[0]).text(elem[1] + " " + (peer_status_map.get(elem[0]) || 0))); - }); + let row = $('.js-tbody-peers').append($('') + .append($('').append(add_debug_port_link(peer.addr))) + .append($('').append(validator.join(","))) + .append($('').append(peer.peer_id.substr(8, 5) + "...")) + .append($('').append(convertTime(peer.last_time_received_message_millis)).addClass(last_ping_class)) + .append($('').append(JSON.stringify(peer.height)).addClass(peer_class)) + .append($('').append(displayHash(peer))) + .append($('').append(JSON.stringify(peer.tracked_shards))) + .append($('').append(JSON.stringify(peer.archival))) + .append($('').append(((peer.is_outbound_peer) ? 'OUT' : 'IN'))) + // If this is a new style nonce - show the approx time since it was created. + .append($('').append(peer.nonce + "
" + ((peer.nonce > 1660000000) ? convertTime(Date.now() - peer.nonce * 1000) : "old style nonce"))) + .append($('').append(convertTime(peer.connection_established_time_millis))) + .append($('').append(computeTraffic(peer.received_bytes_per_sec, peer.sent_bytes_per_sec))) + ) + }); + let legend = [["peer_ahead_alot", "Peer ahead a lot"], + ["peer_ahead", "Peer ahead"], + ["peer_in_sync", "Peer in sync"], + ["peer_behind_a_little", "Peer behind a little"], + ["peer_behind", "Peer behind"], + ["peer_far_behind", "Peer far behind"]] + legend.forEach(function (elem) { + $('.legend').append($('').addClass(elem[0]).text(elem[1] + " " + (peer_status_map.get(elem[0]) || 0))); }); }, dataType: "json", @@ -172,7 +113,7 @@

Address - Validator? + Validator PeerId Last ping Height @@ -183,7 +124,6 @@

Nonce First connection Traffic (last minute) - Route to validators From 3872eef63b465a411fe39a577d3b20455b54ada9 Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Thu, 8 Dec 2022 12:48:20 -0500 Subject: [PATCH 08/15] show n/a for last ping to self --- chain/jsonrpc/res/tier1_network_info.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/chain/jsonrpc/res/tier1_network_info.html b/chain/jsonrpc/res/tier1_network_info.html index 4ca081f2669..5028dcaf311 100644 --- a/chain/jsonrpc/res/tier1_network_info.html +++ b/chain/jsonrpc/res/tier1_network_info.html @@ -59,8 +59,11 @@ peer_status_map.set(peer_class, 1); } + let last_ping = convertTime(peer.last_time_received_message_millis) let last_ping_class = "" - if (peer.last_time_received_message_millis > 60 * 1000) { + if (node_public_key == peer_id) { + last_ping = "N/A" + } else if (peer.last_time_received_message_millis > 60 * 1000) { last_ping_class = "peer_far_behind"; } From 2ff3ab39cce948269887d9a6a3b56df12e41ab77 Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Thu, 8 Dec 2022 13:20:03 -0500 Subject: [PATCH 09/15] actually show n/a --- chain/jsonrpc/res/tier1_network_info.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/jsonrpc/res/tier1_network_info.html b/chain/jsonrpc/res/tier1_network_info.html index 5028dcaf311..cddd1311558 100644 --- a/chain/jsonrpc/res/tier1_network_info.html +++ b/chain/jsonrpc/res/tier1_network_info.html @@ -62,7 +62,7 @@ let last_ping = convertTime(peer.last_time_received_message_millis) let last_ping_class = "" if (node_public_key == peer_id) { - last_ping = "N/A" + last_ping = "n/a" } else if (peer.last_time_received_message_millis > 60 * 1000) { last_ping_class = "peer_far_behind"; } @@ -71,7 +71,7 @@ .append($('').append(add_debug_port_link(peer.addr))) .append($('').append(validator.join(","))) .append($('').append(peer.peer_id.substr(8, 5) + "...")) - .append($('').append(convertTime(peer.last_time_received_message_millis)).addClass(last_ping_class)) + .append($('').append(last_ping).addClass(last_ping_class)) .append($('').append(JSON.stringify(peer.height)).addClass(peer_class)) .append($('').append(displayHash(peer))) .append($('').append(JSON.stringify(peer.tracked_shards))) From b03b6d26d3749fa94a20a91fe588fe7d2265ae3b Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Thu, 8 Dec 2022 13:30:58 -0500 Subject: [PATCH 10/15] remove height, last hash, nonce from TIER1 table --- chain/jsonrpc/res/tier1_network_info.html | 27 ----------------------- 1 file changed, 27 deletions(-) diff --git a/chain/jsonrpc/res/tier1_network_info.html b/chain/jsonrpc/res/tier1_network_info.html index cddd1311558..c8f58c814e4 100644 --- a/chain/jsonrpc/res/tier1_network_info.html +++ b/chain/jsonrpc/res/tier1_network_info.html @@ -41,8 +41,6 @@ let node_public_key = data.node_public_key; let sync_status = data.detailed_debug_status.sync_status; let network_info = data.detailed_debug_status.network_info; - let current_height = data.sync_info.latest_block_height; - let peer_status_map = new Map(); network_info.tier1_connections.forEach(function (peer, index) { let peer_id = peer.peer_id; let validator = new Array(); @@ -52,12 +50,6 @@ validator.push(element.account_id); } }); - let peer_class = peerClass(current_height, peer.height) - if (peer_status_map.has(peer_class)) { - peer_status_map.set(peer_class, peer_status_map.get(peer_class) + 1); - } else { - peer_status_map.set(peer_class, 1); - } let last_ping = convertTime(peer.last_time_received_message_millis) let last_ping_class = "" @@ -72,26 +64,13 @@ .append($('').append(validator.join(","))) .append($('').append(peer.peer_id.substr(8, 5) + "...")) .append($('').append(last_ping).addClass(last_ping_class)) - .append($('').append(JSON.stringify(peer.height)).addClass(peer_class)) - .append($('').append(displayHash(peer))) .append($('').append(JSON.stringify(peer.tracked_shards))) .append($('').append(JSON.stringify(peer.archival))) .append($('').append(((peer.is_outbound_peer) ? 'OUT' : 'IN'))) - // If this is a new style nonce - show the approx time since it was created. - .append($('').append(peer.nonce + "
" + ((peer.nonce > 1660000000) ? convertTime(Date.now() - peer.nonce * 1000) : "old style nonce"))) .append($('').append(convertTime(peer.connection_established_time_millis))) .append($('').append(computeTraffic(peer.received_bytes_per_sec, peer.sent_bytes_per_sec))) ) }); - let legend = [["peer_ahead_alot", "Peer ahead a lot"], - ["peer_ahead", "Peer ahead"], - ["peer_in_sync", "Peer in sync"], - ["peer_behind_a_little", "Peer behind a little"], - ["peer_behind", "Peer behind"], - ["peer_far_behind", "Peer far behind"]] - legend.forEach(function (elem) { - $('.legend').append($('').addClass(elem[0]).text(elem[1] + " " + (peer_status_map.get(elem[0]) || 0))); - }); }, dataType: "json", error: function (errMsg, textStatus, errorThrown) { @@ -109,9 +88,6 @@

Welcome to the TIER1 Network Info page!

- -
- @@ -119,12 +95,9 @@

- - - From dbcba224f8440366bef4a695950147ec7460b401 Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Thu, 8 Dec 2022 17:42:38 -0500 Subject: [PATCH 11/15] show disconnected TIER1 accounts, show proxies --- chain/jsonrpc/res/tier1_network_info.html | 60 ++++++++++++++++++++--- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/chain/jsonrpc/res/tier1_network_info.html b/chain/jsonrpc/res/tier1_network_info.html index c8f58c814e4..afeea470269 100644 --- a/chain/jsonrpc/res/tier1_network_info.html +++ b/chain/jsonrpc/res/tier1_network_info.html @@ -38,22 +38,32 @@ type: "GET", url: "../api/status", success: data => { - let node_public_key = data.node_public_key; - let sync_status = data.detailed_debug_status.sync_status; + let connected_tier1_peers = new Set(); + let network_info = data.detailed_debug_status.network_info; network_info.tier1_connections.forEach(function (peer, index) { let peer_id = peer.peer_id; - let validator = new Array(); + connected_tier1_peers.add(peer_id); + + let validator = ""; data.detailed_debug_status.network_info.known_producers.forEach(element => { if (element.peer_id == peer_id) { - // TIER1 connections are only to validators - validator.push(element.account_id); + validator = element.account_id; + } + }); + + let proxies = new Array(); + network_info.tier1_accounts_data.forEach(account => { + if (account.peer_id == peer_id) { + account.proxies.forEach(proxy => { + proxies.push(proxy.peer_id.substr(8, 5) + "...@" + proxy.addr); + }); } }); let last_ping = convertTime(peer.last_time_received_message_millis) let last_ping_class = "" - if (node_public_key == peer_id) { + if (data.node_public_key == peer_id) { last_ping = "n/a" } else if (peer.last_time_received_message_millis > 60 * 1000) { last_ping_class = "peer_far_behind"; @@ -61,8 +71,9 @@ let row = $('.js-tbody-peers').append($('') .append($('') + .append($(' + From a6a9bacc0568f73591bf8391602cff10cc6d4bba Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Fri, 9 Dec 2022 08:36:17 -0500 Subject: [PATCH 12/15] add accounts_data.keys to NetworkInfo --- chain/client/src/client_actor.rs | 1 + chain/client/src/debug.rs | 1 + chain/client/src/test_utils.rs | 1 + chain/jsonrpc/res/tier1_network_info.html | 40 +++++++++++++++++-- .../src/peer_manager/peer_manager_actor.rs | 3 +- chain/network/src/types.rs | 1 + core/primitives/src/views.rs | 1 + 7 files changed, 43 insertions(+), 5 deletions(-) diff --git a/chain/client/src/client_actor.rs b/chain/client/src/client_actor.rs index 06c20358f31..e33ed0de315 100644 --- a/chain/client/src/client_actor.rs +++ b/chain/client/src/client_actor.rs @@ -199,6 +199,7 @@ impl ClientActor { received_bytes_per_sec: 0, sent_bytes_per_sec: 0, known_producers: vec![], + tier1_accounts_keys: vec![], tier1_accounts_data: vec![], }, last_validator_announce_time: None, diff --git a/chain/client/src/debug.rs b/chain/client/src/debug.rs index b98b4686d63..3e47949d578 100644 --- a/chain/client/src/debug.rs +++ b/chain/client/src/debug.rs @@ -689,6 +689,7 @@ pub(crate) fn new_network_info_view(chain: &Chain, network_info: &NetworkInfo) - .map(|it| it.iter().map(|peer_id| peer_id.public_key().clone()).collect()), }) .collect(), + tier1_accounts_keys: network_info.tier1_accounts_keys.clone(), tier1_accounts_data: network_info .tier1_accounts_data .iter() diff --git a/chain/client/src/test_utils.rs b/chain/client/src/test_utils.rs index 2655203b8b6..957e9c354e7 100644 --- a/chain/client/src/test_utils.rs +++ b/chain/client/src/test_utils.rs @@ -690,6 +690,7 @@ pub fn setup_mock_all_validators( sent_bytes_per_sec: 0, received_bytes_per_sec: 0, known_producers: vec![], + tier1_accounts_keys: vec![], tier1_accounts_data: vec![], }; client_addr.do_send(SetNetworkInfo(info).with_span_context()); diff --git a/chain/jsonrpc/res/tier1_network_info.html b/chain/jsonrpc/res/tier1_network_info.html index afeea470269..9af6ca2e5a6 100644 --- a/chain/jsonrpc/res/tier1_network_info.html +++ b/chain/jsonrpc/res/tier1_network_info.html @@ -38,12 +38,13 @@ type: "GET", url: "../api/status", success: data => { - let connected_tier1_peers = new Set(); - + let rendered = new Set(); let network_info = data.detailed_debug_status.network_info; + + // tier1_connections contains TIER1 nodes we are currently connected to network_info.tier1_connections.forEach(function (peer, index) { let peer_id = peer.peer_id; - connected_tier1_peers.add(peer_id); + rendered.add(peer_id); let validator = ""; data.detailed_debug_status.network_info.known_producers.forEach(element => { @@ -83,12 +84,14 @@ ) }); + // tier1_accounts_data contains data about TIER1 nodes we would like to connect to network_info.tier1_accounts_data.forEach(account => { let peer_id = account.peer_id; - if (connected_tier1_peers.has(peer_id)) { + if (rendered.has(peer_id)) { return; } + rendered.add(peer_id); let validator = ""; data.detailed_debug_status.network_info.known_producers.forEach(element => { @@ -115,8 +118,37 @@ .append($('') + .append($('
Validator PeerId Last pingHeightLast Block Hash Tracked Shards Archival Connection typeNonce First connection Traffic (last minute)
').append(add_debug_port_link(peer.addr))) - .append($('').append(validator.join(","))) + .append($('').append(validator)) .append($('').append(peer.peer_id.substr(8, 5) + "...")) + .append($('').append("[" + proxies.join(",") + "]")) .append($('').append(last_ping).addClass(last_ping_class)) .append($('').append(JSON.stringify(peer.tracked_shards))) .append($('').append(JSON.stringify(peer.archival))) @@ -71,7 +82,41 @@ .append($('').append(computeTraffic(peer.received_bytes_per_sec, peer.sent_bytes_per_sec))) ) }); + + network_info.tier1_accounts_data.forEach(account => { + let peer_id = account.peer_id; + + if (connected_tier1_peers.has(peer_id)) { + return; + } + + let validator = ""; + data.detailed_debug_status.network_info.known_producers.forEach(element => { + if (element.peer_id == peer_id) { + validator = element.account_id; + } + }); + + let proxies = new Array(); + account.proxies.forEach(proxy => { + proxies.push(proxy.peer_id.substr(8, 5) + "...@" + proxy.addr); + }); + + let row = $('.js-tbody-peers').append($('
')) + .append($('').append(validator)) + .append($('').append(peer_id.substr(8, 5) + "...")) + .append($('').append("[" + proxies.join(",") + "]")) + .append($('')) + .append($('')) + .append($('')) + .append($('')) + .append($('')) + .append($('')) + ) + }); }, + dataType: "json", error: function (errMsg, textStatus, errorThrown) { alert("Failed: " + textStatus + " :" + errorThrown); @@ -94,6 +139,7 @@

Address Validator PeerIdProxies Last ping Tracked Shards Archival')) ) }); + + // tier1_accounts_keys contains accounts whose data we would like to connect + network_info.tier1_accounts_keys.forEach(peer_id => { + if (rendered.has(peer_id)) { + return; + } + rendered.add(peer_id); + + let validator = ""; + data.detailed_debug_status.network_info.known_producers.forEach(element => { + if (element.peer_id == peer_id) { + validator = element.account_id; + } + }); + + let row = $('.js-tbody-peers').append($('
')) + .append($('').append(validator)) + .append($('').append(peer_id.substr(8, 5) + "...")) + .append($('')) + .append($('')) + .append($('')) + .append($('')) + .append($('')) + .append($('')) + .append($('')) + ) + }); }, + dataType: "json", error: function (errMsg, textStatus, errorThrown) { alert("Failed: " + textStatus + " :" + errorThrown); diff --git a/chain/network/src/peer_manager/peer_manager_actor.rs b/chain/network/src/peer_manager/peer_manager_actor.rs index 78fc929dacf..a56866c2130 100644 --- a/chain/network/src/peer_manager/peer_manager_actor.rs +++ b/chain/network/src/peer_manager/peer_manager_actor.rs @@ -202,7 +202,7 @@ impl PeerManagerActor { let state = state.clone(); let clock = clock.clone(); async move { - // Start server if address provided. + // Start server if address provided. if let Some(server_addr) = state.config.node_addr { tracing::debug!(target: "network", at = ?server_addr, "starting public server"); let mut listener = match tcp::Listener::bind(server_addr).await { @@ -636,6 +636,7 @@ impl PeerManagerActor { next_hops: self.state.graph.routing_table.view_route(&announce_account.peer_id), }) .collect(), + tier1_accounts_keys: self.state.accounts_data.load().keys.iter().cloned().collect(), tier1_accounts_data: self.state.accounts_data.load().data.values().cloned().collect(), } } diff --git a/chain/network/src/types.rs b/chain/network/src/types.rs index 9a10152a077..898ce4b5eb8 100644 --- a/chain/network/src/types.rs +++ b/chain/network/src/types.rs @@ -365,6 +365,7 @@ pub struct NetworkInfo { /// Accounts of known block and chunk producers from routing table. pub known_producers: Vec, /// Collected data about the current TIER1 accounts. + pub tier1_accounts_keys: Vec, pub tier1_accounts_data: Vec>, /// TIER1 connections. pub tier1_connections: Vec, diff --git a/core/primitives/src/views.rs b/core/primitives/src/views.rs index 8870f6a4859..6b10b268729 100644 --- a/core/primitives/src/views.rs +++ b/core/primitives/src/views.rs @@ -383,6 +383,7 @@ pub struct NetworkInfoView { pub num_connected_peers: usize, pub connected_peers: Vec, pub known_producers: Vec, + pub tier1_accounts_keys: Vec, pub tier1_accounts_data: Vec, pub tier1_connections: Vec, } From 52755a9f3927ac5f9efc99b53925e7e68b64f688 Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Fri, 9 Dec 2022 08:51:21 -0500 Subject: [PATCH 13/15] fix other instances of NetworkInfo usage --- chain/client/src/info.rs | 1 + integration-tests/src/tests/client/process_blocks.rs | 1 + tools/chainsync-loadtest/src/network.rs | 1 + tools/mock-node/src/lib.rs | 1 + 4 files changed, 4 insertions(+) diff --git a/chain/client/src/info.rs b/chain/client/src/info.rs index 48688379284..64e822b539b 100644 --- a/chain/client/src/info.rs +++ b/chain/client/src/info.rs @@ -561,6 +561,7 @@ mod tests { received_bytes_per_sec: 0, known_producers: vec![], tier1_connections: vec![], + tier1_accounts_keys: vec![], tier1_accounts_data: vec![], }, &config, diff --git a/integration-tests/src/tests/client/process_blocks.rs b/integration-tests/src/tests/client/process_blocks.rs index 4178f4cbc5e..85574d81a8b 100644 --- a/integration-tests/src/tests/client/process_blocks.rs +++ b/integration-tests/src/tests/client/process_blocks.rs @@ -1041,6 +1041,7 @@ fn client_sync_headers() { received_bytes_per_sec: 0, known_producers: vec![], tier1_connections: vec![], + tier1_accounts_keys: vec![], tier1_accounts_data: vec![], }) .with_span_context(), diff --git a/tools/chainsync-loadtest/src/network.rs b/tools/chainsync-loadtest/src/network.rs index 7a765489dcd..f83fd13e70c 100644 --- a/tools/chainsync-loadtest/src/network.rs +++ b/tools/chainsync-loadtest/src/network.rs @@ -87,6 +87,7 @@ impl Network { received_bytes_per_sec: 0, known_producers: vec![], tier1_connections: vec![], + tier1_accounts_keys: vec![], tier1_accounts_data: vec![], }), info_futures: Default::default(), diff --git a/tools/mock-node/src/lib.rs b/tools/mock-node/src/lib.rs index 6be34eba38f..693e2c6f9d1 100644 --- a/tools/mock-node/src/lib.rs +++ b/tools/mock-node/src/lib.rs @@ -256,6 +256,7 @@ impl MockPeerManagerActor { received_bytes_per_sec: 0, known_producers: vec![], tier1_connections: vec![], + tier1_accounts_keys: vec![], tier1_accounts_data: vec![], }; let incoming_requests = IncomingRequests::new( From 0b34877702a90a61527c39e9a1b2f567c5402d74 Mon Sep 17 00:00:00 2001 From: Saketh Are Date: Fri, 9 Dec 2022 09:02:12 -0500 Subject: [PATCH 14/15] remove unused func fetchProducers from TIER1 page --- .../jsonrpc/res/.tier1_network_info.html.swo | Bin 0 -> 16384 bytes chain/jsonrpc/res/tier1_network_info.html | 26 ------------------ 2 files changed, 26 deletions(-) create mode 100644 chain/jsonrpc/res/.tier1_network_info.html.swo diff --git a/chain/jsonrpc/res/.tier1_network_info.html.swo b/chain/jsonrpc/res/.tier1_network_info.html.swo new file mode 100644 index 0000000000000000000000000000000000000000..9784efb26adedd33986c5db87ab41a80610e8a26 GIT binary patch literal 16384 zcmeI3Uu+yl9mj{3LJOn~@X!}3O}3GI*PeInhCu7wxeZZTjPkFs8~*E9@6P$wUhf_= zv$ju_`SU=5@IchOK#KxuA1WGwcm^7f5E3mCsPG6t_j_y2a}IQ zlTJ+^cfI$;@!Iq$8QWp(x#38*Po)Jqk#MCKOW}BJH;9~76-Tn;IZ`M`2SUy^BcV5A zxz-G#R&2NR`e;ET<(8MF0;K|1qQD+@;I3IS)o-`<@pr!Cp)1K$rYRLD6(|)b6(|)b z6(|)b6(|)b75E=fKzFWVpGI4*%i8n)?EHq2^Yz*FN3!!m!Sj9D{jZHY&o0YTsX(bf zsX(bfsX(bfsX(bfsX(bfsX(bfsX(c~e?S4(XKWVru2aB|@Bj1o|F5?&_80I9cm{j| zycf0E57CZ*N3f94m;JLRlb{2%-6gUaq z1%CDx#?FD`;H8@w`!RS5dp;#A@wmU+|X5jNigJ&PB{9#s<*>|;T`$D@xDEy``mXnpH(ymUF zJ@k(hYf-!zH9Io)6HiEGw_-&|w1&0cgZx=qHCQG3c85QRy;d&LeUDd0QG%GBb+S8MnyPg*(ec{JfHY8^Hk1AO{ z)iiyO3!2?67SwV0nEc#}BXnYzFb` z!qfOTzMi=X(lUrvf>t-J4F46? z4lv2CYN1-X-Wo(vZCCoc*CTY5Zg%jt7zw_A1edDPyVvySdbizbebnN2a@eJ!K=-JAW0J{mHaiI{gV$UW-78#CN$Fl?>EJd?USWMh8ITl)Y1mR-R)9Iu1|+9(^2wYlen!Lo8zKbZ*G zbq?4E?b+Sfz7+rG-|znrG5!;AZdw;`{G_&w|t7 zc5oAT1@ZkKz?Z>MuowIuasDsBli&%k0p1RNi8%i}NWh1|hrnL&BI5mTfMeh`@G@fk zAAobf1$Tk#!Apqyp9hz~GvNE+F>nU#0e{0@z<0q#@HDsp&Vet0&x6l^P4EC{fI64~ z9NYq4#vZ~?!9{QutblvLZQxJP@;UH0_#)T>4}$x^0dOa{1CZwXKzUrt3e=r+rm(t0 z{&qI~9SS!^dO;?v?ig=;;D)*8CNgSR!`?ckA?2Y1`O*oQUZ#I>Q}&bOPwKiopT*tW z#9ka00kL?M${3&g{y-|7uOV2iic=m*w-RVYBWqlo@NgES7N@{FQpCv@O~hH8?ifN! zP9bG+l2fUdH6a03_65KA`I&snsyNAE_^w#Rb|$C~b^^pVc9S}zp7lL57fyS&Fa8Hb z2t#f*XOJP=y*ZKooQW^s=S;kVu25jiXKBrhTw7c_z)jt4y9hbH=ZYJ(}X)HD2*m*?bu@J@U~;=Q0q? zO*Vp$|B`PR2Kz7nJQNd*?Dk_Psvk*a6QCbw?e_OgSFeGAkY80ZFgfAsI;QgQ#f9)oy=^m*?IY|VF%M} KL|t>chW`TVUO;UC literal 0 HcmV?d00001 diff --git a/chain/jsonrpc/res/tier1_network_info.html b/chain/jsonrpc/res/tier1_network_info.html index 9af6ca2e5a6..fd7a111a025 100644 --- a/chain/jsonrpc/res/tier1_network_info.html +++ b/chain/jsonrpc/res/tier1_network_info.html @@ -5,32 +5,6 @@