Skip to content

Commit

Permalink
Merge pull request #322 from scalecube/poc-namespaces
Browse files Browse the repository at this point in the history
Namespaces
  • Loading branch information
artem-v committed Jun 5, 2020
2 parents 796c01e + f7157c6 commit 2beb770
Show file tree
Hide file tree
Showing 30 changed files with 559 additions and 383 deletions.
2 changes: 1 addition & 1 deletion cluster-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>io.scalecube</groupId>
<artifactId>scalecube-cluster-parent</artifactId>
<version>2.4.12-SNAPSHOT</version>
<version>2.5.0-SNAPSHOT</version>
</parent>

<artifactId>scalecube-cluster-api</artifactId>
Expand Down
61 changes: 49 additions & 12 deletions cluster-api/src/main/java/io/scalecube/cluster/Member.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package io.scalecube.cluster;

import io.scalecube.cluster.membership.MembershipConfig;
import io.scalecube.net.Address;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.nio.file.Paths;
import java.util.Objects;
import java.util.UUID;

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

public Member() {}

/**
* Constructor.
*
* @param id member id
* @param id member id; not null
* @param alias member alias (optional)
* @param address member address
* @param address member address; not null
* @param namespace namespace; not null
*/
public Member(String id, String alias, Address address) {
public Member(String id, String alias, Address address, String namespace) {
this.id = Objects.requireNonNull(id, "member id");
this.alias = alias; // optional
this.address = Objects.requireNonNull(address, "member address");
this.namespace = Objects.requireNonNull(namespace, "member namespace");
}

/**
* Returns cluster member local id.
*
* @return member id
*/
public String id() {
return id;
}

/**
* Returns cluster member alias if exists, otherwise {@code null}.
*
* @see ClusterConfig#memberAlias(String)
* @return alias if exists or {@code null}
*/
public String alias() {
return alias;
}

public Address address() {
return address;
/**
* Returns cluster member namespace.
*
* @see MembershipConfig#namespace(String)
* @return namespace
*/
public String namespace() {
return namespace;
}

public static String generateId() {
return Long.toHexString(UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE);
/**
* Returns cluster member address, an address on which this cluster member listens connections
* from other cluster members.
*
* @see io.scalecube.cluster.transport.api.TransportConfig#port(int)
* @see io.scalecube.cluster.transport.api.TransportConfig#host(String)
* @see ClusterConfig#containerHost(String)
* @see ClusterConfig#containerPort(Integer)
* @return member address
*/
public Address address() {
return address;
}

@Override
Expand All @@ -60,12 +91,14 @@ public boolean equals(Object that) {
return false;
}
Member member = (Member) that;
return Objects.equals(id, member.id) && Objects.equals(address, member.address);
return Objects.equals(id, member.id)
&& Objects.equals(address, member.address)
&& Objects.equals(namespace, member.namespace);
}

@Override
public int hashCode() {
return Objects.hash(id, address);
return Objects.hash(id, address, namespace);
}

@Override
Expand All @@ -80,6 +113,8 @@ public void writeExternal(ObjectOutput out) throws IOException {
}
// address
out.writeUTF(address.toString());
// namespace
out.writeUTF(namespace);
}

@Override
Expand All @@ -93,14 +128,16 @@ public void readExternal(ObjectInput in) throws IOException {
}
// address
address = Address.from(in.readUTF());
// namespace
this.namespace = in.readUTF();
}

@Override
public String toString() {
if (alias == null) {
return id + "@" + address;
return Paths.get(namespace, id + "@" + address).toString();
} else {
return alias + "/" + id + "@" + address;
return Paths.get(namespace, alias, id + "@" + address).toString();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ public final class MembershipConfig implements Cloneable {
private int syncInterval = DEFAULT_SYNC_INTERVAL;
private int syncTimeout = DEFAULT_SYNC_TIMEOUT;
private int suspicionMult = DEFAULT_SUSPICION_MULT;
private String syncGroup = "default";
private int removedMembersHistorySize = 42;
private String namespace = "default";

public MembershipConfig() {}

Expand Down Expand Up @@ -142,19 +142,19 @@ public MembershipConfig suspicionMult(int suspicionMult) {
return m;
}

public String syncGroup() {
return syncGroup;
public String namespace() {
return namespace;
}

/**
* Sets a syncGroup.
* Sets a namespace.
*
* @param syncGroup sync group
* @param namespace namespace
* @return new {@code MembershipConfig} instance
*/
public MembershipConfig syncGroup(String syncGroup) {
public MembershipConfig namespace(String namespace) {
MembershipConfig m = clone();
m.syncGroup = syncGroup;
m.namespace = namespace;
return m;
}

Expand Down Expand Up @@ -190,7 +190,7 @@ public String toString() {
.add("syncInterval=" + syncInterval)
.add("syncTimeout=" + syncTimeout)
.add("suspicionMult=" + suspicionMult)
.add("syncGroup='" + syncGroup + "'")
.add("namespace='" + namespace + "'")
.add("removedMembersHistorySize=" + removedMembersHistorySize)
.toString();
}
Expand Down
2 changes: 1 addition & 1 deletion cluster-testlib/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<parent>
<artifactId>scalecube-cluster-parent</artifactId>
<groupId>io.scalecube</groupId>
<version>2.4.12-SNAPSHOT</version>
<version>2.5.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
2 changes: 1 addition & 1 deletion cluster/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<groupId>io.scalecube</groupId>
<artifactId>scalecube-cluster-parent</artifactId>
<version>2.4.12-SNAPSHOT</version>
<version>2.5.0-SNAPSHOT</version>
</parent>

<artifactId>scalecube-cluster</artifactId>
Expand Down
19 changes: 16 additions & 3 deletions cluster/src/main/java/io/scalecube/cluster/ClusterImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,10 @@
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.management.MBeanServer;
Expand All @@ -54,6 +56,8 @@ public final class ClusterImpl implements Cluster {

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

private static final Pattern NAMESPACE_PATTERN = Pattern.compile("^(\\w+[\\w\\-./]*\\w)+");

private static final Set<String> SYSTEM_MESSAGES =
Collections.unmodifiableSet(
Stream.of(
Expand Down Expand Up @@ -326,8 +330,13 @@ private void validateConfiguration() {
"Invalid cluster config: transport.messageCodec must be specified");

Objects.requireNonNull(
config.membershipConfig().syncGroup(),
"Invalid cluster config: membership.syncGroup must be specified");
config.membershipConfig().namespace(),
"Invalid cluster config: membership.namespace must be specified");

if (!NAMESPACE_PATTERN.matcher(config.membershipConfig().namespace()).matches()) {
throw new IllegalArgumentException(
"Invalid cluster config: membership.namespace format is invalid");
}
}

private void startHandler() {
Expand Down Expand Up @@ -395,7 +404,11 @@ private Member createLocalMember(Address address) {
.map(host -> Address.create(host, port))
.orElseGet(() -> Address.create(address.host(), port));

return new Member(Member.generateId(), config.memberAlias(), memberAddress);
return new Member(
Long.toHexString(UUID.randomUUID().getMostSignificantBits() & Long.MAX_VALUE),
config.memberAlias(),
memberAddress,
config.membershipConfig().namespace());
}

@Override
Expand Down
Loading

0 comments on commit 2beb770

Please sign in to comment.