Skip to content

Commit 2beb770

Browse files
authored
Merge pull request #322 from scalecube/poc-namespaces
Namespaces
2 parents 796c01e + f7157c6 commit 2beb770

File tree

30 files changed

+559
-383
lines changed

30 files changed

+559
-383
lines changed

cluster-api/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>io.scalecube</groupId>
77
<artifactId>scalecube-cluster-parent</artifactId>
8-
<version>2.4.12-SNAPSHOT</version>
8+
<version>2.5.0-SNAPSHOT</version>
99
</parent>
1010

1111
<artifactId>scalecube-cluster-api</artifactId>

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

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package io.scalecube.cluster;
22

3+
import io.scalecube.cluster.membership.MembershipConfig;
34
import io.scalecube.net.Address;
45
import java.io.Externalizable;
56
import java.io.IOException;
67
import java.io.ObjectInput;
78
import java.io.ObjectOutput;
9+
import java.nio.file.Paths;
810
import java.util.Objects;
9-
import java.util.UUID;
1011

1112
/**
1213
* Cluster member which represents node in the cluster and contains its id and address. This class
@@ -19,36 +20,66 @@ public final class Member implements Externalizable {
1920
private String id;
2021
private String alias;
2122
private Address address;
23+
private String namespace;
2224

2325
public Member() {}
2426

2527
/**
2628
* Constructor.
2729
*
28-
* @param id member id
30+
* @param id member id; not null
2931
* @param alias member alias (optional)
30-
* @param address member address
32+
* @param address member address; not null
33+
* @param namespace namespace; not null
3134
*/
32-
public Member(String id, String alias, Address address) {
35+
public Member(String id, String alias, Address address, String namespace) {
3336
this.id = Objects.requireNonNull(id, "member id");
3437
this.alias = alias; // optional
3538
this.address = Objects.requireNonNull(address, "member address");
39+
this.namespace = Objects.requireNonNull(namespace, "member namespace");
3640
}
3741

42+
/**
43+
* Returns cluster member local id.
44+
*
45+
* @return member id
46+
*/
3847
public String id() {
3948
return id;
4049
}
4150

51+
/**
52+
* Returns cluster member alias if exists, otherwise {@code null}.
53+
*
54+
* @see ClusterConfig#memberAlias(String)
55+
* @return alias if exists or {@code null}
56+
*/
4257
public String alias() {
4358
return alias;
4459
}
4560

46-
public Address address() {
47-
return address;
61+
/**
62+
* Returns cluster member namespace.
63+
*
64+
* @see MembershipConfig#namespace(String)
65+
* @return namespace
66+
*/
67+
public String namespace() {
68+
return namespace;
4869
}
4970

50-
public static String generateId() {
51-
return Long.toHexString(UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE);
71+
/**
72+
* Returns cluster member address, an address on which this cluster member listens connections
73+
* from other cluster members.
74+
*
75+
* @see io.scalecube.cluster.transport.api.TransportConfig#port(int)
76+
* @see io.scalecube.cluster.transport.api.TransportConfig#host(String)
77+
* @see ClusterConfig#containerHost(String)
78+
* @see ClusterConfig#containerPort(Integer)
79+
* @return member address
80+
*/
81+
public Address address() {
82+
return address;
5283
}
5384

5485
@Override
@@ -60,12 +91,14 @@ public boolean equals(Object that) {
6091
return false;
6192
}
6293
Member member = (Member) that;
63-
return Objects.equals(id, member.id) && Objects.equals(address, member.address);
94+
return Objects.equals(id, member.id)
95+
&& Objects.equals(address, member.address)
96+
&& Objects.equals(namespace, member.namespace);
6497
}
6598

6699
@Override
67100
public int hashCode() {
68-
return Objects.hash(id, address);
101+
return Objects.hash(id, address, namespace);
69102
}
70103

71104
@Override
@@ -80,6 +113,8 @@ public void writeExternal(ObjectOutput out) throws IOException {
80113
}
81114
// address
82115
out.writeUTF(address.toString());
116+
// namespace
117+
out.writeUTF(namespace);
83118
}
84119

85120
@Override
@@ -93,14 +128,16 @@ public void readExternal(ObjectInput in) throws IOException {
93128
}
94129
// address
95130
address = Address.from(in.readUTF());
131+
// namespace
132+
this.namespace = in.readUTF();
96133
}
97134

98135
@Override
99136
public String toString() {
100137
if (alias == null) {
101-
return id + "@" + address;
138+
return Paths.get(namespace, id + "@" + address).toString();
102139
} else {
103-
return alias + "/" + id + "@" + address;
140+
return Paths.get(namespace, alias, id + "@" + address).toString();
104141
}
105142
}
106143
}

