Skip to content

Commit 1984b2b

Browse files
authored
Merge pull request #1204 from tronprotocol/develop
add new RevokingDB impl
2 parents f756998 + 161aeb9 commit 1984b2b

File tree

76 files changed

+1932
-722
lines changed

Some content is hidden

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

76 files changed

+1932
-722
lines changed

.travis.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,5 @@ deploy:
2323
script: bash deploy.sh
2424
on:
2525
branch: develop
26-
after_deploy:
27-
- "./gradlew stest"
26+
2827

deploy.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#!/bin/bash
22
ssh [email protected] -p 22008 sh /home/tron/workspace/deploy_all.sh
3-
./gradlew stest
3+

src/main/java/org/tron/common/application/ApplicationImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void startup() {
7171
@Override
7272
public void shutdown() {
7373
System.err.println("******** begin to shutdown ********");
74-
synchronized (RevokingStore.getInstance()) {
74+
synchronized (dbManager.getRevokingStore()) {
7575
closeRevokingStore();
7676
closeAllStore();
7777
}
@@ -124,7 +124,7 @@ private void closeConnection() {
124124
}
125125

126126
private void closeRevokingStore() {
127-
RevokingStore.getInstance().shutdown();
127+
dbManager.getRevokingStore().shutdown();
128128
}
129129

130130
private void closeAllStore() {

src/main/java/org/tron/common/overlay/discover/node/NodeHandler.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.net.InetSocketAddress;
2121
import java.util.List;
2222
import java.util.concurrent.TimeUnit;
23+
import org.apache.commons.lang3.StringUtils;
2324
import org.slf4j.Logger;
2425
import org.slf4j.LoggerFactory;
2526
import org.spongycastle.util.encoders.Hex;
@@ -29,6 +30,7 @@
2930
import org.tron.common.net.udp.message.discover.NeighborsMessage;
3031
import org.tron.common.net.udp.message.discover.PingMessage;
3132
import org.tron.common.net.udp.message.discover.PongMessage;
33+
import org.tron.common.overlay.discover.node.statistics.NodeStatistics;
3234
import org.tron.core.config.args.Args;
3335

3436
/**
@@ -87,6 +89,7 @@ public enum State {
8789
private NodeManager nodeManager;
8890
private NodeStatistics nodeStatistics;
8991
private NodeHandler replaceCandidate;
92+
private InetSocketAddress inetSocketAddress;
9093
private volatile boolean waitForPong = false;
9194
private volatile boolean waitForNeighbors = false;
9295
private volatile int pingTrials = 3;
@@ -95,11 +98,12 @@ public enum State {
9598
public NodeHandler(Node node, NodeManager nodeManager) {
9699
this.node = node;
97100
this.nodeManager = nodeManager;
101+
this.inetSocketAddress = new InetSocketAddress(node.getHost(), node.getPort());
98102
changeState(State.Discovered);
99103
}
100104

101105
public InetSocketAddress getInetSocketAddress() {
102-
return new InetSocketAddress(node.getHost(), node.getPort());
106+
return inetSocketAddress;
103107
}
104108

105109
public void setSourceNode(Node sourceNode) {
@@ -302,5 +306,5 @@ public String toString() {
302306
return "NodeHandler[state: " + state + ", node: " + node.getHost() + ":" + node.getPort()
303307
+ ", id=" + (node.getId().length > 0 ? Hex.toHexString(node.getId(), 0, 4) : "empty") + "]";
304308
}
305-
309+
306310
}

src/main/java/org/tron/common/overlay/discover/node/NodeManager.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
*/
1818
package org.tron.common.overlay.discover.node;
1919

20+
import com.google.common.cache.Cache;
21+
import com.google.common.cache.CacheBuilder;
2022
import java.net.InetAddress;
2123
import java.net.InetSocketAddress;
2224
import java.util.ArrayList;
@@ -31,6 +33,7 @@
3133
import java.util.concurrent.ConcurrentHashMap;
3234
import java.util.concurrent.Executors;
3335
import java.util.concurrent.ScheduledExecutorService;
36+
import java.util.concurrent.TimeUnit;
3437
import java.util.function.Consumer;
3538
import java.util.function.Predicate;
3639
import org.slf4j.LoggerFactory;
@@ -45,16 +48,21 @@
4548
import org.tron.common.net.udp.message.discover.PongMessage;
4649
import org.tron.common.overlay.discover.DiscoverListener;
4750
import org.tron.common.overlay.discover.node.NodeHandler.State;
51+
import org.tron.common.overlay.discover.node.statistics.NodeStatistics;
4852
import org.tron.common.overlay.discover.table.NodeTable;
4953
import org.tron.common.utils.CollectionUtils;
5054
import org.tron.core.config.args.Args;
5155
import org.tron.core.db.Manager;
56+
import org.tron.protos.Protocol.ReasonCode;
5257

5358
@Component
5459
public class NodeManager implements EventHandler {
5560

5661
private static final org.slf4j.Logger logger = LoggerFactory.getLogger("NodeManager");
5762

63+
private Cache<InetSocketAddress, NodeHandler> badNodes = CacheBuilder.newBuilder().maximumSize(10000)
64+
.expireAfterWrite(1, TimeUnit.HOURS).recordStats().build();
65+
5866
private Args args = Args.getInstance();
5967

6068
private Manager dbManager;
@@ -226,12 +234,16 @@ public void handleEvent(UdpEvent udpEvent) {
226234
InetSocketAddress sender = udpEvent.getAddress();
227235

228236
Node n = new Node(m.getFrom().getId(), sender.getHostString(), sender.getPort());
229-
230237
if (inboundOnlyFromKnownNodes && !hasNodeHandler(n)) {
231-
logger.debug("Inbound packet from unknown peer {}.", sender.getAddress());
238+
logger.warn("Receive packet from unknown node {}.", sender.getAddress());
232239
return;
233240
}
241+
234242
NodeHandler nodeHandler = getNodeHandler(n);
243+
if (badNodes.getIfPresent(nodeHandler.getInetSocketAddress()) != null){
244+
logger.warn("Receive packet from bad node {}.", sender.getAddress());
245+
return;
246+
}
235247

236248
switch (m.getType()) {
237249
case DISCOVER_PING:
@@ -247,6 +259,7 @@ public void handleEvent(UdpEvent udpEvent) {
247259
nodeHandler.handleNeighbours((NeighborsMessage) m);
248260
break;
249261
}
262+
calculateMsgCount(nodeHandler);
250263
}
251264

252265
public void sendOutbound(UdpEvent udpEvent) {
@@ -370,4 +383,17 @@ void checkAll() {
370383
}
371384
}
372385

386+
private void calculateMsgCount(NodeHandler nodeHandler){
387+
int interval = 10;
388+
int maxCount = 10;
389+
NodeStatistics statistics = nodeHandler.getNodeStatistics();
390+
int count = statistics.discoverInPing.getCount(interval) + statistics.discoverInPong.getCount(interval)
391+
+ statistics.discoverInFind.getCount(interval) + statistics.discoverInNeighbours.getCount(interval);
392+
if (count > maxCount){
393+
logger.warn("UDP attack found: {}.", nodeHandler);
394+
badNodes.put(nodeHandler.getInetSocketAddress(), nodeHandler);
395+
table.dropNode(nodeHandler.getNode());
396+
}
397+
}
398+
373399
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package org.tron.common.overlay.discover.node.statistics;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
5+
@Slf4j
6+
public class MessageCountStatistics {
7+
8+
private static int SIZE = 60;
9+
10+
private int [] szCount = new int[SIZE];
11+
12+
private long indexTime = System.currentTimeMillis() / 1000;
13+
14+
private int index = (int)(indexTime % SIZE);
15+
16+
private long totalCount = 0;
17+
18+
private void update(){
19+
long time = System.currentTimeMillis() / 1000;
20+
long gap = time - indexTime;
21+
int k = gap > SIZE ? SIZE : (int)gap;
22+
if (k > 0){
23+
for (int i = 1; i <= k; i++){
24+
szCount[(index + i) % SIZE] = 0;
25+
}
26+
index = (int)(time % SIZE);
27+
indexTime = time;
28+
}
29+
}
30+
31+
public void add() {
32+
update();
33+
szCount[index]++;
34+
totalCount++;
35+
}
36+
37+
public int getCount(int interval){
38+
if (interval > SIZE){
39+
logger.warn("Param interval({}) is gt SIZE({})", interval, SIZE);
40+
return 0;
41+
}
42+
update();
43+
int count = 0;
44+
for (int i = 0; i < interval; i++){
45+
count += szCount[(SIZE + index - i) % SIZE];
46+
}
47+
return count;
48+
}
49+
50+
public long getTotalCount() {
51+
return totalCount;
52+
}
53+
}

src/main/java/org/tron/common/overlay/discover/node/NodeStatistics.java renamed to src/main/java/org/tron/common/overlay/discover/node/statistics/NodeStatistics.java

Lines changed: 23 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616
* along with the ethereumJ library. If not, see <http://www.gnu.org/licenses/>.
1717
*/
1818

19-
package org.tron.common.overlay.discover.node;
19+
package org.tron.common.overlay.discover.node.statistics;
2020

2121
import static java.lang.Math.min;
2222

23+
import java.util.Date;
2324
import java.util.concurrent.atomic.AtomicLong;
25+
import org.joda.time.DateTime;
26+
import org.tron.common.overlay.discover.node.Node;
2427
import org.tron.protos.Protocol.ReasonCode;
2528

2629
public class NodeStatistics {
@@ -29,51 +32,32 @@ public class NodeStatistics {
2932
public final static long TOO_MANY_PEERS_PENALIZE_TIMEOUT = 60 * 1000L;
3033
private static final long CLEAR_CYCLE_TIME = 60 * 60 * 1000L;
3134

32-
public class StatHandler {
33-
34-
private AtomicLong count = new AtomicLong(0);
35-
36-
public void add() {
37-
count.incrementAndGet();
38-
}
39-
40-
public void add(long delta) {
41-
count.addAndGet(delta);
42-
}
43-
44-
public long get() {
45-
return count.get();
46-
}
47-
48-
public String toString() {
49-
return count.toString();
50-
}
51-
}
52-
5335
private boolean isPredefined = false;
5436

5537
private int persistedReputation = 0;
5638

5739
private int disconnectTimes = 0;
5840

5941
// discovery stat
60-
public final StatHandler discoverOutPing = new StatHandler();
61-
public final StatHandler discoverInPong = new StatHandler();
62-
public final StatHandler discoverOutPong = new StatHandler();
63-
public final StatHandler discoverInPing = new StatHandler();
64-
public final StatHandler discoverInFind = new StatHandler();
65-
public final StatHandler discoverOutFind = new StatHandler();
66-
public final StatHandler discoverInNeighbours = new StatHandler();
67-
public final StatHandler discoverOutNeighbours = new StatHandler();
42+
public final MessageCountStatistics discoverInPing = new MessageCountStatistics();
43+
public final MessageCountStatistics discoverOutPing = new MessageCountStatistics();
44+
public final MessageCountStatistics discoverInPong = new MessageCountStatistics();
45+
public final MessageCountStatistics discoverOutPong = new MessageCountStatistics();
46+
public final MessageCountStatistics discoverInFind = new MessageCountStatistics();
47+
public final MessageCountStatistics discoverOutFind = new MessageCountStatistics();
48+
public final MessageCountStatistics discoverInNeighbours = new MessageCountStatistics();
49+
public final MessageCountStatistics discoverOutNeighbours = new MessageCountStatistics();
50+
6851
public final SimpleStatter discoverMessageLatency;
6952
public final AtomicLong lastPongReplyTime = new AtomicLong(0l); // in milliseconds
7053

7154
// stat
72-
public final StatHandler p2pOutHello = new StatHandler();
73-
public final StatHandler p2pInHello = new StatHandler();
74-
public final StatHandler p2pHandShake = new StatHandler();
75-
public final StatHandler tronOutMessage = new StatHandler();
76-
public final StatHandler tronInMessage = new StatHandler();
55+
public final MessageCountStatistics p2pInHello = new MessageCountStatistics();
56+
public final MessageCountStatistics p2pOutHello = new MessageCountStatistics();
57+
public final MessageCountStatistics tronInMessage = new MessageCountStatistics();
58+
public final MessageCountStatistics tronOutMessage = new MessageCountStatistics();
59+
60+
public final MessageCountStatistics p2pHandShake = new MessageCountStatistics();
7761

7862
private ReasonCode tronLastRemoteDisconnectReason = null;
7963
private ReasonCode tronLastLocalDisconnectReason = null;
@@ -89,16 +73,16 @@ private int getSessionFairReputation() {
8973
int discoverReput = 0;
9074

9175
discoverReput +=
92-
min(discoverInPong.get(), 1) * (discoverOutPing.get() == discoverInPong.get() ? 50 : 1);
76+
min(discoverInPong.getTotalCount(), 1) * (discoverOutPing.getTotalCount() == discoverInPong.getTotalCount() ? 50 : 1);
9377

9478
discoverReput +=
95-
min(discoverInNeighbours.get(), 1) * (discoverOutFind.get() == discoverInNeighbours.get() ? 50 : 1);
79+
min(discoverInNeighbours.getTotalCount(), 1) * (discoverOutFind.getTotalCount() == discoverInNeighbours.getTotalCount() ? 50 : 1);
9680

9781
discoverReput += (int)discoverMessageLatency.getAvrg() == 0 ? 0 : 1000 / discoverMessageLatency.getAvrg();
9882

9983
int reput = 0;
100-
reput += p2pHandShake.get() > 0 ? 20 : 0;
101-
reput += min(tronInMessage.get(), 10) * 3;
84+
reput += p2pHandShake.getTotalCount() > 0 ? 20 : 0;
85+
reput += min(tronInMessage.getTotalCount(), 10) * 3;
10286

10387
if (wasDisconnected()) {
10488
if (tronLastLocalDisconnectReason == null && tronLastRemoteDisconnectReason == null) {

src/main/java/org/tron/common/overlay/server/Channel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.springframework.stereotype.Component;
3434
import org.tron.common.overlay.discover.node.Node;
3535
import org.tron.common.overlay.discover.node.NodeManager;
36-
import org.tron.common.overlay.discover.node.NodeStatistics;
36+
import org.tron.common.overlay.discover.node.statistics.NodeStatistics;
3737
import org.tron.common.overlay.message.DisconnectMessage;
3838
import org.tron.common.overlay.message.HelloMessage;
3939
import org.tron.common.overlay.message.MessageCodec;

src/main/java/org/tron/common/overlay/server/SyncPool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
import org.tron.common.overlay.discover.node.Node;
4242
import org.tron.common.overlay.discover.node.NodeHandler;
4343
import org.tron.common.overlay.discover.node.NodeManager;
44-
import org.tron.common.overlay.discover.node.NodeStatistics;
44+
import org.tron.common.overlay.discover.node.statistics.NodeStatistics;
4545
import org.tron.core.config.args.Args;
4646
import org.tron.core.net.peer.PeerConnection;
4747
import org.tron.core.net.peer.PeerConnectionDelegate;

src/main/java/org/tron/common/storage/BatchSourceInter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@
1818

1919
package org.tron.common.storage;
2020

21+
import org.iq80.leveldb.WriteOptions;
22+
2123
import java.util.Map;
2224

2325

2426
public interface BatchSourceInter<K, V> extends SourceInter<K, V> {
2527

2628

2729
void updateByBatch(Map<K, V> rows);
30+
31+
void updateByBatch(Map<K, V> rows, WriteOptions writeOptions);
2832
}

0 commit comments

Comments
 (0)