Skip to content

Commit 884c42e

Browse files
committed
WIP
1 parent bd22533 commit 884c42e

File tree

4 files changed

+87
-80
lines changed

4 files changed

+87
-80
lines changed

cluster-api/src/main/java/io/scalecube/cluster/ClusterConfig.java

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import io.scalecube.cluster.membership.MembershipConfig;
66
import io.scalecube.cluster.metadata.MetadataCodec;
77
import io.scalecube.cluster.transport.api.TransportConfig;
8+
import java.util.ArrayList;
9+
import java.util.Arrays;
10+
import java.util.List;
811
import java.util.Optional;
912
import java.util.StringJoiner;
1013
import java.util.function.UnaryOperator;
@@ -35,8 +38,7 @@ public final class ClusterConfig implements Cloneable {
3538

3639
private String memberId;
3740
private String memberAlias;
38-
private String externalHost;
39-
private Integer externalPort;
41+
private List<String> externalHosts;
4042

4143
private TransportConfig transportConfig = TransportConfig.defaultConfig();
4244
private FailureDetectorConfig failureDetectorConfig = FailureDetectorConfig.defaultConfig();
@@ -136,27 +138,39 @@ public ClusterConfig metadataCodec(MetadataCodec metadataCodec) {
136138
}
137139

138140
/**
139-
* Returns externalHost. {@code externalHost} is a config property for container environments,
140-
* it's being set for advertising to scalecube cluster some connectable hostname which maps to
141+
* Returns externalHosts. {@code externalHosts} is a config property for container environments,
142+
* it's being set for advertising to scalecube cluster some connectable hostnames which maps to
141143
* scalecube transport's hostname on which scalecube transport is listening.
142144
*
143-
* @return external host
145+
* @return external hosts
144146
*/
145-
public String externalHost() {
146-
return externalHost;
147+
public List<String> externalHosts() {
148+
return externalHosts;
147149
}
148150

149151
/**
150-
* Setter for externalHost. {@code externalHost} is a config property for container environments,
151-
* it's being set for advertising to scalecube cluster some connectable hostname which maps to
152-
* scalecube transport's hostname on which scalecube transport is listening.
152+
* Setter for externalHosts. {@code externalHosts} is a config property for container
153+
* environments, it's being set for advertising to scalecube cluster some connectable hostnames
154+
* which maps to scalecube transport's hostname on which scalecube transport is listening.
155+
*
156+
* @param externalHosts external hosts
157+
* @return new {@code ClusterConfig} instance
158+
*/
159+
public ClusterConfig externalHosts(String... externalHosts) {
160+
return externalHosts(Arrays.asList(externalHosts));
161+
}
162+
163+
/**
164+
* Setter for externalHosts. {@code externalHosts} is a config property for container
165+
* environments, it's being set for advertising to scalecube cluster some connectable hostnames
166+
* which maps to scalecube transport's hostname on which scalecube transport is listening.
153167
*
154-
* @param externalHost external host
168+
* @param externalHosts external hosts
155169
* @return new {@code ClusterConfig} instance
156170
*/
157-
public ClusterConfig externalHost(String externalHost) {
171+
public ClusterConfig externalHosts(List<String> externalHosts) {
158172
ClusterConfig c = clone();
159-
c.externalHost = externalHost;
173+
c.externalHosts = new ArrayList<>(externalHosts);
160174
return c;
161175
}
162176

@@ -205,31 +219,6 @@ public ClusterConfig memberAlias(String memberAlias) {
205219
return c;
206220
}
207221

208-
/**
209-
* Returns externalPort. {@code externalPort} is a config property for container environments,
210-
* it's being set for advertising to scalecube cluster a port which mapped to scalecube
211-
* transport's listening port.
212-
*
213-
* @return external port
214-
*/
215-
public Integer externalPort() {
216-
return externalPort;
217-
}
218-
219-
/**
220-
* Setter for externalPort. {@code externalPort} is a config property for container environments,
221-
* it's being set for advertising to scalecube cluster a port which mapped to scalecube
222-
* transport's listening port.
223-
*
224-
* @param externalPort external port
225-
* @return new {@code ClusterConfig} instance
226-
*/
227-
public ClusterConfig externalPort(Integer externalPort) {
228-
ClusterConfig c = clone();
229-
c.externalPort = externalPort;
230-
return c;
231-
}
232-
233222
/**
234223
* Applies {@link TransportConfig} settings.
235224
*
@@ -316,8 +305,7 @@ public String toString() {
316305
.add("metadataCodec=" + metadataCodec)
317306
.add("memberId='" + memberId + "'")
318307
.add("memberAlias='" + memberAlias + "'")
319-
.add("externalHost='" + externalHost + "'")
320-
.add("externalPort=" + externalPort)
308+
.add("externalHosts=" + externalHosts)
321309
.add("transportConfig=" + transportConfig)
322310
.add("failureDetectorConfig=" + failureDetectorConfig)
323311
.add("gossipConfig=" + gossipConfig)

cluster-api/src/main/java/io/scalecube/cluster/Member.java

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.io.IOException;
77
import java.io.ObjectInput;
88
import java.io.ObjectOutput;
9+
import java.util.ArrayList;
10+
import java.util.List;
911
import java.util.Objects;
1012
import java.util.StringJoiner;
1113
import java.util.UUID;
@@ -20,24 +22,24 @@ public final class Member implements Externalizable {
2022

2123
private String id;
2224
private String alias;
23-
private Address address;
25+
private List<Address> addresses;
2426
private String namespace;
2527

2628
public Member() {}
2729

2830
/**
2931
* Constructor.
3032
*
31-
* @param id member id; not null
33+
* @param id member id
3234
* @param alias member alias (optional)
33-
* @param address member address; not null
34-
* @param namespace namespace; not null
35+
* @param addresses member addresses
36+
* @param namespace namespace
3537
*/
36-
public Member(String id, String alias, Address address, String namespace) {
37-
this.id = Objects.requireNonNull(id, "member id");
38-
this.alias = alias; // optional
39-
this.address = Objects.requireNonNull(address, "member address");
40-
this.namespace = Objects.requireNonNull(namespace, "member namespace");
38+
public Member(String id, String alias, List<Address> addresses, String namespace) {
39+
this.id = Objects.requireNonNull(id, "id");
40+
this.alias = alias;
41+
this.addresses = Objects.requireNonNull(addresses, "addresses");
42+
this.namespace = Objects.requireNonNull(namespace, "namespace");
4143
}
4244

4345
/**
@@ -70,14 +72,14 @@ public String namespace() {
7072
}
7173

7274
/**
73-
* Returns cluster member address, an address on which this cluster member listens connections
74-
* from other cluster members.
75+
* Returns cluster member addresses, those are addresses on which this cluster member listens
76+
* connections from other cluster members.
7577
*
7678
* @see io.scalecube.cluster.transport.api.TransportConfig#port(int)
7779
* @return member address
7880
*/
79-
public Address address() {
80-
return address;
81+
public List<Address> addresses() {
82+
return addresses;
8183
}
8284

8385
@Override
@@ -90,13 +92,13 @@ public boolean equals(Object that) {
9092
}
9193
Member member = (Member) that;
9294
return Objects.equals(id, member.id)
93-
&& Objects.equals(address, member.address)
95+
&& Objects.equals(addresses, member.addresses)
9496
&& Objects.equals(namespace, member.namespace);
9597
}
9698

9799
@Override
98100
public int hashCode() {
99-
return Objects.hash(id, address, namespace);
101+
return Objects.hash(id, addresses, namespace);
100102
}
101103

102104
@Override
@@ -110,7 +112,10 @@ public void writeExternal(ObjectOutput out) throws IOException {
110112
out.writeUTF(alias);
111113
}
112114
// address
113-
out.writeUTF(address.toString());
115+
out.writeInt(addresses.size());
116+
for (Address address : addresses) {
117+
out.writeUTF(address.toString());
118+
}
114119
// namespace
115120
out.writeUTF(namespace);
116121
}
@@ -124,8 +129,12 @@ public void readExternal(ObjectInput in) throws IOException {
124129
if (aliasNotNull) {
125130
alias = in.readUTF();
126131
}
127-
// address
128-
address = Address.from(in.readUTF());
132+
// addresses
133+
final int addressesSize = in.readInt();
134+
addresses = new ArrayList<>(addressesSize);
135+
for (int i = 0; i < addressesSize; i++) {
136+
addresses.add(Address.from(in.readUTF()));
137+
}
129138
// namespace
130139
this.namespace = in.readUTF();
131140
}
@@ -143,9 +152,9 @@ private static String stringifyId(String id) {
143152
public String toString() {
144153
StringJoiner stringJoiner = new StringJoiner(":");
145154
if (alias == null) {
146-
return stringJoiner.add(namespace).add(stringifyId(id) + "@" + address).toString();
155+
return stringJoiner.add(namespace).add(stringifyId(id)).toString();
147156
} else {
148-
return stringJoiner.add(namespace).add(alias).add(stringifyId(id) + "@" + address).toString();
157+
return stringJoiner.add(namespace).add(alias).add(stringifyId(id)).toString();
149158
}
150159
}
151160
}

cluster/src/main/java/io/scalecube/cluster/ClusterImpl.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import io.scalecube.utils.ServiceLoaderUtil;
2121
import java.io.Serializable;
2222
import java.nio.ByteBuffer;
23+
import java.util.ArrayList;
2324
import java.util.Collection;
2425
import java.util.Collections;
26+
import java.util.List;
2527
import java.util.Objects;
2628
import java.util.Optional;
2729
import java.util.Set;
@@ -243,7 +245,9 @@ private Mono<Cluster> doStart0() {
243245
localMember = createLocalMember(boundTransport.address());
244246
transport = new SenderAwareTransport(boundTransport, localMember.address());
245247

246-
scheduler = Schedulers.newSingle("sc-cluster-" + localMember.address().port(), true);
248+
final String name =
249+
"sc-cluster-" + Integer.toHexString(System.identityHashCode(this));
250+
scheduler = Schedulers.newSingle(name, true);
247251

248252
failureDetector =
249253
new FailureDetectorImpl(
@@ -369,19 +373,26 @@ private Flux<MembershipEvent> listenMembership() {
369373
* @return local cluster member with cluster address and cluster member id
370374
*/
371375
private Member createLocalMember(Address address) {
372-
int port = Optional.ofNullable(config.externalPort()).orElse(address.port());
373-
374-
// calculate local member cluster address
375-
Address memberAddress =
376-
Optional.ofNullable(config.externalHost())
377-
.map(host -> Address.create(host, port))
378-
.orElseGet(() -> Address.create(address.host(), port));
379-
380-
return new Member(
381-
config.memberId() != null ? config.memberId() : UUID.randomUUID().toString(),
382-
config.memberAlias(),
383-
memberAddress,
384-
config.membershipConfig().namespace());
376+
final int port = address.port();
377+
final List<Address> memberAddresses = new ArrayList<>();
378+
379+
// First address comes as "fair" listen address
380+
memberAddresses.add(address);
381+
382+
// Tail goes as externalHosts, if the exist
383+
final List<String> externalHosts = config.externalHosts();
384+
if (externalHosts != null) {
385+
for (String externalHost : externalHosts) {
386+
memberAddresses.add(Address.create(externalHost, port));
387+
}
388+
}
389+
390+
final String memberId =
391+
config.memberId() != null ? config.memberId() : UUID.randomUUID().toString();
392+
final String memberAlias = config.memberAlias();
393+
final String namespace = config.membershipConfig().namespace();
394+
395+
return new Member(memberId, memberAlias, memberAddresses, namespace);
385396
}
386397

387398
@Override

cluster/src/test/java/io/scalecube/cluster/ClusterTest.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ public void testJoinLocalhostIgnoredWithOverride() throws InterruptedException {
154154

155155
// Start seed node
156156
Cluster seedNode =
157-
new ClusterImpl(new ClusterConfig().externalHost("localhost").externalPort(7878))
157+
new ClusterImpl(new ClusterConfig().externalHosts("localhost"))
158158
.transport(opts -> opts.port(7878).connectTimeout(CONNECT_TIMEOUT))
159159
.membership(opts -> opts.seedMembers(addresses))
160160
.transportFactory(TcpTransportFactory::new)
@@ -590,14 +590,13 @@ private void shutdown(List<Cluster> nodes) {
590590

591591
@Test
592592
public void testExplicitLocalMemberId() {
593-
ClusterConfig config = ClusterConfig.defaultConfig()
594-
.memberId("test-member");
593+
ClusterConfig config = ClusterConfig.defaultConfig().memberId("test-member");
595594

596595
ClusterImpl cluster = null;
597596
try {
598-
cluster = (ClusterImpl) new ClusterImpl(config)
599-
.transportFactory(TcpTransportFactory::new)
600-
.startAwait();
597+
cluster =
598+
(ClusterImpl)
599+
new ClusterImpl(config).transportFactory(TcpTransportFactory::new).startAwait();
601600

602601
assertEquals("test-member", cluster.member().id());
603602
} finally {

0 commit comments

Comments
 (0)