Skip to content

Commit dceccc5

Browse files
Merge pull request #3701 from tronprotocol/release_4.1.3
merge Release 4.1.3 to master
2 parents ada332f + bb2704f commit dceccc5

File tree

35 files changed

+697
-70
lines changed

35 files changed

+697
-70
lines changed

chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ public class TransactionCapsule implements ProtoCapsule<Transaction> {
102102
@Getter
103103
@Setter
104104
private long time;
105+
@Getter
106+
@Setter
107+
private long order;
105108

106109
/**
107110
* constructor TransactionCapsule.

chainbase/src/main/java/org/tron/core/db/TransactionTrace.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,16 @@ public void exec()
181181
runtime.execute(transactionContext);
182182
setBill(transactionContext.getProgramResult().getEnergyUsed());
183183

184-
if (TrxType.TRX_PRECOMPILED_TYPE != trxType) {
185-
if (contractResult.OUT_OF_TIME
186-
.equals(receipt.getResult())) {
187-
setTimeResultType(TimeResultType.OUT_OF_TIME);
188-
} else if (System.currentTimeMillis() - txStartTimeInMs
189-
> CommonParameter.getInstance()
190-
.getLongRunningTime()) {
191-
setTimeResultType(TimeResultType.LONG_RUNNING);
192-
}
193-
}
184+
// if (TrxType.TRX_PRECOMPILED_TYPE != trxType) {
185+
// if (contractResult.OUT_OF_TIME
186+
// .equals(receipt.getResult())) {
187+
// setTimeResultType(TimeResultType.OUT_OF_TIME);
188+
// } else if (System.currentTimeMillis() - txStartTimeInMs
189+
// > CommonParameter.getInstance()
190+
// .getLongRunningTime()) {
191+
// setTimeResultType(TimeResultType.LONG_RUNNING);
192+
// }
193+
// }
194194
}
195195

196196
public void finalization() throws ContractExeException {

common/src/main/java/org/tron/common/parameter/CommonParameter.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,13 @@ public class CommonParameter {
461461
@Parameter(names = {"--history-balance-lookup"})
462462
public boolean historyBalanceLookup = false;
463463

464+
@Getter
465+
@Setter
466+
public boolean openPrintLog = true;
467+
@Getter
468+
@Setter
469+
public boolean openTransactionSort = false;
470+
464471
private static double calcMaxTimeRatio() {
465472
//return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1)));
466473
return 5.0;

common/src/main/java/org/tron/core/Constant.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ public class Constant {
273273
public static final String METRICS_REPORT_INTERVAL = "node.metrics.influxdb.metricsReportInterval";
274274

275275
public static final String HISTORY_BALANCE_LOOKUP = "storage.balance.history.lookup";
276+
public static final String OPEN_PRINT_LOG = "node.openPrintLog";
277+
public static final String OPEN_TRANSACTION_SORT = "node.openTransactionSort";
276278

277279
public static final String LOCAL_HOST = "127.0.0.1";
278280
}

framework/src/main/java/org/tron/core/config/args/Args.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ public static void clearParam() {
185185
PARAMETER.allowTvmStake = 0;
186186
PARAMETER.allowTvmAssetIssue = 0;
187187
PARAMETER.historyBalanceLookup = false;
188+
PARAMETER.openPrintLog = true;
189+
PARAMETER.openTransactionSort = false;
188190
}
189191

190192
/**
@@ -744,6 +746,11 @@ public static void setParam(final String[] args, final String confFileName) {
744746
PARAMETER.historyBalanceLookup = config.hasPath(Constant.HISTORY_BALANCE_LOOKUP) && config
745747
.getBoolean(Constant.HISTORY_BALANCE_LOOKUP);
746748

749+
PARAMETER.openPrintLog = config.hasPath(Constant.OPEN_PRINT_LOG) && config
750+
.getBoolean(Constant.OPEN_PRINT_LOG);
751+
PARAMETER.openTransactionSort = config.hasPath(Constant.OPEN_TRANSACTION_SORT) && config
752+
.getBoolean(Constant.OPEN_TRANSACTION_SORT);
753+
747754
logConfig();
748755
}
749756

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

Lines changed: 76 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
import com.google.protobuf.ByteString;
1717
import java.util.ArrayList;
1818
import java.util.Arrays;
19+
import java.util.Collection;
1920
import java.util.Collections;
21+
import java.util.Comparator;
2022
import java.util.HashSet;
21-
import java.util.Iterator;
2223
import java.util.LinkedList;
2324
import java.util.List;
2425
import java.util.Objects;
@@ -32,9 +33,11 @@
3233
import java.util.concurrent.Executors;
3334
import java.util.concurrent.Future;
3435
import java.util.concurrent.LinkedBlockingQueue;
36+
import java.util.concurrent.PriorityBlockingQueue;
3537
import java.util.concurrent.TimeUnit;
3638
import java.util.concurrent.atomic.AtomicInteger;
3739
import java.util.concurrent.atomic.AtomicLong;
40+
import java.util.concurrent.atomic.AtomicReference;
3841
import java.util.stream.Collectors;
3942
import java.util.stream.LongStream;
4043
import javax.annotation.PostConstruct;
@@ -205,7 +208,7 @@ public class Manager {
205208
@Getter
206209
private ChainBaseManager chainBaseManager;
207210
// transactions cache
208-
private List<TransactionCapsule> pendingTransactions;
211+
private BlockingQueue<TransactionCapsule> pendingTransactions;
209212
@Getter
210213
private AtomicInteger shieldedTransInPendingCounts = new AtomicInteger(0);
211214
// transactions popped
@@ -224,7 +227,10 @@ public class Manager {
224227
TransactionCapsule tx = null;
225228
try {
226229
tx = getRePushTransactions().peek();
227-
if (tx != null) {
230+
if (tx != null && System.currentTimeMillis() - tx.getTime() >= Args.getInstance()
231+
.getPendingTransactionTimeout()) {
232+
logger.warn("[timeout] remove tx from rePush, txId:{}", tx.getTransactionId());
233+
} else if (tx != null) {
228234
this.rePush(tx);
229235
} else {
230236
TimeUnit.MILLISECONDS.sleep(SLEEP_TIME_OUT);
@@ -319,7 +325,7 @@ public BlockIndexStore getBlockIndexStore() {
319325
return chainBaseManager.getBlockIndexStore();
320326
}
321327

322-
public List<TransactionCapsule> getPendingTransactions() {
328+
public BlockingQueue<TransactionCapsule> getPendingTransactions() {
323329
return this.pendingTransactions;
324330
}
325331

@@ -339,6 +345,9 @@ public void stopRePushTriggerThread() {
339345
isRunTriggerCapsuleProcessThread = false;
340346
}
341347

348+
private Comparator downComparator = (Comparator<TransactionCapsule>) (o1, o2) -> Long
349+
.compare(o2.getOrder(), o1.getOrder());
350+
342351
@PostConstruct
343352
public void init() {
344353
Message.setDynamicPropertiesStore(this.getDynamicPropertiesStore());
@@ -353,8 +362,13 @@ public void init() {
353362
this.setMerkleContainer(
354363
merkleContainer.createInstance(chainBaseManager.getMerkleTreeStore(),
355364
chainBaseManager.getMerkleTreeIndexStore()));
356-
this.pendingTransactions = Collections.synchronizedList(Lists.newArrayList());
357-
this.rePushTransactions = new LinkedBlockingQueue<>();
365+
if (Args.getInstance().isOpenTransactionSort()) {
366+
this.pendingTransactions = new PriorityBlockingQueue(2000, downComparator);
367+
this.rePushTransactions = new PriorityBlockingQueue<>(2000, downComparator);
368+
} else {
369+
this.pendingTransactions = new LinkedBlockingQueue<>();
370+
this.rePushTransactions = new LinkedBlockingQueue<>();
371+
}
358372
this.triggerCapsuleQueue = new LinkedBlockingQueue<>();
359373
chainBaseManager.setMerkleContainer(getMerkleContainer());
360374
chainBaseManager.setMortgageService(mortgageService);
@@ -1182,7 +1196,8 @@ public TransactionInfo processTransaction(final TransactionCapsule trxCap, Block
11821196
trace.getRuntimeResult().getResultCode().name());
11831197
chainBaseManager.getBalanceTraceStore().resetCurrentTransactionTrace();
11841198
}
1185-
1199+
//set the sort order
1200+
trxCap.setOrder(transactionInfo.getFee());
11861201
return transactionInfo.getInstance();
11871202
}
11881203

@@ -1216,13 +1231,21 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long
12161231

12171232
Set<String> accountSet = new HashSet<>();
12181233
AtomicInteger shieldedTransCounts = new AtomicInteger(0);
1219-
Iterator<TransactionCapsule> iterator = pendingTransactions.iterator();
1220-
while (iterator.hasNext() || rePushTransactions.size() > 0) {
1234+
while (pendingTransactions.size() > 0 || rePushTransactions.size() > 0) {
12211235
boolean fromPending = false;
12221236
TransactionCapsule trx;
1223-
if (iterator.hasNext()) {
1224-
fromPending = true;
1225-
trx = iterator.next();
1237+
if (pendingTransactions.size() > 0) {
1238+
trx = pendingTransactions.peek();
1239+
if (Args.getInstance().isOpenTransactionSort()) {
1240+
TransactionCapsule trxRepush = rePushTransactions.peek();
1241+
if (trxRepush == null || trx.getOrder() >= trxRepush.getOrder()) {
1242+
fromPending = true;
1243+
} else {
1244+
trx = rePushTransactions.poll();
1245+
}
1246+
} else {
1247+
fromPending = true;
1248+
}
12261249
} else {
12271250
trx = rePushTransactions.poll();
12281251
}
@@ -1268,10 +1291,11 @@ public synchronized BlockCapsule generateBlock(Miner miner, long blockTime, long
12681291
transactionRetCapsule.addTransactionInfo(result);
12691292
}
12701293
if (fromPending) {
1271-
iterator.remove();
1294+
pendingTransactions.poll();
12721295
}
12731296
} catch (Exception e) {
1274-
logger.error("Process trx failed when generating block: {}", e.getMessage());
1297+
logger.error("Process trx {} failed when generating block: {}", trx.getTransactionId(),
1298+
e.getMessage());
12751299
}
12761300
}
12771301

@@ -1778,4 +1802,42 @@ public Boolean call() throws ValidateSignatureException {
17781802
return true;
17791803
}
17801804
}
1805+
1806+
public TransactionCapsule getTxFromPending(String txId) {
1807+
AtomicReference<TransactionCapsule> transactionCapsule = new AtomicReference<>();
1808+
Sha256Hash txHash = Sha256Hash.wrap(ByteArray.fromHexString(txId));
1809+
pendingTransactions.forEach(tx -> {
1810+
if (tx.getTransactionId().equals(txHash)) {
1811+
transactionCapsule.set(tx);
1812+
return;
1813+
}
1814+
});
1815+
if (transactionCapsule.get() != null) {
1816+
return transactionCapsule.get();
1817+
}
1818+
rePushTransactions.forEach(tx -> {
1819+
if (tx.getTransactionId().equals(txHash)) {
1820+
transactionCapsule.set(tx);
1821+
return;
1822+
}
1823+
});
1824+
return transactionCapsule.get();
1825+
}
1826+
1827+
public Collection<String> getTxListFromPending() {
1828+
Set<String> result = new HashSet<>();
1829+
pendingTransactions.forEach(tx -> {
1830+
result.add(tx.getTransactionId().toString());
1831+
});
1832+
rePushTransactions.forEach(tx -> {
1833+
result.add(tx.getTransactionId().toString());
1834+
});
1835+
return result;
1836+
}
1837+
1838+
public long getPendingSize() {
1839+
long value = getPendingTransactions().size() + getRePushTransactions().size()
1840+
+ getPoppedTransactions().size();
1841+
return value;
1842+
}
17811843
}

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

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,44 @@
11
package org.tron.core.db;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
5-
import lombok.Getter;
63
import lombok.extern.slf4j.Slf4j;
74
import org.tron.core.capsule.TransactionCapsule;
85
import org.tron.core.config.args.Args;
9-
import org.tron.core.db.TransactionTrace.TimeResultType;
10-
import org.tron.core.metrics.MetricsKey;
11-
import org.tron.core.metrics.MetricsUtil;
126

137
@Slf4j(topic = "DB")
148
public class PendingManager implements AutoCloseable {
159

16-
@Getter
17-
private List<TransactionCapsule> tmpTransactions = new ArrayList<>();
1810
private Manager dbManager;
1911
private long timeout = Args.getInstance().getPendingTransactionTimeout();
2012

2113
public PendingManager(Manager db) {
2214
this.dbManager = db;
23-
db.getPendingTransactions().forEach(transactionCapsule -> {
24-
if (System.currentTimeMillis() - transactionCapsule.getTime() < timeout) {
25-
tmpTransactions.add(transactionCapsule);
26-
}
27-
});
28-
29-
if (db.getPendingTransactions().size() > tmpTransactions.size()) {
30-
MetricsUtil.meterMark(MetricsKey.BLOCKCHAIN_MISSED_TRANSACTION,
31-
db.getPendingTransactions().size() - tmpTransactions.size());
32-
}
33-
34-
db.getPendingTransactions().clear();
3515
db.getSession().reset();
3616
db.getShieldedTransInPendingCounts().set(0);
3717
}
3818

3919
@Override
4020
public void close() {
4121

42-
for (TransactionCapsule tx : tmpTransactions) {
22+
for (TransactionCapsule tx : dbManager.getPendingTransactions()) {
4323
txIteration(tx);
4424
}
45-
tmpTransactions.clear();
46-
25+
dbManager.getPendingTransactions().clear();
4726
for (TransactionCapsule tx : dbManager.getPoppedTransactions()) {
27+
tx.setTime(System.currentTimeMillis());
4828
txIteration(tx);
4929
}
5030
dbManager.getPoppedTransactions().clear();
31+
if (Args.getInstance().isOpenPrintLog()) {
32+
logger.warn("pending tx size:{}", dbManager.getRePushTransactions().size());
33+
}
5134
}
5235

5336
private void txIteration(TransactionCapsule tx) {
5437
try {
55-
if (tx.getTrxTrace() != null
56-
&& tx.getTrxTrace().getTimeResultType().equals(TimeResultType.NORMAL)) {
38+
if (System.currentTimeMillis() - tx.getTime() < timeout) {
5739
dbManager.getRePushTransactions().put(tx);
40+
} else if (Args.getInstance().isOpenPrintLog()) {
41+
logger.warn("[timeout] remove tx from pending, txId:{}", tx.getTransactionId());
5842
}
5943
} catch (InterruptedException e) {
6044
logger.error(e.getMessage());

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.springframework.beans.factory.annotation.Autowired;
55
import org.springframework.stereotype.Component;
66
import org.tron.common.utils.Sha256Hash;
7+
import org.tron.core.config.args.Args;
78
import org.tron.core.net.TronNetDelegate;
89
import org.tron.core.net.message.InventoryMessage;
910
import org.tron.core.net.message.TronMessage;
@@ -58,12 +59,18 @@ private boolean check(PeerConnection peer, InventoryMessage inventoryMessage) {
5859
if (count > maxCountIn10s) {
5960
logger.warn("Drop inv: {} size: {} from Peer {}, Inv count: {} is overload.",
6061
type, size, peer.getInetAddress(), count);
62+
if (Args.getInstance().isOpenPrintLog()) {
63+
logger.warn("[overload]Drop tx list is: {}", inventoryMessage.getHashList());
64+
}
6165
return false;
6266
}
6367

6468
if (transactionsMsgHandler.isBusy()) {
6569
logger.warn("Drop inv: {} size: {} from Peer {}, transactionsMsgHandler is busy.",
6670
type, size, peer.getInetAddress());
71+
if (Args.getInstance().isOpenPrintLog()) {
72+
logger.warn("[isBusy]Drop tx list is: {}", inventoryMessage.getHashList());
73+
}
6774
return false;
6875
}
6976
}

0 commit comments

Comments
 (0)