Skip to content

Commit 52e14b0

Browse files
authored
feat(net): support domain names in peer configuration (#6727)
1 parent 645bf20 commit 52e14b0

8 files changed

Lines changed: 756 additions & 47 deletions

File tree

common/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ dependencies {
2121
api 'org.aspectj:aspectjrt:1.9.8'
2222
api 'org.aspectj:aspectjweaver:1.9.8'
2323
api 'org.aspectj:aspectjtools:1.9.8'
24-
api group: 'io.github.tronprotocol', name: 'libp2p', version: '2.2.7',{
24+
api group: 'com.github.tronprotocol', name: 'libp2p', version: 'release-v2.2.8-SNAPSHOT',{
25+
//api group: 'io.github.tronprotocol', name: 'libp2p', version: '2.2.7',{
2526
exclude group: 'io.grpc', module: 'grpc-context'
2627
exclude group: 'io.grpc', module: 'grpc-core'
2728
exclude group: 'io.grpc', module: 'grpc-netty'

framework/src/main/java/org/tron/common/backup/BackupManager.java

Lines changed: 69 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44
import static org.tron.common.backup.BackupManager.BackupStatusEnum.MASTER;
55
import static org.tron.common.backup.BackupManager.BackupStatusEnum.SLAVER;
66
import static org.tron.common.backup.message.UdpMessageTypeEnum.BACKUP_KEEP_ALIVE;
7+
import static org.tron.core.config.args.InetUtil.resolveInetAddress;
78

89
import io.netty.util.internal.ConcurrentSet;
910
import java.net.InetAddress;
1011
import java.net.InetSocketAddress;
12+
import java.util.Map;
1113
import java.util.Set;
14+
import java.util.concurrent.ConcurrentHashMap;
1215
import java.util.concurrent.ScheduledExecutorService;
1316
import java.util.concurrent.TimeUnit;
17+
import lombok.Getter;
18+
import lombok.Setter;
1419
import lombok.extern.slf4j.Slf4j;
1520
import org.springframework.stereotype.Component;
1621
import org.tron.common.backup.message.KeepAliveMessage;
@@ -20,46 +25,45 @@
2025
import org.tron.common.backup.socket.UdpEvent;
2126
import org.tron.common.es.ExecutorServiceManager;
2227
import org.tron.common.parameter.CommonParameter;
28+
import org.tron.p2p.utils.NetUtil;
2329

2430
@Slf4j(topic = "backup")
2531
@Component
2632
public class BackupManager implements EventHandler {
2733

28-
private CommonParameter parameter = CommonParameter.getInstance();
34+
private final CommonParameter parameter = CommonParameter.getInstance();
2935

30-
private int priority = parameter.getBackupPriority();
36+
private final int priority = parameter.getBackupPriority();
3137

32-
private int port = parameter.getBackupPort();
38+
private final int port = parameter.getBackupPort();
3339

34-
private int keepAliveInterval = parameter.getKeepAliveInterval();
40+
private final int keepAliveInterval = parameter.getKeepAliveInterval();
3541

36-
private int keepAliveTimeout = keepAliveInterval * 6;
42+
private final int keepAliveTimeout = keepAliveInterval * 6;
3743

3844
private String localIp = "";
3945

40-
private Set<String> members = new ConcurrentSet<>();
46+
private final Set<String> members = new ConcurrentSet<>();
4147

42-
private final String esName = "backup-manager";
48+
private final Map<String, String> domainIpCache = new ConcurrentHashMap<>();
4349

44-
private ScheduledExecutorService executorService =
50+
private final String esName = "backup-manager";
51+
private final ScheduledExecutorService executorService =
4552
ExecutorServiceManager.newSingleThreadScheduledExecutor(esName);
4653

54+
private final String dnsEsName = "backup-dns-refresh";
55+
private ScheduledExecutorService dnsExecutorService;
56+
57+
@Setter
4758
private MessageHandler messageHandler;
4859

60+
@Getter
4961
private BackupStatusEnum status = MASTER;
5062

5163
private volatile long lastKeepAliveTime;
5264

5365
private volatile boolean isInit = false;
5466

55-
public void setMessageHandler(MessageHandler messageHandler) {
56-
this.messageHandler = messageHandler;
57-
}
58-
59-
public BackupStatusEnum getStatus() {
60-
return status;
61-
}
62-
6367
public void setStatus(BackupStatusEnum status) {
6468
logger.info("Change backup status to {}", status);
6569
this.status = status;
@@ -78,10 +82,20 @@ public void init() {
7882
logger.warn("Failed to get local ip");
7983
}
8084

81-
for (String member : parameter.getBackupMembers()) {
82-
if (!localIp.equals(member)) {
83-
members.add(member);
85+
for (String ipOrDomain : parameter.getBackupMembers()) {
86+
InetAddress inetAddress = resolveInetAddress(ipOrDomain);
87+
if (inetAddress == null) {
88+
logger.warn("Failed to resolve backup member domain: {}", ipOrDomain);
89+
continue;
90+
}
91+
String ip = inetAddress.getHostAddress();
92+
if (localIp.equals(ip)) {
93+
continue;
94+
}
95+
if (!NetUtil.validIpV4(ipOrDomain) && !NetUtil.validIpV6(ipOrDomain)) {
96+
domainIpCache.put(ipOrDomain, ip);
8497
}
98+
members.add(ip);
8599
}
86100

87101
logger.info("Backup localIp:{}, members: size= {}, {}", localIp, members.size(), members);
@@ -111,6 +125,17 @@ public void init() {
111125
logger.error("Exception in send keep alive", t);
112126
}
113127
}, 1000, keepAliveInterval, TimeUnit.MILLISECONDS);
128+
129+
if (!domainIpCache.isEmpty()) {
130+
dnsExecutorService = ExecutorServiceManager.newSingleThreadScheduledExecutor(dnsEsName);
131+
dnsExecutorService.scheduleWithFixedDelay(() -> {
132+
try {
133+
refreshMemberIps();
134+
} catch (Throwable t) {
135+
logger.error("Exception in backup DNS refresh", t);
136+
}
137+
}, 60_000L, 60_000L, TimeUnit.MILLISECONDS);
138+
}
114139
}
115140

116141
@Override
@@ -149,6 +174,9 @@ public void handleEvent(UdpEvent udpEvent) {
149174

150175
public void stop() {
151176
ExecutorServiceManager.shutdownAndAwaitTermination(executorService, esName);
177+
if (dnsExecutorService != null) {
178+
ExecutorServiceManager.shutdownAndAwaitTermination(dnsExecutorService, dnsEsName);
179+
}
152180
}
153181

154182
@Override
@@ -162,4 +190,26 @@ public enum BackupStatusEnum {
162190
MASTER
163191
}
164192

193+
/**
194+
* Re-resolves all tracked domain entries. If an IP has changed, the old IP is
195+
* removed from {@link #members} and the new IP is added.
196+
*/
197+
private void refreshMemberIps() {
198+
for (Map.Entry<String, String> entry : domainIpCache.entrySet()) {
199+
String domain = entry.getKey();
200+
String oldIp = entry.getValue();
201+
InetAddress inetAddress = resolveInetAddress(domain);
202+
if (inetAddress == null) {
203+
logger.warn("DNS refresh: failed to re-resolve backup member domain {}, keep it", domain);
204+
continue;
205+
}
206+
String newIp = inetAddress.getHostAddress();
207+
if (!newIp.equals(oldIp)) {
208+
logger.info("DNS refresh: backup member {} IP changed {} -> {}", domain, oldIp, newIp);
209+
members.remove(oldIp);
210+
members.add(newIp);
211+
domainIpCache.put(domain, newIp);
212+
}
213+
}
214+
}
165215
}

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import static org.tron.common.math.Maths.max;
55
import static org.tron.core.Constant.ADD_PRE_FIX_BYTE_MAINNET;
66
import static org.tron.core.Constant.ENERGY_LIMIT_IN_CONSTANT_TX;
7+
import static org.tron.core.config.args.InetUtil.resolveInetAddress;
8+
import static org.tron.core.config.args.InetUtil.resolveInetSocketAddressList;
79

810
import com.beust.jcommander.JCommander;
911
import com.beust.jcommander.ParameterDescription;
@@ -13,6 +15,7 @@
1315
import java.io.File;
1416
import java.io.IOException;
1517
import java.io.InputStream;
18+
import java.net.InetAddress;
1619
import java.net.InetSocketAddress;
1720
import java.text.ParseException;
1821
import java.util.ArrayList;
@@ -252,6 +255,7 @@ private static void applyNodeBackupConfig(NodeConfig nc) {
252255
PARAMETER.backupPort = b.getPort();
253256
PARAMETER.keepAliveInterval = b.getKeepAliveInterval();
254257
PARAMETER.backupMembers = b.getMembers();
258+
checkBackupMembers();
255259
}
256260

257261
/**
@@ -306,10 +310,7 @@ private static void applyMiscConfig(MiscConfig mc) {
306310
// seed.node — top-level config section, not under "node"
307311
// Config structure is arguably misplaced but preserved for backward compatibility
308312
PARAMETER.seedNode = new SeedNode();
309-
PARAMETER.seedNode.setAddressList(
310-
mc.getSeedNodeIpList().stream()
311-
.map(s -> org.tron.p2p.utils.NetUtil.parseInetSocketAddress(s))
312-
.collect(Collectors.toList()));
313+
PARAMETER.seedNode.setAddressList(resolveInetSocketAddressList(mc.getSeedNodeIpList()));
313314
}
314315

315316
/**
@@ -908,10 +909,7 @@ private static void applyCLIParams(CLIParameter cmd, JCommander jc) {
908909
if (!cmd.seedNodes.isEmpty()) {
909910
logger.warn("Positional seed-node arguments are deprecated. "
910911
+ "Please use seed.node.ip.list in the config file instead.");
911-
List<InetSocketAddress> seeds = new ArrayList<>();
912-
for (String s : cmd.seedNodes) {
913-
seeds.add(NetUtil.parseInetSocketAddress(s));
914-
}
912+
List<InetSocketAddress> seeds = resolveInetSocketAddressList(cmd.seedNodes);
915913
PARAMETER.seedNode.setAddressList(seeds);
916914
}
917915
}
@@ -984,8 +982,7 @@ public static void clearParam() {
984982
public static List<InetSocketAddress> filterInetSocketAddress(
985983
List<String> addressList, boolean filter) {
986984
List<InetSocketAddress> ret = new ArrayList<>();
987-
for (String configString : addressList) {
988-
InetSocketAddress inetSocketAddress = NetUtil.parseInetSocketAddress(configString);
985+
for (InetSocketAddress inetSocketAddress : resolveInetSocketAddressList(addressList)) {
989986
if (filter) {
990987
String ip = inetSocketAddress.getAddress().getHostAddress();
991988
int port = inetSocketAddress.getPort();
@@ -1133,6 +1130,16 @@ private static void externalIp(NodeConfig nodeConfig) {
11331130
// initRocksDbSettings, initRocksDbBackupProperty, initBackupProperty
11341131
// removed — logic moved to applyStorageConfig() and applyNodeBackupConfig()
11351132

1133+
private static void checkBackupMembers() {
1134+
for (String member : PARAMETER.backupMembers) {
1135+
InetAddress inetAddress = resolveInetAddress(member);
1136+
if (inetAddress == null) {
1137+
throw new TronError("Failed to resolve backup member: " + member,
1138+
TronError.ErrCode.PARAMETER_INIT);
1139+
}
1140+
}
1141+
}
1142+
11361143
public static void logConfig() {
11371144
CommonParameter parameter = CommonParameter.getInstance();
11381145
logger.info("\n");

0 commit comments

Comments
 (0)