Skip to content

Commit d4c2761

Browse files
authored
Merge pull request #5090 from chengtx01/optimize_intranet
feat(config):add configuration dynamic loading for node
2 parents e7858ea + e0c8ba5 commit d4c2761

8 files changed

Lines changed: 224 additions & 4 deletions

File tree

common/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ dependencies {
5353
compile 'org.aspectj:aspectjrt:1.8.13'
5454
compile 'org.aspectj:aspectjweaver:1.8.13'
5555
compile 'org.aspectj:aspectjtools:1.8.13'
56-
compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.19'
56+
compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.20'
5757
compile project(":protocol")
5858
}
5959

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class CommonParameter {
3131
public static CommonParameter PARAMETER = new CommonParameter();
3232
@Setter
3333
public static boolean ENERGY_LIMIT_HARD_FORK = false;
34+
@Getter
3435
@Parameter(names = {"-c", "--config"}, description = "Config file (default:config.conf)")
3536
public String shellConfFileName = "";
3637
@Getter
@@ -633,6 +634,14 @@ public class CommonParameter {
633634
@Setter
634635
public long dynamicEnergyMaxFactor = 0L;
635636

637+
@Getter
638+
@Setter
639+
public boolean dynamicConfigEnable;
640+
641+
@Getter
642+
@Setter
643+
public long dynamicConfigCheckInterval;
644+
636645
private static double calcMaxTimeRatio() {
637646
//return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1)));
638647
return 5.0;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,4 +365,7 @@ public class Constant {
365365
public static final String NODE_SHUTDOWN_BLOCK_COUNT = "node.shutdown.BlockCount";
366366

367367
public static final String BLOCK_CACHE_TIMEOUT = "node.blockCacheTimeout";
368+
369+
public static final String DYNAMIC_CONFIG_ENABLE = "node.dynamicConfig.enable";
370+
public static final String DYNAMIC_CONFIG_CHECK_INTERVAL = "node.dynamicConfig.checkInterval";
368371
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.tron.common.parameter.CommonParameter;
88
import org.tron.core.ChainBaseManager;
99
import org.tron.core.config.args.Args;
10+
import org.tron.core.config.args.DynamicArgs;
1011
import org.tron.core.consensus.ConsensusService;
1112
import org.tron.core.db.Manager;
1213
import org.tron.core.metrics.MetricsUtil;
@@ -32,6 +33,9 @@ public class ApplicationImpl implements Application {
3233
@Autowired
3334
private ConsensusService consensusService;
3435

36+
@Autowired
37+
private DynamicArgs dynamicArgs;
38+
3539
@Override
3640
public void setOptions(Args args) {
3741
// not used
@@ -62,6 +66,7 @@ public void startup() {
6266
}
6367
consensusService.start();
6468
MetricsUtil.init();
69+
dynamicArgs.init();
6570
}
6671

6772
@Override
@@ -80,6 +85,7 @@ public void shutdown() {
8085
dbManager.stopRePushTriggerThread();
8186
EventPluginLoader.getInstance().stopPlugin();
8287
dbManager.stopFilterProcessThread();
88+
dynamicArgs.close();
8389
logger.info("******** end to shutdown ********");
8490
FullNode.shutDownSign = true;
8591
}

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ public static void clearParam() {
228228
PARAMETER.rateLimiterGlobalQps = 50000;
229229
PARAMETER.rateLimiterGlobalIpQps = 10000;
230230
PARAMETER.p2pDisable = false;
231+
PARAMETER.dynamicConfigEnable = false;
232+
PARAMETER.dynamicConfigCheckInterval = 600;
231233
}
232234

233235
/**
@@ -1147,6 +1149,18 @@ public static void setParam(final String[] args, final String confFileName) {
11471149
Math.max(PARAMETER.dynamicEnergyMaxFactor, 0);
11481150
}
11491151

1152+
PARAMETER.dynamicConfigEnable = config.hasPath(Constant.DYNAMIC_CONFIG_ENABLE)
1153+
&& config.getBoolean(Constant.DYNAMIC_CONFIG_ENABLE);
1154+
if (config.hasPath(Constant.DYNAMIC_CONFIG_CHECK_INTERVAL)) {
1155+
PARAMETER.dynamicConfigCheckInterval
1156+
= config.getLong(Constant.DYNAMIC_CONFIG_CHECK_INTERVAL);
1157+
if (PARAMETER.dynamicConfigCheckInterval <= 0) {
1158+
PARAMETER.dynamicConfigCheckInterval = 600;
1159+
}
1160+
} else {
1161+
PARAMETER.dynamicConfigCheckInterval = 600;
1162+
}
1163+
11501164
logConfig();
11511165
}
11521166

@@ -1199,7 +1213,7 @@ private static RateLimiterInitialization getRateLimiterFromConfig(
11991213
return initialization;
12001214
}
12011215

1202-
private static List<InetSocketAddress> getInetSocketAddress(
1216+
public static List<InetSocketAddress> getInetSocketAddress(
12031217
final com.typesafe.config.Config config, String path, boolean filter) {
12041218
List<InetSocketAddress> ret = new ArrayList<>();
12051219
if (!config.hasPath(path)) {
@@ -1227,7 +1241,7 @@ private static List<InetSocketAddress> getInetSocketAddress(
12271241
return ret;
12281242
}
12291243

1230-
private static List<InetAddress> getInetAddress(
1244+
public static List<InetAddress> getInetAddress(
12311245
final com.typesafe.config.Config config, String path) {
12321246
List<InetAddress> ret = new ArrayList<>();
12331247
if (!config.hasPath(path)) {
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package org.tron.core.config.args;
2+
3+
import static org.apache.commons.lang3.StringUtils.isNoneBlank;
4+
5+
import com.typesafe.config.Config;
6+
import java.io.File;
7+
import java.net.InetAddress;
8+
import java.net.InetSocketAddress;
9+
import java.util.List;
10+
import java.util.concurrent.Executors;
11+
import java.util.concurrent.ScheduledExecutorService;
12+
import java.util.concurrent.TimeUnit;
13+
14+
import lombok.extern.slf4j.Slf4j;
15+
import org.springframework.stereotype.Component;
16+
import org.tron.common.parameter.CommonParameter;
17+
import org.tron.core.Constant;
18+
import org.tron.core.config.Configuration;
19+
import org.tron.core.net.TronNetService;
20+
21+
22+
@Slf4j(topic = "app")
23+
@Component
24+
public class DynamicArgs {
25+
private final CommonParameter parameter = Args.getInstance();
26+
27+
private long lastModified = 0;
28+
29+
private ScheduledExecutorService reloadExecutor = Executors.newSingleThreadScheduledExecutor();
30+
31+
public void init() {
32+
if (parameter.isDynamicConfigEnable()) {
33+
logger.info("Start the dynamic loading configuration service");
34+
long checkInterval = parameter.getDynamicConfigCheckInterval();
35+
File config = getConfigFile();
36+
if (config == null) {
37+
return;
38+
}
39+
lastModified = config.lastModified();
40+
reloadExecutor.scheduleWithFixedDelay(() -> {
41+
try {
42+
run();
43+
} catch (Exception e) {
44+
logger.error("Exception caught when reloading configuration", e);
45+
}
46+
}, 10, checkInterval, TimeUnit.SECONDS);
47+
}
48+
}
49+
50+
public void run() {
51+
File config = getConfigFile();
52+
if (config != null) {
53+
long lastModifiedTime = config.lastModified();
54+
if (lastModifiedTime > lastModified) {
55+
reload();
56+
lastModified = lastModifiedTime;
57+
}
58+
}
59+
}
60+
61+
private File getConfigFile() {
62+
String confFilePath;
63+
if (isNoneBlank(parameter.getShellConfFileName())) {
64+
confFilePath = parameter.getShellConfFileName();
65+
} else {
66+
confFilePath = Constant.TESTNET_CONF;
67+
}
68+
69+
File confFile = new File(confFilePath);
70+
if (!confFile.exists()) {
71+
logger.warn("Configuration path is required! No such file {}", confFile);
72+
return null;
73+
}
74+
return confFile;
75+
}
76+
77+
public void reload() {
78+
logger.debug("Reloading ... ");
79+
Config config = Configuration.getByFileName(parameter.getShellConfFileName(),
80+
Constant.TESTNET_CONF);
81+
82+
updateActiveNodes(config);
83+
84+
updateTrustNodes(config);
85+
}
86+
87+
private void updateActiveNodes(Config config) {
88+
List<InetSocketAddress> newActiveNodes =
89+
Args.getInetSocketAddress(config, Constant.NODE_ACTIVE, true);
90+
parameter.setActiveNodes(newActiveNodes);
91+
List<InetSocketAddress> activeNodes = TronNetService.getP2pConfig().getActiveNodes();
92+
activeNodes.clear();
93+
activeNodes.addAll(newActiveNodes);
94+
logger.debug("p2p active nodes : {}",
95+
TronNetService.getP2pConfig().getActiveNodes().toString());
96+
}
97+
98+
private void updateTrustNodes(Config config) {
99+
List<InetAddress> newPassiveNodes = Args.getInetAddress(config, Constant.NODE_PASSIVE);
100+
parameter.setPassiveNodes(newPassiveNodes);
101+
List<InetAddress> trustNodes = TronNetService.getP2pConfig().getTrustNodes();
102+
trustNodes.clear();
103+
trustNodes.addAll(newPassiveNodes);
104+
parameter.getActiveNodes().forEach(n -> trustNodes.add(n.getAddress()));
105+
parameter.getFastForwardNodes().forEach(f -> trustNodes.add(f.getAddress()));
106+
logger.debug("p2p trust nodes : {}",
107+
TronNetService.getP2pConfig().getTrustNodes().toString());
108+
}
109+
110+
public void close() {
111+
logger.info("Closing the dynamic loading configuration service");
112+
reloadExecutor.shutdown();
113+
}
114+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.tron.core.config.args;
2+
3+
import java.io.File;
4+
import org.junit.After;
5+
import org.junit.Assert;
6+
import org.junit.Before;
7+
import org.junit.Test;
8+
import org.tron.common.application.TronApplicationContext;
9+
import org.tron.common.parameter.CommonParameter;
10+
import org.tron.common.utils.FileUtil;
11+
import org.tron.common.utils.ReflectUtils;
12+
import org.tron.core.Constant;
13+
import org.tron.core.config.DefaultConfig;
14+
import org.tron.core.net.TronNetService;
15+
import org.tron.p2p.P2pConfig;
16+
17+
public class DynamicArgsTest {
18+
protected TronApplicationContext context;
19+
private DynamicArgs dynamicArgs;
20+
private String dbPath = "output-dynamic-config-test";
21+
22+
@Before
23+
public void init() {
24+
Args.setParam(new String[]{"--output-directory", dbPath},
25+
Constant.TEST_CONF);
26+
context = new TronApplicationContext(DefaultConfig.class);
27+
dynamicArgs = context.getBean(DynamicArgs.class);
28+
29+
}
30+
31+
@After
32+
public void destroy() {
33+
Args.clearParam();
34+
context.destroy();
35+
FileUtil.deleteDir(new File(dbPath));
36+
}
37+
38+
@Test
39+
public void start() {
40+
CommonParameter parameter = Args.getInstance();
41+
Assert.assertTrue(parameter.isDynamicConfigEnable());
42+
Assert.assertEquals(600, parameter.getDynamicConfigCheckInterval());
43+
44+
dynamicArgs.init();
45+
Assert.assertEquals(0, (long) ReflectUtils.getFieldObject(dynamicArgs, "lastModified"));
46+
47+
TronNetService tronNetService = context.getBean(TronNetService.class);
48+
ReflectUtils.setFieldValue(tronNetService, "p2pConfig", new P2pConfig());
49+
File config = new File(Constant.TESTNET_CONF);
50+
if (!config.exists()) {
51+
try {
52+
config.createNewFile();
53+
} catch (Exception e) {
54+
return;
55+
}
56+
dynamicArgs.run();
57+
try {
58+
config.delete();
59+
} catch (Exception e) {
60+
return;
61+
}
62+
}
63+
try {
64+
dynamicArgs.reload();
65+
} catch (Exception e) {
66+
// no need to deal with
67+
}
68+
69+
dynamicArgs.close();
70+
}
71+
}

framework/src/test/resources/config-test.conf

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,7 @@ vm = {
340340
}
341341
committee = {
342342
allowCreationOfContracts = 1 //mainnet:0 (reset by committee),test:1
343-
}
343+
}
344+
345+
node.dynamicConfig.enable = true
346+
node.dynamicConfig.checkInterval = 0

0 commit comments

Comments
 (0)