Skip to content

Commit 7a8ceee

Browse files
committed
fix(net):merge 4.7.2
2 parents cd9e534 + cc9a944 commit 7a8ceee

137 files changed

Lines changed: 1961 additions & 4661 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.util.Map;
1717
import java.util.Objects;
1818
import java.util.concurrent.ExecutionException;
19+
import java.util.concurrent.ExecutorService;
1920
import java.util.concurrent.Executors;
2021
import java.util.concurrent.Future;
2122
import java.util.concurrent.ScheduledExecutorService;
@@ -122,6 +123,7 @@ public void close() {
122123
exitThread.interrupt();
123124
// help GC
124125
exitThread = null;
126+
flushServices.values().forEach(ExecutorService::shutdown);
125127
} catch (Exception e) {
126128
logger.warn("exitThread interrupt error", e);
127129
}

framework/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ dependencies {
8686
compile "io.vavr:vavr:0.9.2"
8787
compile group: 'org.pf4j', name: 'pf4j', version: '2.5.0'
8888

89+
testImplementation group: 'org.springframework', name: 'spring-test', version: '5.2.0.RELEASE'
90+
8991
compile group: 'org.zeromq', name: 'jeromq', version: '0.5.0'
9092
compile project(":chainbase")
9193
compile project(":protocol")

framework/src/main/java/org/tron/core/capsule/utils/RLP.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public static long decodeLong(byte[] data, int index) {
204204
return value;
205205
}
206206

207-
private static String decodeStringItem(byte[] data, int index) {
207+
public static String decodeStringItem(byte[] data, int index) {
208208

209209
final byte[] valueBytes = decodeItemBytes(data, index);
210210

@@ -229,12 +229,12 @@ public static BigInteger decodeBigInteger(byte[] data, int index) {
229229
}
230230
}
231231

232-
private static byte[] decodeByteArray(byte[] data, int index) {
232+
public static byte[] decodeByteArray(byte[] data, int index) {
233233

234234
return decodeItemBytes(data, index);
235235
}
236236

237-
private static int nextItemLength(byte[] data, int index) {
237+
public static int nextItemLength(byte[] data, int index) {
238238

239239
if (index >= data.length) {
240240
return -1;

framework/src/main/java/org/tron/core/db/Manager.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,8 @@ public class Manager {
193193
@Getter
194194
@Setter
195195
private boolean isSyncMode;
196-
196+
@Getter
197+
private Object forkLock = new Object();
197198
// map<Long, IncrementalMerkleTree>
198199
@Getter
199200
@Setter
@@ -1269,8 +1270,9 @@ public void pushBlock(final BlockCapsule block)
12691270
chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp(),
12701271
khaosDb.getHead(), khaosDb.getMiniStore().size(),
12711272
khaosDb.getMiniUnlinkedStore().size());
1272-
1273-
switchFork(newBlock);
1273+
synchronized (forkLock) {
1274+
switchFork(newBlock);
1275+
}
12741276
logger.info(SAVE_BLOCK, newBlock);
12751277

12761278
logger.warn(
@@ -1913,6 +1915,7 @@ public NullifierStore getNullifierStore() {
19131915
public void closeAllStore() {
19141916
logger.info("******** Begin to close db. ********");
19151917
chainBaseManager.closeAllStore();
1918+
validateSignService.shutdown();
19161919
logger.info("******** End to close db. ********");
19171920
}
19181921

framework/src/main/java/org/tron/core/net/TronNetDelegate.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,4 +349,8 @@ public boolean allowPBFT() {
349349
return chainBaseManager.getDynamicPropertiesStore().allowPBFT();
350350
}
351351

352+
public Object getForkLock() {
353+
return dbManager.getForkLock();
354+
}
355+
352356
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public void init() {
5353
}
5454

5555
public void close() {
56+
trxHandlePool.shutdown();
5657
smartContractExecutor.shutdown();
5758
}
5859

framework/src/main/java/org/tron/core/net/service/nodepersist/NodePersistService.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,34 @@
44
import java.util.ArrayList;
55
import java.util.Comparator;
66
import java.util.List;
7+
import java.util.Objects;
78
import java.util.Timer;
89
import java.util.TimerTask;
910
import lombok.extern.slf4j.Slf4j;
11+
import org.springframework.beans.factory.annotation.Autowired;
1012
import org.springframework.stereotype.Component;
13+
import org.tron.common.parameter.CommonParameter;
1114
import org.tron.common.utils.ByteArray;
1215
import org.tron.common.utils.JsonUtil;
13-
import org.tron.core.ChainBaseManager;
1416
import org.tron.core.capsule.BytesCapsule;
15-
import org.tron.core.config.args.Args;
17+
import org.tron.core.db.CommonStore;
1618
import org.tron.core.net.TronNetService;
1719
import org.tron.p2p.discover.Node;
1820

1921
@Slf4j(topic = "net")
2022
@Component
2123
public class NodePersistService {
2224
private static final byte[] DB_KEY_PEERS = "peers".getBytes();
23-
private static final long DB_COMMIT_RATE = 1 * 60 * 1000L;
25+
private static final long DB_COMMIT_RATE = 60 * 1000L;
2426
private static final int MAX_NODES_WRITE_TO_DB = 30;
25-
26-
private boolean isNodePersist = Args.getInstance().isNodeDiscoveryPersist();
27-
28-
private ChainBaseManager chainBaseManager = ChainBaseManager.getInstance();
29-
30-
private Timer nodePersistTaskTimer = new Timer("NodePersistTaskTimer");
27+
private final boolean isNodePersist = CommonParameter.getInstance().isNodeDiscoveryPersist();
28+
@Autowired
29+
private CommonStore commonStore;
30+
private Timer nodePersistTaskTimer;
3131

3232
public void init() {
3333
if (isNodePersist) {
34+
nodePersistTaskTimer = new Timer("NodePersistTaskTimer");
3435
nodePersistTaskTimer.scheduleAtFixedRate(new TimerTask() {
3536
@Override
3637
public void run() {
@@ -41,6 +42,9 @@ public void run() {
4142
}
4243

4344
public void close() {
45+
if (Objects.isNull(nodePersistTaskTimer)) {
46+
return;
47+
}
4448
try {
4549
nodePersistTaskTimer.cancel();
4650
} catch (Exception e) {
@@ -51,7 +55,7 @@ public void close() {
5155
public List<InetSocketAddress> dbRead() {
5256
List<InetSocketAddress> nodes = new ArrayList<>();
5357
try {
54-
byte[] nodeBytes = chainBaseManager.getCommonStore().get(DB_KEY_PEERS).getData();
58+
byte[] nodeBytes = commonStore.get(DB_KEY_PEERS).getData();
5559
if (ByteArray.isEmpty(nodeBytes)) {
5660
return nodes;
5761
}
@@ -83,8 +87,7 @@ private void dbWrite() {
8387

8488
logger.info("Write nodes to store: {}/{} nodes", batch.size(), tableNodes.size());
8589

86-
chainBaseManager.getCommonStore()
87-
.put(DB_KEY_PEERS, new BytesCapsule(JsonUtil.obj2Json(dbNodes).getBytes()));
90+
commonStore.put(DB_KEY_PEERS, new BytesCapsule(JsonUtil.obj2Json(dbNodes).getBytes()));
8891
} catch (Exception e) {
8992
logger.warn("DB write nodes failed, {}", e.getMessage());
9093
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.tron.core.capsule.BlockCapsule.BlockId;
2424
import org.tron.core.config.Parameter.NetConstants;
2525
import org.tron.core.config.args.Args;
26-
import org.tron.core.exception.BadBlockException;
2726
import org.tron.core.exception.P2pException;
2827
import org.tron.core.exception.P2pException.TypeEnum;
2928
import org.tron.core.net.TronNetDelegate;
@@ -114,7 +113,10 @@ public void syncNext(PeerConnection peer) {
114113
logger.warn("Peer {} is in sync", peer.getInetSocketAddress());
115114
return;
116115
}
117-
LinkedList<BlockId> chainSummary = getBlockChainSummary(peer);
116+
LinkedList<BlockId> chainSummary;
117+
synchronized (tronNetDelegate.getForkLock()) {
118+
chainSummary = getBlockChainSummary(peer);
119+
}
118120
peer.setSyncChainRequested(new Pair<>(chainSummary, System.currentTimeMillis()));
119121
peer.sendMessage(new SyncBlockChainMessage(chainSummary));
120122
} catch (Exception e) {
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package org.tron.common;
2+
3+
import com.google.protobuf.ByteString;
4+
import java.io.File;
5+
import javax.annotation.Resource;
6+
import lombok.extern.slf4j.Slf4j;
7+
import org.apache.commons.lang3.StringUtils;
8+
import org.junit.AfterClass;
9+
import org.junit.runner.RunWith;
10+
import org.springframework.test.annotation.DirtiesContext;
11+
import org.springframework.test.context.ContextConfiguration;
12+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
13+
import org.tron.common.crypto.ECKey;
14+
import org.tron.common.parameter.CommonParameter;
15+
import org.tron.common.utils.FileUtil;
16+
import org.tron.common.utils.Sha256Hash;
17+
import org.tron.consensus.base.Param;
18+
import org.tron.core.ChainBaseManager;
19+
import org.tron.core.capsule.BlockCapsule;
20+
import org.tron.core.config.DefaultConfig;
21+
import org.tron.core.config.args.Args;
22+
import org.tron.core.db.Manager;
23+
import org.tron.protos.Protocol;
24+
25+
@Slf4j
26+
@RunWith(SpringJUnit4ClassRunner.class)
27+
@ContextConfiguration(classes = {DefaultConfig.class})
28+
@DirtiesContext
29+
public abstract class BaseTest {
30+
31+
protected static String dbPath;
32+
@Resource
33+
protected Manager dbManager;
34+
@Resource
35+
protected ChainBaseManager chainBaseManager;
36+
37+
@AfterClass
38+
public static void destroy() {
39+
Args.clearParam();
40+
if (StringUtils.isNotEmpty(dbPath) && FileUtil.deleteDir(new File(dbPath))) {
41+
logger.info("Release resources successful.");
42+
} else {
43+
logger.info("Release resources failure.");
44+
}
45+
}
46+
47+
public Protocol.Block getSignedBlock(ByteString witness, long time, byte[] privateKey) {
48+
long blockTime = System.currentTimeMillis() / 3000 * 3000;
49+
if (time != 0) {
50+
blockTime = time;
51+
} else {
52+
if (chainBaseManager.getHeadBlockId().getNum() != 0) {
53+
blockTime = chainBaseManager.getHeadBlockTimeStamp() + 3000;
54+
}
55+
}
56+
Param param = Param.getInstance();
57+
Param.Miner miner = param.new Miner(privateKey, witness, witness);
58+
BlockCapsule blockCapsule = dbManager
59+
.generateBlock(miner, time, System.currentTimeMillis() + 1000);
60+
Protocol.Block block = blockCapsule.getInstance();
61+
62+
Protocol.BlockHeader.raw raw = block.getBlockHeader().getRawData().toBuilder()
63+
.setParentHash(ByteString
64+
.copyFrom(chainBaseManager.getDynamicPropertiesStore()
65+
.getLatestBlockHeaderHash().getBytes()))
66+
.setNumber(chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1)
67+
.setTimestamp(blockTime)
68+
.setWitnessAddress(witness)
69+
.build();
70+
71+
ECKey ecKey = ECKey.fromPrivate(privateKey);
72+
assert ecKey != null;
73+
ECKey.ECDSASignature signature = ecKey.sign(Sha256Hash.of(CommonParameter
74+
.getInstance().isECKeyCryptoEngine(), raw.toByteArray()).getBytes());
75+
ByteString sign = ByteString.copyFrom(signature.toByteArray());
76+
77+
Protocol.BlockHeader blockHeader = block.getBlockHeader().toBuilder()
78+
.setRawData(raw)
79+
.setWitnessSignature(sign)
80+
.build();
81+
82+
return block.toBuilder().setBlockHeader(blockHeader).build();
83+
}
84+
}

framework/src/test/java/org/tron/common/runtime/InheritanceTest.java

Lines changed: 13 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
11
package org.tron.common.runtime;
22

3-
import java.io.File;
43
import lombok.extern.slf4j.Slf4j;
54
import org.bouncycastle.util.encoders.Hex;
6-
import org.junit.AfterClass;
7-
import org.junit.BeforeClass;
5+
import org.junit.Before;
86
import org.junit.Test;
97
import org.testng.Assert;
10-
import org.tron.common.application.Application;
11-
import org.tron.common.application.ApplicationFactory;
12-
import org.tron.common.application.TronApplicationContext;
13-
import org.tron.common.utils.FileUtil;
8+
import org.tron.common.BaseTest;
149
import org.tron.core.Constant;
1510
import org.tron.core.Wallet;
16-
import org.tron.core.config.DefaultConfig;
1711
import org.tron.core.config.args.Args;
18-
import org.tron.core.db.Manager;
1912
import org.tron.core.exception.ContractExeException;
2013
import org.tron.core.exception.ContractValidateException;
2114
import org.tron.core.exception.ReceiptCheckErrException;
@@ -25,54 +18,36 @@
2518
import org.tron.protos.Protocol.AccountType;
2619

2720
@Slf4j
28-
public class InheritanceTest {
21+
public class InheritanceTest extends BaseTest {
2922

30-
private static final String dbPath = "output_InheritanceTest";
3123
private static final String OWNER_ADDRESS;
32-
private static Runtime runtime;
33-
private static Manager dbManager;
34-
private static TronApplicationContext context;
35-
private static Application appT;
36-
private static RepositoryImpl repository;
24+
private RepositoryImpl repository;
25+
private static boolean init;
3726

3827
static {
28+
dbPath = "output_InheritanceTest";
3929
Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF);
40-
context = new TronApplicationContext(DefaultConfig.class);
41-
appT = ApplicationFactory.create(context);
4230
OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc";
4331
}
4432

4533
/**
4634
* Init data.
4735
*/
48-
@BeforeClass
49-
public static void init() {
50-
dbManager = context.getBean(Manager.class);
36+
@Before
37+
public void init() {
38+
if (init) {
39+
return;
40+
}
5141
repository = RepositoryImpl.createRoot(StoreFactory.getInstance());
5242
repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal);
5343
repository.addBalance(Hex.decode(OWNER_ADDRESS), 100000000);
54-
}
55-
56-
/**
57-
* Release resources.
58-
*/
59-
@AfterClass
60-
public static void destroy() {
61-
Args.clearParam();
62-
context.destroy();
63-
if (FileUtil.deleteDir(new File(dbPath))) {
64-
logger.info("Release resources successful.");
65-
} else {
66-
logger.info("Release resources failure.");
67-
}
44+
init = true;
6845
}
6946

7047
/**
7148
* pragma solidity ^0.4.19;
72-
*
7349
* contract foo { uint256 public id=10; function getNumber() returns (uint256){return 100;}
7450
* function getName() returns (string){ return "foo"; } }
75-
*
7651
* contract bar is foo { function getName() returns (string) { return "bar"; } function getId()
7752
* returns(uint256){return id;} }
7853
*/
@@ -119,7 +94,7 @@ public void inheritanceTest()
11994

12095
/* ========================== CALL getName() return child value ============================= */
12196
byte[] triggerData1 = TvmTestUtils.parseAbi("getName()", "");
122-
runtime = TvmTestUtils
97+
Runtime runtime = TvmTestUtils
12398
.triggerContractWholeProcessReturnContractAddress(callerAddress, contractAddress,
12499
triggerData1, 0, 1000000, repository, null);
125100

0 commit comments

Comments
 (0)