Skip to content

Commit 34eb577

Browse files
committed
Merge branch 'release_v4.7.6' into hotfix/set_block_both_have2
2 parents 343c5f6 + 729a99b commit 34eb577

9 files changed

Lines changed: 110 additions & 7 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
@@ -167,7 +167,11 @@ public void setBlockBothHave(BlockId blockId) {
167167
}
168168

169169
public boolean isIdle() {
170-
return advInvRequest.isEmpty() && syncBlockRequested.isEmpty() && syncChainRequested == null;
170+
return advInvRequest.isEmpty() && isSyncIdle();
171+
}
172+
173+
public boolean isSyncIdle() {
174+
return syncBlockRequested.isEmpty() && syncChainRequested == null;
171175
}
172176

173177
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/main/java/org/tron/core/services/filter/HttpInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
@Slf4j(topic = "httpInterceptor")
1919
public class HttpInterceptor implements Filter {
2020

21-
private String endpoint;
2221
private final int HTTP_SUCCESS = 200;
2322
private final int HTTP_BAD_REQUEST = 400;
2423
private final int HTTP_NOT_ACCEPTABLE = 406;
@@ -29,6 +28,7 @@ public void init(FilterConfig filterConfig) {
2928

3029
@Override
3130
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
31+
String endpoint = MetricLabels.UNDEFINED;
3232
try {
3333
if (!(request instanceof HttpServletRequest)) {
3434
chain.doFilter(request, response);

framework/src/test/java/org/tron/core/capsule/utils/MerkleTreeTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.stream.IntStream;
99
import lombok.extern.slf4j.Slf4j;
1010
import org.junit.Assert;
11+
import org.junit.Ignore;
1112
import org.junit.Rule;
1213
import org.junit.Test;
1314
import org.junit.rules.ExpectedException;
@@ -185,6 +186,7 @@ public void testAnyHashNum() {
185186
}
186187

187188
@Test
189+
@Ignore
188190
public void testConcurrent() {
189191
Sha256Hash root1 = Sha256Hash.wrap(
190192
ByteString.fromHex("6cb38b4f493db8bacf26123cd4253bbfc530c708b97b3747e782f64097c3c482"));

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)