Skip to content

Commit 49cc8a2

Browse files
wbwb
authored andcommitted
fix(api): correct node info and network metric mappings
Node and network API responses populated two fields from the wrong source values because of copy-and-paste mapping errors. Map needSyncFromPeer from the corresponding peer state and assign UDP inbound traffic to the udpInTraffic protobuf field.
1 parent 4a21592 commit 49cc8a2

4 files changed

Lines changed: 78 additions & 2 deletions

File tree

‎common/src/main/java/org/tron/common/entity/NodeInfo.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public Protocol.NodeInfo transferToProtoEntity() {
146146
peerInfoBuilder.setLastBlockUpdateTime(peerInfo.getLastBlockUpdateTime());
147147
peerInfoBuilder.setSyncFlag(peerInfo.isSyncFlag());
148148
peerInfoBuilder.setHeadBlockTimeWeBothHave(peerInfo.getHeadBlockTimeWeBothHave());
149-
peerInfoBuilder.setNeedSyncFromPeer(peerInfo.isSyncFlag());
149+
peerInfoBuilder.setNeedSyncFromPeer(peerInfo.isNeedSyncFromPeer());
150150
peerInfoBuilder.setNeedSyncFromUs(peerInfo.isNeedSyncFromUs());
151151
peerInfoBuilder.setHost(peerInfo.getHost());
152152
peerInfoBuilder.setPort(peerInfo.getPort());
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.tron.common.entity;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import org.junit.Assert;
6+
import org.junit.Test;
7+
import org.tron.protos.Protocol;
8+
9+
public class NodeInfoTest {
10+
11+
private PeerInfo newPeerInfo(boolean syncFlag, boolean needSyncFromPeer,
12+
boolean needSyncFromUs) {
13+
PeerInfo peerInfo = new PeerInfo();
14+
peerInfo.setSyncFlag(syncFlag);
15+
peerInfo.setNeedSyncFromPeer(needSyncFromPeer);
16+
peerInfo.setNeedSyncFromUs(needSyncFromUs);
17+
// string fields must be non-null, otherwise the protobuf setters throw NPE
18+
peerInfo.setLastSyncBlock("");
19+
peerInfo.setHost("127.0.0.1");
20+
peerInfo.setNodeId("");
21+
peerInfo.setHeadBlockWeBothHave("");
22+
peerInfo.setLocalDisconnectReason("");
23+
peerInfo.setRemoteDisconnectReason("");
24+
return peerInfo;
25+
}
26+
27+
/**
28+
* The protobuf conversion must map each peer flag from its own source field. A previous
29+
* copy-and-paste defect populated needSyncFromPeer from isSyncFlag(); distinct values for
30+
* syncFlag and needSyncFromPeer are required so that such a mismatch is detected.
31+
*/
32+
@Test
33+
public void testPeerFlagMappingIsIndependent() {
34+
NodeInfo nodeInfo = new NodeInfo();
35+
nodeInfo.setBlock("");
36+
nodeInfo.setSolidityBlock("");
37+
List<PeerInfo> peerList = new ArrayList<>();
38+
// syncFlag != needSyncFromPeer so the two fields cannot be confused
39+
peerList.add(newPeerInfo(false, true, false));
40+
peerList.add(newPeerInfo(true, false, true));
41+
nodeInfo.setPeerList(peerList);
42+
nodeInfo.setCheatWitnessInfoMap(new java.util.HashMap<>());
43+
44+
Protocol.NodeInfo proto = nodeInfo.transferToProtoEntity();
45+
46+
Assert.assertEquals(2, proto.getPeerInfoListCount());
47+
48+
Protocol.NodeInfo.PeerInfo peer0 = proto.getPeerInfoList(0);
49+
Assert.assertFalse(peer0.getSyncFlag());
50+
Assert.assertTrue(peer0.getNeedSyncFromPeer());
51+
Assert.assertFalse(peer0.getNeedSyncFromUs());
52+
53+
Protocol.NodeInfo.PeerInfo peer1 = proto.getPeerInfoList(1);
54+
Assert.assertTrue(peer1.getSyncFlag());
55+
Assert.assertFalse(peer1.getNeedSyncFromPeer());
56+
Assert.assertTrue(peer1.getNeedSyncFromUs());
57+
}
58+
}

‎framework/src/main/java/org/tron/core/metrics/net/NetMetricManager.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public Protocol.MetricsInfo.NetInfo getNetProtoInfo() {
181181
// udp
182182
RateInfo udpInTraffic = net.getUdpInTraffic();
183183
Protocol.MetricsInfo.RateInfo udpInTrafficInfo = udpInTraffic.toProtoEntity();
184-
netInfo.setTcpOutTraffic(udpInTrafficInfo);
184+
netInfo.setUdpInTraffic(udpInTrafficInfo);
185185
RateInfo udpOutTraffic = net.getUdpOutTraffic();
186186
Protocol.MetricsInfo.RateInfo udpOutTrafficInfo = udpOutTraffic.toProtoEntity();
187187
netInfo.setUdpOutTraffic(udpOutTrafficInfo);

‎framework/src/test/java/org/tron/core/metrics/MetricsApiServiceTest.java‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ protected void afterInit() {
3838

3939
@Test
4040
public void testProcessMessage() {
41+
MetricsUtil.getMeter(MetricsKey.NET_TCP_IN_TRAFFIC).mark(1000);
42+
MetricsUtil.getMeter(MetricsKey.NET_TCP_OUT_TRAFFIC).mark(2000);
43+
MetricsUtil.getMeter(MetricsKey.NET_UDP_IN_TRAFFIC).mark(4000);
44+
MetricsUtil.getMeter(MetricsKey.NET_UDP_OUT_TRAFFIC).mark(8000);
4145

4246
MetricsInfo m1 = metricsApiService.getMetricsInfo();
4347

@@ -79,6 +83,20 @@ public void testProcessMessage() {
7983
Assert.assertEquals(m1.getNet().getErrorProtoCount(), m2.getNet().getErrorProtoCount());
8084
Assert
8185
.assertEquals(m1.getNet().getValidConnectionCount(), m2.getNet().getValidConnectionCount());
86+
87+
long tcpIn = m1.getNet().getTcpInTraffic().getCount();
88+
long tcpOut = m1.getNet().getTcpOutTraffic().getCount();
89+
long udpIn = m1.getNet().getUdpInTraffic().getCount();
90+
long udpOut = m1.getNet().getUdpOutTraffic().getCount();
91+
92+
Assert.assertNotEquals(tcpOut, udpIn);
93+
Assert.assertNotEquals(tcpIn, tcpOut);
94+
Assert.assertNotEquals(udpIn, udpOut);
95+
96+
Assert.assertEquals(tcpIn, m2.getNet().getTcpInTraffic().getCount());
97+
Assert.assertEquals(tcpOut, m2.getNet().getTcpOutTraffic().getCount());
98+
Assert.assertEquals(udpIn, m2.getNet().getUdpInTraffic().getCount());
99+
Assert.assertEquals(udpOut, m2.getNet().getUdpOutTraffic().getCount());
82100
}
83101

84102
}

0 commit comments

Comments
 (0)