Skip to content

Commit cae19ea

Browse files
committed
Merge branch 'release_v4.7.6' into feature/test_isolated3
2 parents 735bccb + 729a99b commit cae19ea

7 files changed

Lines changed: 107 additions & 6 deletions

File tree

framework/src/main/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandler.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ private void check(PeerConnection peer, FetchInvDataMessage fetchInvDataMsg) thr
164164
throw new P2pException(TypeEnum.BAD_MESSAGE,
165165
"minBlockNum: " + minBlockNum + ", blockNum: " + blockNum);
166166
}
167+
if (blockNum > peer.getLastSyncBlockId().getNum()) {
168+
throw new P2pException(TypeEnum.BAD_MESSAGE,
169+
"maxBlockNum: " + peer.getLastSyncBlockId().getNum() + ", blockNum: " + blockNum);
170+
}
167171
if (peer.getSyncBlockIdCache().getIfPresent(hash) != null) {
168172
throw new P2pException(TypeEnum.BAD_MESSAGE,
169173
new BlockId(hash).getString() + " is exist");

framework/src/main/java/org/tron/core/net/peer/PeerConnection.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,11 @@ public void setBlockBothHave(BlockId blockId) {
172172
}
173173

174174
public boolean isIdle() {
175-
return advInvRequest.isEmpty() && syncBlockRequested.isEmpty() && syncChainRequested == null;
175+
return advInvRequest.isEmpty() && isSyncIdle();
176+
}
177+
178+
public boolean isSyncIdle() {
179+
return syncBlockRequested.isEmpty() && syncChainRequested == null;
176180
}
177181

178182
public void sendMessage(Message message) {

framework/src/main/java/org/tron/core/net/peer/PeerManager.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ private static void remove(PeerConnection peerConnection) {
9494
}
9595

9696
public static synchronized void sortPeers() {
97-
peers.sort(Comparator.comparingDouble(c -> c.getChannel().getAvgLatency()));
97+
try {
98+
peers.sort(Comparator.comparingLong(c -> c.getChannel().getAvgLatency()));
99+
} catch (Exception e) {
100+
logger.warn("Sort peers failed. {}", e.getMessage());
101+
}
98102
}
99103

100104
public static PeerConnection getPeerConnection(Channel channel) {

framework/src/main/java/org/tron/core/net/service/sync/SyncService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public void processBlock(PeerConnection peer, BlockMessage blockMessage) {
134134
blockJustReceived.put(blockMessage, peer);
135135
}
136136
handleFlag = true;
137-
if (peer.isIdle()) {
137+
if (peer.isSyncIdle()) {
138138
if (peer.getRemainNum() > 0
139139
&& peer.getSyncBlockToFetch().size() <= syncFetchBatchNum) {
140140
syncNext(peer);
@@ -226,7 +226,7 @@ private BlockId getBlockIdByNum(long num) throws P2pException {
226226
private void startFetchSyncBlock() {
227227
HashMap<PeerConnection, List<BlockId>> send = new HashMap<>();
228228
tronNetDelegate.getActivePeer().stream()
229-
.filter(peer -> peer.isNeedSyncFromPeer() && peer.isIdle())
229+
.filter(peer -> peer.isNeedSyncFromPeer() && peer.isSyncIdle())
230230
.filter(peer -> peer.isFetchAble())
231231
.forEach(peer -> {
232232
if (!send.containsKey(peer)) {

framework/src/test/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandlerTest.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import org.tron.core.net.service.adv.AdvService;
2222
import org.tron.protos.Protocol;
2323

24-
25-
2624
public class FetchInvDataMsgHandlerTest {
2725

2826
@Test
@@ -62,4 +60,37 @@ public void testProcessMessage() throws Exception {
6260
new FetchInvDataMessage(blockIds, Protocol.Inventory.InventoryType.BLOCK));
6361
Assert.assertNotNull(syncBlockIdCache.getIfPresent(blockId));
6462
}
63+
64+
@Test
65+
public void testSyncFetchCheck() {
66+
BlockCapsule.BlockId blockId = new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 10000L);
67+
List<Sha256Hash> blockIds = new LinkedList<>();
68+
blockIds.add(blockId);
69+
FetchInvDataMessage msg =
70+
new FetchInvDataMessage(blockIds, Protocol.Inventory.InventoryType.BLOCK);
71+
72+
PeerConnection peer = Mockito.mock(PeerConnection.class);
73+
Mockito.when(peer.isNeedSyncFromUs()).thenReturn(true);
74+
Cache<Item, Long> advInvSpread = CacheBuilder.newBuilder().maximumSize(100)
75+
.expireAfterWrite(1, TimeUnit.HOURS).recordStats().build();
76+
Mockito.when(peer.getAdvInvSpread()).thenReturn(advInvSpread);
77+
78+
FetchInvDataMsgHandler fetchInvDataMsgHandler = new FetchInvDataMsgHandler();
79+
80+
try {
81+
Mockito.when(peer.getLastSyncBlockId())
82+
.thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 1000L));
83+
fetchInvDataMsgHandler.processMessage(peer, msg);
84+
} catch (Exception e) {
85+
Assert.assertEquals(e.getMessage(), "maxBlockNum: 1000, blockNum: 10000");
86+
}
87+
88+
try {
89+
Mockito.when(peer.getLastSyncBlockId())
90+
.thenReturn(new BlockCapsule.BlockId(Sha256Hash.ZERO_HASH, 20000L));
91+
fetchInvDataMsgHandler.processMessage(peer, msg);
92+
} catch (Exception e) {
93+
Assert.assertEquals(e.getMessage(), "minBlockNum: 16000, blockNum: 10000");
94+
}
95+
}
6596
}

framework/src/test/java/org/tron/core/net/peer/PeerConnectionTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,36 @@ public void testIsIdle() {
9898
Assert.assertTrue(!f);
9999
}
100100

101+
@Test
102+
public void testIsSyncIdle() {
103+
PeerConnection peerConnection = new PeerConnection();
104+
boolean f = peerConnection.isSyncIdle();
105+
Assert.assertTrue(f);
106+
107+
Item item = new Item(Sha256Hash.ZERO_HASH, Protocol.Inventory.InventoryType.TRX);
108+
Long time = System.currentTimeMillis();
109+
peerConnection.getAdvInvRequest().put(item, time);
110+
f = peerConnection.isSyncIdle();
111+
Assert.assertTrue(f);
112+
113+
peerConnection.getAdvInvRequest().clear();
114+
f = peerConnection.isSyncIdle();
115+
Assert.assertTrue(f);
116+
117+
BlockCapsule.BlockId blockId = new BlockCapsule.BlockId();
118+
peerConnection.getSyncBlockRequested().put(blockId, time);
119+
f = peerConnection.isSyncIdle();
120+
Assert.assertTrue(!f);
121+
122+
peerConnection.getSyncBlockRequested().clear();
123+
f = peerConnection.isSyncIdle();
124+
Assert.assertTrue(f);
125+
126+
peerConnection.setSyncChainRequested(new Pair<>(new LinkedList<>(), time));
127+
f = peerConnection.isSyncIdle();
128+
Assert.assertTrue(!f);
129+
}
130+
101131
@Test
102132
public void testOnConnect() {
103133
PeerConnection peerConnection = new PeerConnection();

framework/src/test/java/org/tron/core/net/peer/PeerManagerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,32 @@ public void testGetPeers() throws Exception {
135135
Assert.assertEquals(2, peers.size());
136136
}
137137

138+
@Test
139+
public void testSortPeers() throws Exception {
140+
PeerConnection p1 = new PeerConnection();
141+
PeerConnection p2 = new PeerConnection();
142+
143+
List<PeerConnection> peers = new ArrayList<>();
144+
peers.add(p1);
145+
peers.add(p2);
146+
147+
Field field = PeerManager.class.getDeclaredField("peers");
148+
field.setAccessible(true);
149+
field.set(PeerManager.class, Collections.synchronizedList(peers));
150+
151+
PeerManager.sortPeers();
152+
153+
Channel c1 = new Channel();
154+
c1.updateAvgLatency(100000L);
155+
ReflectUtils.setFieldValue(p1, "channel", c1);
156+
157+
Channel c2 = new Channel();
158+
c2.updateAvgLatency(1000L);
159+
ReflectUtils.setFieldValue(p2, "channel", c2);
160+
161+
PeerManager.sortPeers();
162+
163+
Assert.assertEquals(PeerManager.getPeers().get(0), p2);
164+
}
165+
138166
}

0 commit comments

Comments
 (0)