Skip to content

Commit d1e1fd9

Browse files
committed
WIP on externalizable
1 parent b38fc88 commit d1e1fd9

File tree

15 files changed

+144
-67
lines changed

15 files changed

+144
-67
lines changed

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,29 @@ public int hashCode() {
7070

7171
@Override
7272
public void writeExternal(ObjectOutput out) throws IOException {
73-
// todo
73+
// id
74+
out.writeUTF(id);
75+
// alias
76+
boolean aliasNotNull = alias != null;
77+
out.writeBoolean(aliasNotNull);
78+
if (aliasNotNull) {
79+
out.writeUTF(alias);
80+
}
81+
// address
82+
out.writeUTF(address.toString());
7483
}
7584

7685
@Override
77-
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
78-
// todo
86+
public void readExternal(ObjectInput in) throws IOException {
87+
// id
88+
id = in.readUTF();
89+
// alias
90+
boolean aliasNotNull = in.readBoolean();
91+
if (aliasNotNull) {
92+
alias = in.readUTF();
93+
}
94+
// address
95+
address = Address.from(in.readUTF());
7996
}
8097

8198
@Override

cluster-api/src/main/java/io/scalecube/cluster/metadata/MetadataCodec.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package io.scalecube.cluster.metadata;
22

3+
import io.scalecube.cluster.codec.jdk.JdkMetadataCodec;
34
import io.scalecube.utils.ServiceLoaderUtil;
45
import java.nio.ByteBuffer;
56

67
/** Contains methods for metadata serializing/deserializing logic. */
78
public interface MetadataCodec {
89

9-
MetadataCodec INSTANCE = ServiceLoaderUtil.findFirst(MetadataCodec.class).orElse(null);
10+
MetadataCodec INSTANCE =
11+
ServiceLoaderUtil.findFirst(MetadataCodec.class).orElseGet(JdkMetadataCodec::new);
1012

1113
/**
1214
* Deserializes metadata from buffer.

cluster-testlib/pom.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@
2222
<artifactId>scalecube-cluster-api</artifactId>
2323
<version>${project.version}</version>
2424
</dependency>
25-
<dependency>
26-
<groupId>io.scalecube</groupId>
27-
<artifactId>scalecube-codec-jackson</artifactId>
28-
<version>${project.version}</version>
29-
</dependency>
3025
</dependencies>
3126

3227
</project>

cluster/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,6 @@
5151
<version>${log4j.version}</version>
5252
<scope>test</scope>
5353
</dependency>
54-
<dependency>
55-
<groupId>io.scalecube</groupId>
56-
<artifactId>scalecube-codec-jackson</artifactId>
57-
<version>${project.version}</version>
58-
<scope>test</scope>
59-
</dependency>
6054
</dependencies>
6155

6256
</project>

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

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import io.scalecube.cluster.transport.api.TransportConfig;
2121
import io.scalecube.net.Address;
2222
import io.scalecube.transport.netty.TransportImpl;
23+
import io.scalecube.utils.ServiceLoaderUtil;
24+
import java.io.Serializable;
2325
import java.lang.management.ManagementFactory;
2426
import java.nio.ByteBuffer;
2527
import java.util.Collection;
@@ -225,11 +227,7 @@ public Cluster startAwait() {
225227
}
226228

227229
private Mono<Cluster> doStart() {
228-
return Mono.defer(
229-
() -> {
230-
validateConfiguration();
231-
return doStart0();
232-
});
230+
return Mono.fromRunnable(this::validateConfiguration).then(Mono.fromRunnable(this::doStart0));
233231
}
234232

235233
private Mono<Cluster> doStart0() {
@@ -295,28 +293,31 @@ private Mono<Cluster> doStart0() {
295293
}
296294

297295
private void validateConfiguration() {
298-
MetadataDecoder metadataDecoder = config.metadataDecoder();
299-
MetadataEncoder metadataEncoder = config.metadataEncoder();
300-
MetadataCodec metadataCodec = config.metadataCodec();
301-
302-
if (metadataDecoder == null && metadataEncoder == null && metadataCodec == null) {
303-
throw new IllegalArgumentException("Invalid cluster config");
304-
}
296+
final MetadataDecoder metadataDecoder = config.metadataDecoder();
297+
final MetadataEncoder metadataEncoder = config.metadataEncoder();
298+
final MetadataCodec metadataCodec =
299+
ServiceLoaderUtil.findFirst(MetadataCodec.class).orElse(null);
305300

306301
if (metadataDecoder != null && metadataEncoder != null && metadataCodec != null) {
307-
throw new IllegalArgumentException("Invalid cluster config");
302+
throw new IllegalArgumentException(
303+
"Invalid cluster config: either pair of [metadataDecoder, metadataEncoder] "
304+
+ "or metadataCodec must be specified, not both");
308305
}
309306

310-
if (metadataCodec == null) {
311-
Objects.requireNonNull(
312-
metadataDecoder, "Invalid cluster config: metadataDecoder must be specified");
313-
Objects.requireNonNull(
314-
metadataEncoder, "Invalid cluster config: metadataEncoder must be specified");
307+
if ((metadataDecoder == null && metadataEncoder != null)
308+
|| (metadataDecoder != null && metadataEncoder == null)) {
309+
throw new IllegalArgumentException(
310+
"Invalid cluster config: both of [metadataDecoder, metadataEncoder] must be specified");
315311
}
316312

317313
if (metadataDecoder == null && metadataEncoder == null) {
318-
Objects.requireNonNull(
319-
metadataCodec, "Invalid cluster config: metadataCodec must be specified");
314+
if (metadataCodec == null) {
315+
Object metadata = config.metadata();
316+
if (metadata != null && !(metadata instanceof Serializable)) {
317+
throw new IllegalArgumentException(
318+
"Invalid cluster config: metadata must be Serializable");
319+
}
320+
}
320321
}
321322

322323
Objects.requireNonNull(

cluster/src/main/java/io/scalecube/cluster/fdetector/PingData.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,26 @@ public PingData withAckType(AckType ackType) {
8585

8686
@Override
8787
public void writeExternal(ObjectOutput out) throws IOException {
88-
// todo
88+
// from
89+
out.writeObject(from);
90+
// to
91+
out.writeObject(to);
92+
// originalIssuer
93+
out.writeObject(originalIssuer);
94+
// ackType
95+
out.writeObject(ackType);
8996
}
9097

9198
@Override
9299
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
93-
// todo
100+
// from
101+
from = (Member) in.readObject();
102+
// to
103+
to = (Member) in.readObject();
104+
// originalIssuer
105+
originalIssuer = (Member) in.readObject();
106+
// ackType
107+
ackType = (AckType) in.readObject();
94108
}
95109

96110
@Override

cluster/src/main/java/io/scalecube/cluster/gossip/Gossip.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,22 @@ public int hashCode() {
6363

6464
@Override
6565
public void writeExternal(ObjectOutput out) throws IOException {
66-
// todo
66+
// gossiperId
67+
out.writeUTF(gossiperId);
68+
// message
69+
out.writeObject(message);
70+
// sequenceId
71+
out.writeLong(sequenceId);
6772
}
6873

6974
@Override
7075
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
71-
// todo
76+
// gossiperId
77+
gossiperId = in.readUTF();
78+
// message
79+
message = (Message) in.readObject();
80+
// sequenceId
81+
sequenceId = in.readLong();
7282
}
7383

7484
@Override

cluster/src/main/java/io/scalecube/cluster/gossip/GossipRequest.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.ArrayList;
88
import java.util.Collections;
99
import java.util.List;
10+
import java.util.Objects;
1011
import java.util.StringJoiner;
1112

1213
/** Gossip request which be transmitted through the network, contains list of gossips. */
@@ -24,6 +25,8 @@ public GossipRequest(Gossip gossip, String from) {
2425
}
2526

2627
public GossipRequest(List<Gossip> gossips, String from) {
28+
Objects.requireNonNull(gossips);
29+
Objects.requireNonNull(from);
2730
this.gossips = new ArrayList<>(gossips);
2831
this.from = from;
2932
}
@@ -38,12 +41,25 @@ public String from() {
3841

3942
@Override
4043
public void writeExternal(ObjectOutput out) throws IOException {
41-
// todo
44+
// gossips
45+
out.writeInt(gossips.size());
46+
for (Gossip gossip : gossips) {
47+
out.writeObject(gossip);
48+
}
49+
// from
50+
out.writeUTF(from);
4251
}
4352

4453
@Override
4554
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
46-
// todo
55+
// gossips
56+
int size = in.readInt();
57+
gossips = new ArrayList<>(size);
58+
for (int i = 0; i < size; i++) {
59+
gossips.add((Gossip) in.readObject());
60+
}
61+
// from
62+
from = in.readUTF();
4763
}
4864

4965
@Override

cluster/src/main/java/io/scalecube/cluster/membership/MembershipRecord.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,22 @@ public int hashCode() {
108108

109109
@Override
110110
public void writeExternal(ObjectOutput out) throws IOException {
111-
// todo
111+
// member
112+
out.writeObject(member);
113+
// status
114+
out.writeObject(status);
115+
// incarnation
116+
out.writeInt(incarnation);
112117
}
113118

114119
@Override
115120
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
116-
// todo
121+
// member
122+
member = (Member) in.readObject();
123+
// status
124+
status = (MemberStatus) in.readObject();
125+
// incarnation
126+
incarnation = in.readInt();
117127
}
118128

119129
@Override

cluster/src/main/java/io/scalecube/cluster/membership/SyncData.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.ArrayList;
88
import java.util.Collection;
99
import java.util.List;
10+
import java.util.Objects;
1011
import java.util.StringJoiner;
1112

1213
/**
@@ -28,6 +29,8 @@ final class SyncData implements Externalizable {
2829
public SyncData() {}
2930

3031
public SyncData(Collection<MembershipRecord> membership, String syncGroup) {
32+
Objects.requireNonNull(membership);
33+
Objects.requireNonNull(syncGroup);
3134
this.membership = new ArrayList<>(membership);
3235
this.syncGroup = syncGroup;
3336
}
@@ -42,12 +45,25 @@ public String getSyncGroup() {
4245

4346
@Override
4447
public void writeExternal(ObjectOutput out) throws IOException {
45-
// todo
48+
// membership
49+
out.writeInt(membership.size());
50+
for (MembershipRecord record : membership) {
51+
out.writeObject(record);
52+
}
53+
// syncGroup
54+
out.writeUTF(syncGroup);
4655
}
4756

4857
@Override
4958
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
50-
// todo
59+
// membership
60+
int size = in.readInt();
61+
membership = new ArrayList<>(size);
62+
for (int i = 0; i < size; i++) {
63+
membership.add((MembershipRecord) in.readObject());
64+
}
65+
// syncGroup
66+
syncGroup = (String) in.readObject();
5167
}
5268

5369
@Override

0 commit comments

Comments
 (0)