cluster-api/src/main/java/io/scalecube/cluster/membership/MembershipConfig.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public final class MembershipConfig implements Cloneable {
2828
private int syncInterval = DEFAULT_SYNC_INTERVAL;
2929
private int syncTimeout = DEFAULT_SYNC_TIMEOUT;
3030
private int suspicionMult = DEFAULT_SUSPICION_MULT;
31-
private String syncGroup = "default";
3231
private int removedMembersHistorySize = 42;
32+
private String namespace = "default";
3333

3434
public MembershipConfig() {}
3535

@@ -142,19 +142,19 @@ public MembershipConfig suspicionMult(int suspicionMult) {
142142
return m;
143143
}
144144

145-
public String syncGroup() {
146-
return syncGroup;
145+
public String namespace() {
146+
return namespace;
147147
}
148148

149149
/**
150-
* Sets a syncGroup.
150+
* Sets a namespace.
151151
*
152-
* @param syncGroup sync group
152+
* @param namespace namespace
153153
* @return new {@code MembershipConfig} instance
154154
*/
155-
public MembershipConfig syncGroup(String syncGroup) {
155+
public MembershipConfig namespace(String namespace) {
156156
MembershipConfig m = clone();
157-
m.syncGroup = syncGroup;
157+
m.namespace = namespace;
158158
return m;
159159
}
160160

@@ -190,7 +190,7 @@ public String toString() {
190190
.add("syncInterval=" + syncInterval)
191191
.add("syncTimeout=" + syncTimeout)
192192
.add("suspicionMult=" + suspicionMult)
193-
.add("syncGroup='" + syncGroup + "'")
193+
.add("namespace='" + namespace + "'")
194194
.add("removedMembersHistorySize=" + removedMembersHistorySize)
195195
.toString();
196196
}

cluster-testlib/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<parent>
44
<artifactId>scalecube-cluster-parent</artifactId>
55
<groupId>io.scalecube</groupId>
6-
<version>2.4.12-SNAPSHOT</version>
6+
<version>2.5.0-SNAPSHOT</version>
77
</parent>
88
<modelVersion>4.0.0</modelVersion>
99

cluster/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>io.scalecube</groupId>
77
<artifactId>scalecube-cluster-parent</artifactId>
8-
<version>2.4.12-SNAPSHOT</version>
8+
<version>2.5.0-SNAPSHOT</version>
99
</parent>
1010

1111
<artifactId>scalecube-cluster</artifactId>

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929
import java.util.Objects;
3030
import java.util.Optional;
3131
import java.util.Set;
32+
import java.util.UUID;
3233
import java.util.function.Function;
3334
import java.util.function.UnaryOperator;
35+
import java.util.regex.Pattern;
3436
import java.util.stream.Collectors;
3537
import java.util.stream.Stream;
3638
import javax.management.MBeanServer;
@@ -54,6 +56,8 @@ public final class ClusterImpl implements Cluster {
5456

5557
private static final Logger LOGGER = LoggerFactory.getLogger(Cluster.class);
5658

59+
private static final Pattern NAMESPACE_PATTERN = Pattern.compile("^(\\w+[\\w\\-./]*\\w)+");
60+
5761
private static final Set<String> SYSTEM_MESSAGES =
5862
Collections.unmodifiableSet(
5963
Stream.of(
@@ -326,8 +330,13 @@ private void validateConfiguration() {
326330
"Invalid cluster config: transport.messageCodec must be specified");
327331

328332
Objects.requireNonNull(
329-
config.membershipConfig().syncGroup(),
330-
"Invalid cluster config: membership.syncGroup must be specified");
333+
config.membershipConfig().namespace(),
334+
"Invalid cluster config: membership.namespace must be specified");
335+
336+
if (!NAMESPACE_PATTERN.matcher(config.membershipConfig().namespace()).matches()) {
337+
throw new IllegalArgumentException(
338+
"Invalid cluster config: membership.namespace format is invalid");
339+
}
331340
}
332341

333342
private void startHandler() {
@@ -395,7 +404,11 @@ private Member createLocalMember(Address address) {
395404
.map(host -> Address.create(host, port))
396405
.orElseGet(() -> Address.create(address.host(), port));
397406

398-
return new Member(Member.generateId(), config.memberAlias(), memberAddress);
407+
return new Member(
408+
Long.toHexString(UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE),
409+
config.memberAlias(),
410+
memberAddress,
411+
config.membershipConfig().namespace());
399412
}
400413

401414
@Override

0 commit comments

Comments
 (0)