diff --git a/akka-cluster/src/main/java/akka/cluster/protobuf/msg/ClusterMessages.java b/akka-cluster/src/main/java/akka/cluster/protobuf/msg/ClusterMessages.java index 378af5d88f..0bb7f3752b 100644 --- a/akka-cluster/src/main/java/akka/cluster/protobuf/msg/ClusterMessages.java +++ b/akka-cluster/src/main/java/akka/cluster/protobuf/msg/ClusterMessages.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2019 Lightbend Inc. + * Copyright (C) 2019 Lightbend Inc. */ // Generated by the protocol buffer compiler. DO NOT EDIT! @@ -4735,6 +4735,1404 @@ public final class ClusterMessages { akka.cluster.protobuf.msg.ClusterMessages.CompatibleConfig.getDefaultInstance()); } + public interface HeartbeatOrBuilder + extends akka.protobuf.MessageOrBuilder { + + // required .Address from = 1; + /** + * required .Address from = 1; + */ + boolean hasFrom(); + /** + * required .Address from = 1; + */ + akka.cluster.protobuf.msg.ClusterMessages.Address getFrom(); + /** + * required .Address from = 1; + */ + akka.cluster.protobuf.msg.ClusterMessages.AddressOrBuilder getFromOrBuilder(); + + // optional int64 sequenceNr = 2; + /** + * optional int64 sequenceNr = 2; + */ + boolean hasSequenceNr(); + /** + * optional int64 sequenceNr = 2; + */ + long getSequenceNr(); + + // optional sint64 creationTime = 3; + /** + * optional sint64 creationTime = 3; + */ + boolean hasCreationTime(); + /** + * optional sint64 creationTime = 3; + */ + long getCreationTime(); + } + /** + * Protobuf type {@code Heartbeat} + * + *
+   **
+   * Prior to version 2.5.24
+   * Heartbeat sends an Address
+   * Version 2.5.24 can deserialize this message but does not send it.
+   * 
+ */ + public static final class Heartbeat extends + akka.protobuf.GeneratedMessage + implements HeartbeatOrBuilder { + // Use Heartbeat.newBuilder() to construct. + private Heartbeat(akka.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Heartbeat(boolean noInit) { this.unknownFields = akka.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Heartbeat defaultInstance; + public static Heartbeat getDefaultInstance() { + return defaultInstance; + } + + public Heartbeat getDefaultInstanceForType() { + return defaultInstance; + } + + private final akka.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final akka.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Heartbeat( + akka.protobuf.CodedInputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws akka.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + akka.protobuf.UnknownFieldSet.Builder unknownFields = + akka.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + akka.cluster.protobuf.msg.ClusterMessages.Address.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = from_.toBuilder(); + } + from_ = input.readMessage(akka.cluster.protobuf.msg.ClusterMessages.Address.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(from_); + from_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 16: { + bitField0_ |= 0x00000002; + sequenceNr_ = input.readInt64(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + creationTime_ = input.readSInt64(); + break; + } + } + } + } catch (akka.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobuf.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_Heartbeat_descriptor; + } + + protected akka.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_Heartbeat_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.protobuf.msg.ClusterMessages.Heartbeat.class, akka.cluster.protobuf.msg.ClusterMessages.Heartbeat.Builder.class); + } + + public static akka.protobuf.Parser PARSER = + new akka.protobuf.AbstractParser() { + public Heartbeat parsePartialFrom( + akka.protobuf.CodedInputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws akka.protobuf.InvalidProtocolBufferException { + return new Heartbeat(input, extensionRegistry); + } + }; + + @java.lang.Override + public akka.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required .Address from = 1; + public static final int FROM_FIELD_NUMBER = 1; + private akka.cluster.protobuf.msg.ClusterMessages.Address from_; + /** + * required .Address from = 1; + */ + public boolean hasFrom() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required .Address from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.Address getFrom() { + return from_; + } + /** + * required .Address from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.AddressOrBuilder getFromOrBuilder() { + return from_; + } + + // optional int64 sequenceNr = 2; + public static final int SEQUENCENR_FIELD_NUMBER = 2; + private long sequenceNr_; + /** + * optional int64 sequenceNr = 2; + */ + public boolean hasSequenceNr() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional int64 sequenceNr = 2; + */ + public long getSequenceNr() { + return sequenceNr_; + } + + // optional sint64 creationTime = 3; + public static final int CREATIONTIME_FIELD_NUMBER = 3; + private long creationTime_; + /** + * optional sint64 creationTime = 3; + */ + public boolean hasCreationTime() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional sint64 creationTime = 3; + */ + public long getCreationTime() { + return creationTime_; + } + + private void initFields() { + from_ = akka.cluster.protobuf.msg.ClusterMessages.Address.getDefaultInstance(); + sequenceNr_ = 0L; + creationTime_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasFrom()) { + memoizedIsInitialized = 0; + return false; + } + if (!getFrom().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(akka.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, from_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeInt64(2, sequenceNr_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeSInt64(3, creationTime_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += akka.protobuf.CodedOutputStream + .computeMessageSize(1, from_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += akka.protobuf.CodedOutputStream + .computeInt64Size(2, sequenceNr_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += akka.protobuf.CodedOutputStream + .computeSInt64Size(3, creationTime_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseFrom( + akka.protobuf.ByteString data) + throws akka.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseFrom( + akka.protobuf.ByteString data, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws akka.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseFrom(byte[] data) + throws akka.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseFrom( + byte[] data, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws akka.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseFrom( + java.io.InputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseDelimitedFrom( + java.io.InputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseFrom( + akka.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parseFrom( + akka.protobuf.CodedInputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(akka.cluster.protobuf.msg.ClusterMessages.Heartbeat prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code Heartbeat} + * + *
+     **
+     * Prior to version 2.5.24
+     * Heartbeat sends an Address
+     * Version 2.5.24 can deserialize this message but does not send it.
+     * 
+ */ + public static final class Builder extends + akka.protobuf.GeneratedMessage.Builder + implements akka.cluster.protobuf.msg.ClusterMessages.HeartbeatOrBuilder { + public static final akka.protobuf.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_Heartbeat_descriptor; + } + + protected akka.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_Heartbeat_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.protobuf.msg.ClusterMessages.Heartbeat.class, akka.cluster.protobuf.msg.ClusterMessages.Heartbeat.Builder.class); + } + + // Construct using akka.cluster.protobuf.msg.ClusterMessages.Heartbeat.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getFromFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (fromBuilder_ == null) { + from_ = akka.cluster.protobuf.msg.ClusterMessages.Address.getDefaultInstance(); + } else { + fromBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + sequenceNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + creationTime_ = 0L; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public akka.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_Heartbeat_descriptor; + } + + public akka.cluster.protobuf.msg.ClusterMessages.Heartbeat getDefaultInstanceForType() { + return akka.cluster.protobuf.msg.ClusterMessages.Heartbeat.getDefaultInstance(); + } + + public akka.cluster.protobuf.msg.ClusterMessages.Heartbeat build() { + akka.cluster.protobuf.msg.ClusterMessages.Heartbeat result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public akka.cluster.protobuf.msg.ClusterMessages.Heartbeat buildPartial() { + akka.cluster.protobuf.msg.ClusterMessages.Heartbeat result = new akka.cluster.protobuf.msg.ClusterMessages.Heartbeat(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (fromBuilder_ == null) { + result.from_ = from_; + } else { + result.from_ = fromBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.sequenceNr_ = sequenceNr_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.creationTime_ = creationTime_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(akka.protobuf.Message other) { + if (other instanceof akka.cluster.protobuf.msg.ClusterMessages.Heartbeat) { + return mergeFrom((akka.cluster.protobuf.msg.ClusterMessages.Heartbeat)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.protobuf.msg.ClusterMessages.Heartbeat other) { + if (other == akka.cluster.protobuf.msg.ClusterMessages.Heartbeat.getDefaultInstance()) return this; + if (other.hasFrom()) { + mergeFrom(other.getFrom()); + } + if (other.hasSequenceNr()) { + setSequenceNr(other.getSequenceNr()); + } + if (other.hasCreationTime()) { + setCreationTime(other.getCreationTime()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasFrom()) { + + return false; + } + if (!getFrom().isInitialized()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + akka.protobuf.CodedInputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.protobuf.msg.ClusterMessages.Heartbeat parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.protobuf.msg.ClusterMessages.Heartbeat) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required .Address from = 1; + private akka.cluster.protobuf.msg.ClusterMessages.Address from_ = akka.cluster.protobuf.msg.ClusterMessages.Address.getDefaultInstance(); + private akka.protobuf.SingleFieldBuilder< + akka.cluster.protobuf.msg.ClusterMessages.Address, akka.cluster.protobuf.msg.ClusterMessages.Address.Builder, akka.cluster.protobuf.msg.ClusterMessages.AddressOrBuilder> fromBuilder_; + /** + * required .Address from = 1; + */ + public boolean hasFrom() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required .Address from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.Address getFrom() { + if (fromBuilder_ == null) { + return from_; + } else { + return fromBuilder_.getMessage(); + } + } + /** + * required .Address from = 1; + */ + public Builder setFrom(akka.cluster.protobuf.msg.ClusterMessages.Address value) { + if (fromBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + from_ = value; + onChanged(); + } else { + fromBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .Address from = 1; + */ + public Builder setFrom( + akka.cluster.protobuf.msg.ClusterMessages.Address.Builder builderForValue) { + if (fromBuilder_ == null) { + from_ = builderForValue.build(); + onChanged(); + } else { + fromBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .Address from = 1; + */ + public Builder mergeFrom(akka.cluster.protobuf.msg.ClusterMessages.Address value) { + if (fromBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + from_ != akka.cluster.protobuf.msg.ClusterMessages.Address.getDefaultInstance()) { + from_ = + akka.cluster.protobuf.msg.ClusterMessages.Address.newBuilder(from_).mergeFrom(value).buildPartial(); + } else { + from_ = value; + } + onChanged(); + } else { + fromBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .Address from = 1; + */ + public Builder clearFrom() { + if (fromBuilder_ == null) { + from_ = akka.cluster.protobuf.msg.ClusterMessages.Address.getDefaultInstance(); + onChanged(); + } else { + fromBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * required .Address from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.Address.Builder getFromBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getFromFieldBuilder().getBuilder(); + } + /** + * required .Address from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.AddressOrBuilder getFromOrBuilder() { + if (fromBuilder_ != null) { + return fromBuilder_.getMessageOrBuilder(); + } else { + return from_; + } + } + /** + * required .Address from = 1; + */ + private akka.protobuf.SingleFieldBuilder< + akka.cluster.protobuf.msg.ClusterMessages.Address, akka.cluster.protobuf.msg.ClusterMessages.Address.Builder, akka.cluster.protobuf.msg.ClusterMessages.AddressOrBuilder> + getFromFieldBuilder() { + if (fromBuilder_ == null) { + fromBuilder_ = new akka.protobuf.SingleFieldBuilder< + akka.cluster.protobuf.msg.ClusterMessages.Address, akka.cluster.protobuf.msg.ClusterMessages.Address.Builder, akka.cluster.protobuf.msg.ClusterMessages.AddressOrBuilder>( + from_, + getParentForChildren(), + isClean()); + from_ = null; + } + return fromBuilder_; + } + + // optional int64 sequenceNr = 2; + private long sequenceNr_ ; + /** + * optional int64 sequenceNr = 2; + */ + public boolean hasSequenceNr() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional int64 sequenceNr = 2; + */ + public long getSequenceNr() { + return sequenceNr_; + } + /** + * optional int64 sequenceNr = 2; + */ + public Builder setSequenceNr(long value) { + bitField0_ |= 0x00000002; + sequenceNr_ = value; + onChanged(); + return this; + } + /** + * optional int64 sequenceNr = 2; + */ + public Builder clearSequenceNr() { + bitField0_ = (bitField0_ & ~0x00000002); + sequenceNr_ = 0L; + onChanged(); + return this; + } + + // optional sint64 creationTime = 3; + private long creationTime_ ; + /** + * optional sint64 creationTime = 3; + */ + public boolean hasCreationTime() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional sint64 creationTime = 3; + */ + public long getCreationTime() { + return creationTime_; + } + /** + * optional sint64 creationTime = 3; + */ + public Builder setCreationTime(long value) { + bitField0_ |= 0x00000004; + creationTime_ = value; + onChanged(); + return this; + } + /** + * optional sint64 creationTime = 3; + */ + public Builder clearCreationTime() { + bitField0_ = (bitField0_ & ~0x00000004); + creationTime_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:Heartbeat) + } + + static { + defaultInstance = new Heartbeat(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:Heartbeat) + } + + public interface HeartBeatResponseOrBuilder + extends akka.protobuf.MessageOrBuilder { + + // required .UniqueAddress from = 1; + /** + * required .UniqueAddress from = 1; + */ + boolean hasFrom(); + /** + * required .UniqueAddress from = 1; + */ + akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress getFrom(); + /** + * required .UniqueAddress from = 1; + */ + akka.cluster.protobuf.msg.ClusterMessages.UniqueAddressOrBuilder getFromOrBuilder(); + + // optional int64 sequenceNr = 2; + /** + * optional int64 sequenceNr = 2; + */ + boolean hasSequenceNr(); + /** + * optional int64 sequenceNr = 2; + */ + long getSequenceNr(); + + // optional int64 creationTime = 3; + /** + * optional int64 creationTime = 3; + */ + boolean hasCreationTime(); + /** + * optional int64 creationTime = 3; + */ + long getCreationTime(); + } + /** + * Protobuf type {@code HeartBeatResponse} + * + *
+   **
+   * Prior to version 2.5.24
+   * HeartbeatRsp Sends an UniqueAddress
+   * Version 2.5.24 can deserialize this message but does not send it.
+   * 
+ */ + public static final class HeartBeatResponse extends + akka.protobuf.GeneratedMessage + implements HeartBeatResponseOrBuilder { + // Use HeartBeatResponse.newBuilder() to construct. + private HeartBeatResponse(akka.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private HeartBeatResponse(boolean noInit) { this.unknownFields = akka.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final HeartBeatResponse defaultInstance; + public static HeartBeatResponse getDefaultInstance() { + return defaultInstance; + } + + public HeartBeatResponse getDefaultInstanceForType() { + return defaultInstance; + } + + private final akka.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final akka.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private HeartBeatResponse( + akka.protobuf.CodedInputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws akka.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + akka.protobuf.UnknownFieldSet.Builder unknownFields = + akka.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 10: { + akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.Builder subBuilder = null; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + subBuilder = from_.toBuilder(); + } + from_ = input.readMessage(akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(from_); + from_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000001; + break; + } + case 16: { + bitField0_ |= 0x00000002; + sequenceNr_ = input.readInt64(); + break; + } + case 24: { + bitField0_ |= 0x00000004; + creationTime_ = input.readInt64(); + break; + } + } + } + } catch (akka.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new akka.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final akka.protobuf.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_HeartBeatResponse_descriptor; + } + + protected akka.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_HeartBeatResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse.class, akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse.Builder.class); + } + + public static akka.protobuf.Parser PARSER = + new akka.protobuf.AbstractParser() { + public HeartBeatResponse parsePartialFrom( + akka.protobuf.CodedInputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws akka.protobuf.InvalidProtocolBufferException { + return new HeartBeatResponse(input, extensionRegistry); + } + }; + + @java.lang.Override + public akka.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + // required .UniqueAddress from = 1; + public static final int FROM_FIELD_NUMBER = 1; + private akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress from_; + /** + * required .UniqueAddress from = 1; + */ + public boolean hasFrom() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required .UniqueAddress from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress getFrom() { + return from_; + } + /** + * required .UniqueAddress from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.UniqueAddressOrBuilder getFromOrBuilder() { + return from_; + } + + // optional int64 sequenceNr = 2; + public static final int SEQUENCENR_FIELD_NUMBER = 2; + private long sequenceNr_; + /** + * optional int64 sequenceNr = 2; + */ + public boolean hasSequenceNr() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional int64 sequenceNr = 2; + */ + public long getSequenceNr() { + return sequenceNr_; + } + + // optional int64 creationTime = 3; + public static final int CREATIONTIME_FIELD_NUMBER = 3; + private long creationTime_; + /** + * optional int64 creationTime = 3; + */ + public boolean hasCreationTime() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional int64 creationTime = 3; + */ + public long getCreationTime() { + return creationTime_; + } + + private void initFields() { + from_ = akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.getDefaultInstance(); + sequenceNr_ = 0L; + creationTime_ = 0L; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized != -1) return isInitialized == 1; + + if (!hasFrom()) { + memoizedIsInitialized = 0; + return false; + } + if (!getFrom().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(akka.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeMessage(1, from_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeInt64(2, sequenceNr_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + output.writeInt64(3, creationTime_); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += akka.protobuf.CodedOutputStream + .computeMessageSize(1, from_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += akka.protobuf.CodedOutputStream + .computeInt64Size(2, sequenceNr_); + } + if (((bitField0_ & 0x00000004) == 0x00000004)) { + size += akka.protobuf.CodedOutputStream + .computeInt64Size(3, creationTime_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseFrom( + akka.protobuf.ByteString data) + throws akka.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseFrom( + akka.protobuf.ByteString data, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws akka.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseFrom(byte[] data) + throws akka.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseFrom( + byte[] data, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws akka.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseFrom( + java.io.InputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseDelimitedFrom( + java.io.InputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseFrom( + akka.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parseFrom( + akka.protobuf.CodedInputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + akka.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code HeartBeatResponse} + * + *
+     **
+     * Prior to version 2.5.24
+     * HeartbeatRsp Sends an UniqueAddress
+     * Version 2.5.24 can deserialize this message but does not send it.
+     * 
+ */ + public static final class Builder extends + akka.protobuf.GeneratedMessage.Builder + implements akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponseOrBuilder { + public static final akka.protobuf.Descriptors.Descriptor + getDescriptor() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_HeartBeatResponse_descriptor; + } + + protected akka.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_HeartBeatResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse.class, akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse.Builder.class); + } + + // Construct using akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + akka.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (akka.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + getFromFieldBuilder(); + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + if (fromBuilder_ == null) { + from_ = akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.getDefaultInstance(); + } else { + fromBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + sequenceNr_ = 0L; + bitField0_ = (bitField0_ & ~0x00000002); + creationTime_ = 0L; + bitField0_ = (bitField0_ & ~0x00000004); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public akka.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return akka.cluster.protobuf.msg.ClusterMessages.internal_static_HeartBeatResponse_descriptor; + } + + public akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse getDefaultInstanceForType() { + return akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse.getDefaultInstance(); + } + + public akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse build() { + akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse buildPartial() { + akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse result = new akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + if (fromBuilder_ == null) { + result.from_ = from_; + } else { + result.from_ = fromBuilder_.build(); + } + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.sequenceNr_ = sequenceNr_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000004; + } + result.creationTime_ = creationTime_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(akka.protobuf.Message other) { + if (other instanceof akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse) { + return mergeFrom((akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse other) { + if (other == akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse.getDefaultInstance()) return this; + if (other.hasFrom()) { + mergeFrom(other.getFrom()); + } + if (other.hasSequenceNr()) { + setSequenceNr(other.getSequenceNr()); + } + if (other.hasCreationTime()) { + setCreationTime(other.getCreationTime()); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasFrom()) { + + return false; + } + if (!getFrom().isInitialized()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + akka.protobuf.CodedInputStream input, + akka.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (akka.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (akka.cluster.protobuf.msg.ClusterMessages.HeartBeatResponse) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + // required .UniqueAddress from = 1; + private akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress from_ = akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.getDefaultInstance(); + private akka.protobuf.SingleFieldBuilder< + akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress, akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.Builder, akka.cluster.protobuf.msg.ClusterMessages.UniqueAddressOrBuilder> fromBuilder_; + /** + * required .UniqueAddress from = 1; + */ + public boolean hasFrom() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required .UniqueAddress from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress getFrom() { + if (fromBuilder_ == null) { + return from_; + } else { + return fromBuilder_.getMessage(); + } + } + /** + * required .UniqueAddress from = 1; + */ + public Builder setFrom(akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress value) { + if (fromBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + from_ = value; + onChanged(); + } else { + fromBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .UniqueAddress from = 1; + */ + public Builder setFrom( + akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.Builder builderForValue) { + if (fromBuilder_ == null) { + from_ = builderForValue.build(); + onChanged(); + } else { + fromBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .UniqueAddress from = 1; + */ + public Builder mergeFrom(akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress value) { + if (fromBuilder_ == null) { + if (((bitField0_ & 0x00000001) == 0x00000001) && + from_ != akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.getDefaultInstance()) { + from_ = + akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.newBuilder(from_).mergeFrom(value).buildPartial(); + } else { + from_ = value; + } + onChanged(); + } else { + fromBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + return this; + } + /** + * required .UniqueAddress from = 1; + */ + public Builder clearFrom() { + if (fromBuilder_ == null) { + from_ = akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.getDefaultInstance(); + onChanged(); + } else { + fromBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + return this; + } + /** + * required .UniqueAddress from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.Builder getFromBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getFromFieldBuilder().getBuilder(); + } + /** + * required .UniqueAddress from = 1; + */ + public akka.cluster.protobuf.msg.ClusterMessages.UniqueAddressOrBuilder getFromOrBuilder() { + if (fromBuilder_ != null) { + return fromBuilder_.getMessageOrBuilder(); + } else { + return from_; + } + } + /** + * required .UniqueAddress from = 1; + */ + private akka.protobuf.SingleFieldBuilder< + akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress, akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.Builder, akka.cluster.protobuf.msg.ClusterMessages.UniqueAddressOrBuilder> + getFromFieldBuilder() { + if (fromBuilder_ == null) { + fromBuilder_ = new akka.protobuf.SingleFieldBuilder< + akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress, akka.cluster.protobuf.msg.ClusterMessages.UniqueAddress.Builder, akka.cluster.protobuf.msg.ClusterMessages.UniqueAddressOrBuilder>( + from_, + getParentForChildren(), + isClean()); + from_ = null; + } + return fromBuilder_; + } + + // optional int64 sequenceNr = 2; + private long sequenceNr_ ; + /** + * optional int64 sequenceNr = 2; + */ + public boolean hasSequenceNr() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional int64 sequenceNr = 2; + */ + public long getSequenceNr() { + return sequenceNr_; + } + /** + * optional int64 sequenceNr = 2; + */ + public Builder setSequenceNr(long value) { + bitField0_ |= 0x00000002; + sequenceNr_ = value; + onChanged(); + return this; + } + /** + * optional int64 sequenceNr = 2; + */ + public Builder clearSequenceNr() { + bitField0_ = (bitField0_ & ~0x00000002); + sequenceNr_ = 0L; + onChanged(); + return this; + } + + // optional int64 creationTime = 3; + private long creationTime_ ; + /** + * optional int64 creationTime = 3; + */ + public boolean hasCreationTime() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional int64 creationTime = 3; + */ + public long getCreationTime() { + return creationTime_; + } + /** + * optional int64 creationTime = 3; + */ + public Builder setCreationTime(long value) { + bitField0_ |= 0x00000004; + creationTime_ = value; + onChanged(); + return this; + } + /** + * optional int64 creationTime = 3; + */ + public Builder clearCreationTime() { + bitField0_ = (bitField0_ & ~0x00000004); + creationTime_ = 0L; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:HeartBeatResponse) + } + + static { + defaultInstance = new HeartBeatResponse(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:HeartBeatResponse) + } + public interface GossipEnvelopeOrBuilder extends akka.protobuf.MessageOrBuilder { @@ -17972,6 +19370,16 @@ public final class ClusterMessages { private static akka.protobuf.GeneratedMessage.FieldAccessorTable internal_static_CompatibleConfig_fieldAccessorTable; + private static akka.protobuf.Descriptors.Descriptor + internal_static_Heartbeat_descriptor; + private static + akka.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_Heartbeat_fieldAccessorTable; + private static akka.protobuf.Descriptors.Descriptor + internal_static_HeartBeatResponse_descriptor; + private static + akka.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_HeartBeatResponse_fieldAccessorTable; private static akka.protobuf.Descriptors.Descriptor internal_static_GossipEnvelope_descriptor; private static @@ -18077,48 +19485,52 @@ public final class ClusterMessages { "onfigCheck\030e \002(\0132\023.IncompatibleConfig\"_\n" + "\020CompatibleConfig\022\025\n\rclusterConfig\030\002 \002(\t" + "24\n\013checkConfig\022\014.ConfigCheck\030f \002(\0132\021.Co" + - "mpatibleConfig\"d\n\016GossipEnvelope\022\034\n\004from" + - "\030\001 \002(\0132\016.UniqueAddress\022\032\n\002to\030\002 \002(\0132\016.Uni" + - "queAddress\022\030\n\020serializedGossip\030\003 \002(\014\"^\n\014" + - "GossipStatus\022\034\n\004from\030\001 \002(\0132\016.UniqueAddre", - "ss\022\021\n\tallHashes\030\002 \003(\t\022\035\n\007version\030\003 \002(\0132\014" + - ".VectorClock\"\317\001\n\006Gossip\022$\n\014allAddresses\030" + - "\001 \003(\0132\016.UniqueAddress\022\020\n\010allRoles\030\002 \003(\t\022" + - "\021\n\tallHashes\030\003 \003(\t\022\030\n\007members\030\004 \003(\0132\007.Me" + - "mber\022!\n\010overview\030\005 \002(\0132\017.GossipOverview\022" + - "\035\n\007version\030\006 \002(\0132\014.VectorClock\022\036\n\ntombst" + - "ones\030\007 \003(\0132\n.Tombstone\"S\n\016GossipOverview" + - "\022\014\n\004seen\030\001 \003(\005\0223\n\024observerReachability\030\002" + - " \003(\0132\025.ObserverReachability\"p\n\024ObserverR" + - "eachability\022\024\n\014addressIndex\030\001 \002(\005\022\017\n\007ver", - "sion\030\004 \002(\003\0221\n\023subjectReachability\030\002 \003(\0132" + - "\024.SubjectReachability\"a\n\023SubjectReachabi" + - "lity\022\024\n\014addressIndex\030\001 \002(\005\022#\n\006status\030\003 \002" + - "(\0162\023.ReachabilityStatus\022\017\n\007version\030\004 \002(\003" + - "\"4\n\tTombstone\022\024\n\014addressIndex\030\001 \002(\005\022\021\n\tt" + - "imestamp\030\002 \002(\003\"i\n\006Member\022\024\n\014addressIndex" + - "\030\001 \002(\005\022\020\n\010upNumber\030\002 \002(\005\022\035\n\006status\030\003 \002(\016" + - "2\r.MemberStatus\022\030\n\014rolesIndexes\030\004 \003(\005B\002\020" + - "\001\"y\n\013VectorClock\022\021\n\ttimestamp\030\001 \001(\003\022&\n\010v" + - "ersions\030\002 \003(\0132\024.VectorClock.Version\032/\n\007V", - "ersion\022\021\n\thashIndex\030\001 \002(\005\022\021\n\ttimestamp\030\002" + - " \002(\003\"\007\n\005Empty\"K\n\007Address\022\016\n\006system\030\001 \002(\t" + - "\022\020\n\010hostname\030\002 \002(\t\022\014\n\004port\030\003 \002(\r\022\020\n\010prot" + - "ocol\030\004 \001(\t\"E\n\rUniqueAddress\022\031\n\007address\030\001" + - " \002(\0132\010.Address\022\013\n\003uid\030\002 \002(\r\022\014\n\004uid2\030\003 \001(" + - "\r\"V\n\021ClusterRouterPool\022\023\n\004pool\030\001 \002(\0132\005.P" + - "ool\022,\n\010settings\030\002 \002(\0132\032.ClusterRouterPoo" + - "lSettings\"<\n\004Pool\022\024\n\014serializerId\030\001 \002(\r\022" + - "\020\n\010manifest\030\002 \002(\t\022\014\n\004data\030\003 \002(\014\"\216\001\n\031Clus" + - "terRouterPoolSettings\022\026\n\016totalInstances\030", - "\001 \002(\r\022\033\n\023maxInstancesPerNode\030\002 \002(\r\022\031\n\021al" + - "lowLocalRoutees\030\003 \002(\010\022\017\n\007useRole\030\004 \001(\t\022\020" + - "\n\010useRoles\030\005 \003(\t*D\n\022ReachabilityStatus\022\r" + - "\n\tReachable\020\000\022\017\n\013Unreachable\020\001\022\016\n\nTermin" + - "ated\020\002*b\n\014MemberStatus\022\013\n\007Joining\020\000\022\006\n\002U" + - "p\020\001\022\013\n\007Leaving\020\002\022\013\n\007Exiting\020\003\022\010\n\004Down\020\004\022" + - "\013\n\007Removed\020\005\022\014\n\010WeaklyUp\020\006B\035\n\031akka.clust" + - "er.protobuf.msgH\001" + "mpatibleConfig\"M\n\tHeartbeat\022\026\n\004from\030\001 \002(" + + "\0132\010.Address\022\022\n\nsequenceNr\030\002 \001(\003\022\024\n\014creat" + + "ionTime\030\003 \001(\022\"[\n\021HeartBeatResponse\022\034\n\004fr" + + "om\030\001 \002(\0132\016.UniqueAddress\022\022\n\nsequenceNr\030\002", + " \001(\003\022\024\n\014creationTime\030\003 \001(\003\"d\n\016GossipEnve" + + "lope\022\034\n\004from\030\001 \002(\0132\016.UniqueAddress\022\032\n\002to" + + "\030\002 \002(\0132\016.UniqueAddress\022\030\n\020serializedGoss" + + "ip\030\003 \002(\014\"^\n\014GossipStatus\022\034\n\004from\030\001 \002(\0132\016" + + ".UniqueAddress\022\021\n\tallHashes\030\002 \003(\t\022\035\n\007ver" + + "sion\030\003 \002(\0132\014.VectorClock\"\317\001\n\006Gossip\022$\n\014a" + + "llAddresses\030\001 \003(\0132\016.UniqueAddress\022\020\n\010all" + + "Roles\030\002 \003(\t\022\021\n\tallHashes\030\003 \003(\t\022\030\n\007member" + + "s\030\004 \003(\0132\007.Member\022!\n\010overview\030\005 \002(\0132\017.Gos" + + "sipOverview\022\035\n\007version\030\006 \002(\0132\014.VectorClo", + "ck\022\036\n\ntombstones\030\007 \003(\0132\n.Tombstone\"S\n\016Go" + + "ssipOverview\022\014\n\004seen\030\001 \003(\005\0223\n\024observerRe" + + "achability\030\002 \003(\0132\025.ObserverReachability\"" + + "p\n\024ObserverReachability\022\024\n\014addressIndex\030" + + "\001 \002(\005\022\017\n\007version\030\004 \002(\003\0221\n\023subjectReachab" + + "ility\030\002 \003(\0132\024.SubjectReachability\"a\n\023Sub" + + "jectReachability\022\024\n\014addressIndex\030\001 \002(\005\022#" + + "\n\006status\030\003 \002(\0162\023.ReachabilityStatus\022\017\n\007v" + + "ersion\030\004 \002(\003\"4\n\tTombstone\022\024\n\014addressInde" + + "x\030\001 \002(\005\022\021\n\ttimestamp\030\002 \002(\003\"i\n\006Member\022\024\n\014", + "addressIndex\030\001 \002(\005\022\020\n\010upNumber\030\002 \002(\005\022\035\n\006" + + "status\030\003 \002(\0162\r.MemberStatus\022\030\n\014rolesInde" + + "xes\030\004 \003(\005B\002\020\001\"y\n\013VectorClock\022\021\n\ttimestam" + + "p\030\001 \001(\003\022&\n\010versions\030\002 \003(\0132\024.VectorClock." + + "Version\032/\n\007Version\022\021\n\thashIndex\030\001 \002(\005\022\021\n" + + "\ttimestamp\030\002 \002(\003\"\007\n\005Empty\"K\n\007Address\022\016\n\006" + + "system\030\001 \002(\t\022\020\n\010hostname\030\002 \002(\t\022\014\n\004port\030\003" + + " \002(\r\022\020\n\010protocol\030\004 \001(\t\"E\n\rUniqueAddress\022" + + "\031\n\007address\030\001 \002(\0132\010.Address\022\013\n\003uid\030\002 \002(\r\022" + + "\014\n\004uid2\030\003 \001(\r\"V\n\021ClusterRouterPool\022\023\n\004po", + "ol\030\001 \002(\0132\005.Pool\022,\n\010settings\030\002 \002(\0132\032.Clus" + + "terRouterPoolSettings\"<\n\004Pool\022\024\n\014seriali" + + "zerId\030\001 \002(\r\022\020\n\010manifest\030\002 \002(\t\022\014\n\004data\030\003 " + + "\002(\014\"\216\001\n\031ClusterRouterPoolSettings\022\026\n\016tot" + + "alInstances\030\001 \002(\r\022\033\n\023maxInstancesPerNode" + + "\030\002 \002(\r\022\031\n\021allowLocalRoutees\030\003 \002(\010\022\017\n\007use" + + "Role\030\004 \001(\t\022\020\n\010useRoles\030\005 \003(\t*D\n\022Reachabi" + + "lityStatus\022\r\n\tReachable\020\000\022\017\n\013Unreachable" + + "\020\001\022\016\n\nTerminated\020\002*b\n\014MemberStatus\022\013\n\007Jo" + + "ining\020\000\022\006\n\002Up\020\001\022\013\n\007Leaving\020\002\022\013\n\007Exiting\020", + "\003\022\010\n\004Down\020\004\022\013\n\007Removed\020\005\022\014\n\010WeaklyUp\020\006B\035" + + "\n\031akka.cluster.protobuf.msgH\001" }; akka.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new akka.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -18173,56 +19585,68 @@ public final class ClusterMessages { akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_CompatibleConfig_descriptor, new java.lang.String[] { "ClusterConfig", }); - internal_static_GossipEnvelope_descriptor = + internal_static_Heartbeat_descriptor = getDescriptor().getMessageTypes().get(8); + internal_static_Heartbeat_fieldAccessorTable = new + akka.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_Heartbeat_descriptor, + new java.lang.String[] { "From", "SequenceNr", "CreationTime", }); + internal_static_HeartBeatResponse_descriptor = + getDescriptor().getMessageTypes().get(9); + internal_static_HeartBeatResponse_fieldAccessorTable = new + akka.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_HeartBeatResponse_descriptor, + new java.lang.String[] { "From", "SequenceNr", "CreationTime", }); + internal_static_GossipEnvelope_descriptor = + getDescriptor().getMessageTypes().get(10); internal_static_GossipEnvelope_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_GossipEnvelope_descriptor, new java.lang.String[] { "From", "To", "SerializedGossip", }); internal_static_GossipStatus_descriptor = - getDescriptor().getMessageTypes().get(9); + getDescriptor().getMessageTypes().get(11); internal_static_GossipStatus_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_GossipStatus_descriptor, new java.lang.String[] { "From", "AllHashes", "Version", }); internal_static_Gossip_descriptor = - getDescriptor().getMessageTypes().get(10); + getDescriptor().getMessageTypes().get(12); internal_static_Gossip_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_Gossip_descriptor, new java.lang.String[] { "AllAddresses", "AllRoles", "AllHashes", "Members", "Overview", "Version", "Tombstones", }); internal_static_GossipOverview_descriptor = - getDescriptor().getMessageTypes().get(11); + getDescriptor().getMessageTypes().get(13); internal_static_GossipOverview_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_GossipOverview_descriptor, new java.lang.String[] { "Seen", "ObserverReachability", }); internal_static_ObserverReachability_descriptor = - getDescriptor().getMessageTypes().get(12); + getDescriptor().getMessageTypes().get(14); internal_static_ObserverReachability_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_ObserverReachability_descriptor, new java.lang.String[] { "AddressIndex", "Version", "SubjectReachability", }); internal_static_SubjectReachability_descriptor = - getDescriptor().getMessageTypes().get(13); + getDescriptor().getMessageTypes().get(15); internal_static_SubjectReachability_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_SubjectReachability_descriptor, new java.lang.String[] { "AddressIndex", "Status", "Version", }); internal_static_Tombstone_descriptor = - getDescriptor().getMessageTypes().get(14); + getDescriptor().getMessageTypes().get(16); internal_static_Tombstone_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_Tombstone_descriptor, new java.lang.String[] { "AddressIndex", "Timestamp", }); internal_static_Member_descriptor = - getDescriptor().getMessageTypes().get(15); + getDescriptor().getMessageTypes().get(17); internal_static_Member_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_Member_descriptor, new java.lang.String[] { "AddressIndex", "UpNumber", "Status", "RolesIndexes", }); internal_static_VectorClock_descriptor = - getDescriptor().getMessageTypes().get(16); + getDescriptor().getMessageTypes().get(18); internal_static_VectorClock_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_VectorClock_descriptor, @@ -18234,37 +19658,37 @@ public final class ClusterMessages { internal_static_VectorClock_Version_descriptor, new java.lang.String[] { "HashIndex", "Timestamp", }); internal_static_Empty_descriptor = - getDescriptor().getMessageTypes().get(17); + getDescriptor().getMessageTypes().get(19); internal_static_Empty_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_Empty_descriptor, new java.lang.String[] { }); internal_static_Address_descriptor = - getDescriptor().getMessageTypes().get(18); + getDescriptor().getMessageTypes().get(20); internal_static_Address_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_Address_descriptor, new java.lang.String[] { "System", "Hostname", "Port", "Protocol", }); internal_static_UniqueAddress_descriptor = - getDescriptor().getMessageTypes().get(19); + getDescriptor().getMessageTypes().get(21); internal_static_UniqueAddress_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_UniqueAddress_descriptor, new java.lang.String[] { "Address", "Uid", "Uid2", }); internal_static_ClusterRouterPool_descriptor = - getDescriptor().getMessageTypes().get(20); + getDescriptor().getMessageTypes().get(22); internal_static_ClusterRouterPool_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_ClusterRouterPool_descriptor, new java.lang.String[] { "Pool", "Settings", }); internal_static_Pool_descriptor = - getDescriptor().getMessageTypes().get(21); + getDescriptor().getMessageTypes().get(23); internal_static_Pool_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_Pool_descriptor, new java.lang.String[] { "SerializerId", "Manifest", "Data", }); internal_static_ClusterRouterPoolSettings_descriptor = - getDescriptor().getMessageTypes().get(22); + getDescriptor().getMessageTypes().get(24); internal_static_ClusterRouterPoolSettings_fieldAccessorTable = new akka.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_ClusterRouterPoolSettings_descriptor, diff --git a/akka-cluster/src/main/mima-filters/2.5.x.backwards.excludes b/akka-cluster/src/main/mima-filters/2.5.x.backwards.excludes index 890bbc7687..582ed1f63a 100644 --- a/akka-cluster/src/main/mima-filters/2.5.x.backwards.excludes +++ b/akka-cluster/src/main/mima-filters/2.5.x.backwards.excludes @@ -1,3 +1,12 @@ +# 26757 add timings to cluster heart beat messages +ProblemFilters.exclude[MissingTypesProblem]("akka.cluster.ClusterHeartbeatSender$Heartbeat$") +ProblemFilters.exclude[MissingTypesProblem]("akka.cluster.ClusterHeartbeatSender$HeartbeatRsp$") +ProblemFilters.exclude[DirectMissingMethodProblem]("akka.cluster.ClusterHeartbeatSender*") +ProblemFilters.exclude[DirectMissingMethodProblem]("akka.cluster.ClusterHeartbeatReceiver.selfHeartbeatRsp") +ProblemFilters.exclude[DirectMissingMethodProblem]("akka.cluster.ClusterHeartbeatReceiver.this") +ProblemFilters.exclude[IncompatibleMethTypeProblem]("akka.cluster.ClusterHeartbeatSender.heartbeatRsp") +ProblemFilters.exclude[DirectMissingMethodProblem]("akka.cluster.CrossDcHeartbeatSender.selfHeartbeat") + # #24710 remove internal ClusterReadView.refreshCurrentState ProblemFilters.exclude[DirectMissingMethodProblem]("akka.cluster.ClusterReadView.refreshCurrentState") diff --git a/akka-cluster/src/main/protobuf/ClusterMessages.proto b/akka-cluster/src/main/protobuf/ClusterMessages.proto index 3216722d5f..c109c9dc10 100644 --- a/akka-cluster/src/main/protobuf/ClusterMessages.proto +++ b/akka-cluster/src/main/protobuf/ClusterMessages.proto @@ -97,14 +97,26 @@ message CompatibleConfig { ****************************************/ /** - * Heartbeat - * Sends an Address + * Prior to version 2.5.24 + * Heartbeat sends an Address + * Version 2.5.24 can deserialize this message but does not send it. */ +message Heartbeat { + required Address from = 1; + optional int64 sequenceNr = 2; + optional sint64 creationTime = 3; +} /** - * HeartbeatRsp - * Sends an UniqueAddress + * Prior to version 2.5.24 + * HeartbeatRsp Sends an UniqueAddress + * Version 2.5.24 can deserialize this message but does not send it. */ +message HeartBeatResponse { + required UniqueAddress from = 1; + optional int64 sequenceNr = 2; + optional int64 creationTime = 3; +} /**************************************** * Cluster Gossip Messages diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala index 6023e847a4..6cb77a6a31 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala @@ -223,7 +223,7 @@ private[cluster] final class ClusterDaemon(joinConfigCompatChecker: JoinConfigCo Props(classOf[ClusterCoreSupervisor], joinConfigCompatChecker).withDispatcher(context.props.dispatcher), name = "core")) context.actorOf( - Props[ClusterHeartbeatReceiver].withDispatcher(context.props.dispatcher), + ClusterHeartbeatReceiver.props(() => Cluster(context.system)).withDispatcher(context.props.dispatcher), name = "heartbeatReceiver") } diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala index 4801326966..0cccbda055 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterHeartbeat.scala @@ -8,8 +8,16 @@ import java.util.concurrent.TimeUnit import scala.annotation.tailrec import scala.collection.immutable - -import akka.actor.{ Actor, ActorLogging, ActorPath, ActorSelection, Address, DeadLetterSuppression, RootActorPath } +import akka.actor.{ + Actor, + ActorLogging, + ActorPath, + ActorSelection, + Address, + DeadLetterSuppression, + Props, + RootActorPath +} import akka.cluster.ClusterEvent._ import akka.remote.FailureDetectorRegistry import akka.remote.HeartbeatMessage @@ -23,19 +31,20 @@ import akka.util.ccompat._ */ @InternalApi @ccompatUsedUntil213 -private[cluster] final class ClusterHeartbeatReceiver extends Actor with ActorLogging { +private[cluster] final class ClusterHeartbeatReceiver(getCluster: () => Cluster) extends Actor with ActorLogging { import ClusterHeartbeatSender._ // Important - don't use Cluster(context.system) in constructor because that would // cause deadlock. See startup sequence in ClusterDaemon. - lazy val cluster = Cluster(context.system) - lazy val selfHeartbeatRsp = HeartbeatRsp(cluster.selfUniqueAddress) + lazy val cluster = getCluster() + lazy val verboseHeartbeat = cluster.settings.Debug.VerboseHeartbeatLogging - def receive = { - case Heartbeat(from) => - if (verboseHeartbeat) cluster.ClusterLogger.logDebug("Heartbeat from [{}]", from) - sender() ! selfHeartbeatRsp + def receive: Receive = { + case hb: Heartbeat => + // TODO log the sequence nr once serializer is enabled + if (verboseHeartbeat) cluster.ClusterLogger.logDebug("Heartbeat from [{}]", hb.from) + sender() ! HeartbeatRsp(cluster.selfUniqueAddress, hb.sequenceNr, hb.creationTimeNanos) } } @@ -44,6 +53,7 @@ private[cluster] final class ClusterHeartbeatReceiver extends Actor with ActorLo @InternalApi private[cluster] object ClusterHeartbeatReceiver { + def props(clusterFactory: () => Cluster): Props = Props(new ClusterHeartbeatReceiver(clusterFactory)) def name: String = "heartbeatReceiver" def path(address: Address): ActorPath = RootActorPath(address) / "system" / "cluster" / name @@ -57,12 +67,15 @@ private[cluster] object ClusterHeartbeatSender { /** * Sent at regular intervals for failure detection. */ - final case class Heartbeat(from: Address) extends ClusterMessage with HeartbeatMessage with DeadLetterSuppression + final case class Heartbeat(from: Address, sequenceNr: Long, creationTimeNanos: Long) + extends ClusterMessage + with HeartbeatMessage + with DeadLetterSuppression /** * Sent as reply to [[Heartbeat]] messages. */ - final case class HeartbeatRsp(from: UniqueAddress) + final case class HeartbeatRsp(from: UniqueAddress, sequenceNr: Long, creationTimeNanos: Long) extends ClusterMessage with HeartbeatMessage with DeadLetterSuppression @@ -80,7 +93,7 @@ private[cluster] object ClusterHeartbeatSender { * a few other nodes, which will reply and then this actor updates the * failure detector. */ -private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogging { +private[cluster] class ClusterHeartbeatSender extends Actor with ActorLogging { import ClusterHeartbeatSender._ val cluster = Cluster(context.system) @@ -93,7 +106,12 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg val filterInternalClusterMembers: Member => Boolean = _.dataCenter == cluster.selfDataCenter - val selfHeartbeat = Heartbeat(selfAddress) + var sequenceNr = 0 + + def selfHeartbeat(): Heartbeat = { + sequenceNr += 1 + Heartbeat(selfAddress, sequenceNr, System.nanoTime()) + } val failureDetector = cluster.failureDetector @@ -141,7 +159,7 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg def active: Actor.Receive = { case HeartbeatTick => heartbeat() - case HeartbeatRsp(from) => heartbeatRsp(from) + case response: HeartbeatRsp => heartbeatRsp(response) case MemberRemoved(m, _) => removeMember(m) case evt: MemberEvent => addMember(evt.member) case UnreachableMember(m) => unreachableMember(m) @@ -181,6 +199,7 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg state = state.reachableMember(m.uniqueAddress) def heartbeat(): Unit = { + val nextHB = selfHeartbeat() state.activeReceivers.foreach { to => if (failureDetector.isMonitoring(to.address)) { if (verboseHeartbeat) logDebug("Heartbeat to [{}]", to.address) @@ -190,7 +209,7 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg // other side a chance to reply, and also trigger some resends if needed scheduler.scheduleOnce(HeartbeatExpectedResponseAfter, self, ExpectedFirstHeartbeat(to)) } - heartbeatReceiver(to.address) ! selfHeartbeat + heartbeatReceiver(to.address) ! nextHB } checkTickInterval() @@ -210,9 +229,10 @@ private[cluster] final class ClusterHeartbeatSender extends Actor with ActorLogg } - def heartbeatRsp(from: UniqueAddress): Unit = { - if (verboseHeartbeat) logDebug("Heartbeat response from [{}]", from.address) - state = state.heartbeatRsp(from) + def heartbeatRsp(response: HeartbeatRsp): Unit = { + // TODO: log response time and validate sequence nrs once serialisation of sendTime is released + if (verboseHeartbeat) logDebug("Heartbeat response from [{}]", response.from.address) + state = state.heartbeatRsp(response.from) } def triggerFirstHeartbeat(from: UniqueAddress): Unit = diff --git a/akka-cluster/src/main/scala/akka/cluster/CrossDcClusterHeartbeat.scala b/akka-cluster/src/main/scala/akka/cluster/CrossDcClusterHeartbeat.scala index f5bee0184e..2b63123a64 100644 --- a/akka-cluster/src/main/scala/akka/cluster/CrossDcClusterHeartbeat.scala +++ b/akka-cluster/src/main/scala/akka/cluster/CrossDcClusterHeartbeat.scala @@ -34,7 +34,7 @@ import scala.collection.immutable */ @InternalApi @ccompatUsedUntil213 -private[cluster] final class CrossDcHeartbeatSender extends Actor with ActorLogging { +private[cluster] class CrossDcHeartbeatSender extends Actor with ActorLogging { import CrossDcHeartbeatSender._ val cluster = Cluster(context.system) @@ -56,7 +56,12 @@ private[cluster] final class CrossDcHeartbeatSender extends Actor with ActorLogg val crossDcFailureDetector = cluster.crossDcFailureDetector - val selfHeartbeat = ClusterHeartbeatSender.Heartbeat(selfAddress) + var sequenceNr: Long = 0 + + def nextHeartBeat() = { + sequenceNr += 1 + ClusterHeartbeatSender.Heartbeat(selfAddress, sequenceNr, System.nanoTime()) + } var dataCentersState: CrossDcHeartbeatingState = CrossDcHeartbeatingState.init( selfDataCenter, @@ -110,7 +115,7 @@ private[cluster] final class CrossDcHeartbeatSender extends Actor with ActorLogg def active: Actor.Receive = { case ClusterHeartbeatSender.HeartbeatTick => heartbeat() - case ClusterHeartbeatSender.HeartbeatRsp(from) => heartbeatRsp(from) + case ClusterHeartbeatSender.HeartbeatRsp(from, _, _) => heartbeatRsp(from) case MemberRemoved(m, _) => removeMember(m) case evt: MemberEvent => addMember(evt.member) case ClusterHeartbeatSender.ExpectedFirstHeartbeat(from) => triggerFirstHeartbeat(from) @@ -153,6 +158,7 @@ private[cluster] final class CrossDcHeartbeatSender extends Actor with ActorLogg } def heartbeat(): Unit = { + val nextHB = nextHeartBeat() dataCentersState.activeReceivers.foreach { to => if (crossDcFailureDetector.isMonitoring(to.address)) { if (verboseHeartbeat) logDebug("(Cross) Heartbeat to [{}]", to.address) @@ -162,7 +168,7 @@ private[cluster] final class CrossDcHeartbeatSender extends Actor with ActorLogg // other side a chance to reply, and also trigger some resends if needed scheduler.scheduleOnce(HeartbeatExpectedResponseAfter, self, ClusterHeartbeatSender.ExpectedFirstHeartbeat(to)) } - heartbeatReceiver(to.address) ! selfHeartbeat + heartbeatReceiver(to.address) ! nextHB } } diff --git a/akka-cluster/src/main/scala/akka/cluster/protobuf/ClusterMessageSerializer.scala b/akka-cluster/src/main/scala/akka/cluster/protobuf/ClusterMessageSerializer.scala index e0ccaec944..ac037ed226 100644 --- a/akka-cluster/src/main/scala/akka/cluster/protobuf/ClusterMessageSerializer.scala +++ b/akka-cluster/src/main/scala/akka/cluster/protobuf/ClusterMessageSerializer.scala @@ -42,8 +42,12 @@ private[akka] object ClusterMessageSerializer { val InitJoinManifest = s"akka.cluster.InternalClusterAction$$InitJoin$$" val InitJoinAckManifest = s"akka.cluster.InternalClusterAction$$InitJoinAck" val InitJoinNackManifest = s"akka.cluster.InternalClusterAction$$InitJoinNack" - val HeartBeatManifest = s"akka.cluster.ClusterHeartbeatSender$$Heartbeat" - val HeartBeatRspManifest = s"akka.cluster.ClusterHeartbeatSender$$HeartbeatRsp" + // FIXME, remove in a later version (2.6?) and make 2.5.24+ a mandatory step for rolling upgrade + val HeartBeatManifestPre2523 = s"akka.cluster.ClusterHeartbeatSender$$Heartbeat" + val HeartBeatRspManifest2523 = s"akka.cluster.ClusterHeartbeatSender$$HeartbeatRsp" + + val HeartBeatManifest = "HB" + val HeartBeatRspManifest = "HBR" val ExitingConfirmedManifest = s"akka.cluster.InternalClusterAction$$ExitingConfirmed" val GossipStatusManifest = "akka.cluster.GossipStatus" val GossipEnvelopeManifest = "akka.cluster.GossipEnvelope" @@ -72,8 +76,8 @@ final class ClusterMessageSerializer(val system: ExtendedActorSystem) case _: InternalClusterAction.InitJoin => InitJoinManifest case _: InternalClusterAction.InitJoinAck => InitJoinAckManifest case _: InternalClusterAction.InitJoinNack => InitJoinNackManifest - case _: ClusterHeartbeatSender.Heartbeat => HeartBeatManifest - case _: ClusterHeartbeatSender.HeartbeatRsp => HeartBeatRspManifest + case _: ClusterHeartbeatSender.Heartbeat => HeartBeatManifestPre2523 + case _: ClusterHeartbeatSender.HeartbeatRsp => HeartBeatRspManifest2523 case _: ExitingConfirmed => ExitingConfirmedManifest case _: GossipStatus => GossipStatusManifest case _: GossipEnvelope => GossipEnvelopeManifest @@ -83,8 +87,8 @@ final class ClusterMessageSerializer(val system: ExtendedActorSystem) } def toBinary(obj: AnyRef): Array[Byte] = obj match { - case ClusterHeartbeatSender.Heartbeat(from) => addressToProtoByteArray(from) - case ClusterHeartbeatSender.HeartbeatRsp(from) => uniqueAddressToProtoByteArray(from) + case ClusterHeartbeatSender.Heartbeat(from, _, _) => addressToProtoByteArray(from) + case ClusterHeartbeatSender.HeartbeatRsp(from, _, _) => uniqueAddressToProtoByteArray(from) case m: GossipEnvelope => gossipEnvelopeToProto(m).toByteArray case m: GossipStatus => gossipStatusToProto(m).toByteArray case InternalClusterAction.Join(node, roles) => joinToProto(node, roles).toByteArray @@ -101,8 +105,10 @@ final class ClusterMessageSerializer(val system: ExtendedActorSystem) } def fromBinary(bytes: Array[Byte], manifest: String): AnyRef = manifest match { + case HeartBeatManifestPre2523 => deserializeHeartBeatAsAddress(bytes) + case HeartBeatRspManifest2523 => deserializeHeartBeatRspAsUniqueAddress(bytes) case HeartBeatManifest => deserializeHeartBeat(bytes) - case HeartBeatRspManifest => deserializeHeartBeatRsp(bytes) + case HeartBeatRspManifest => deserializeHeartBeatResponse(bytes) case GossipStatusManifest => deserializeGossipStatus(bytes) case GossipEnvelopeManifest => deserializeGossipEnvelope(bytes) case InitJoinManifest => deserializeInitJoin(bytes) @@ -154,9 +160,9 @@ final class ClusterMessageSerializer(val system: ExtendedActorSystem) case _ => throw new IllegalArgumentException(s"Address [$address] could not be serialized: host or port missing.") } - private def addressToProtoByteArray(address: Address): Array[Byte] = addressToProto(address).build.toByteArray + private[akka] def addressToProtoByteArray(address: Address): Array[Byte] = addressToProto(address).build.toByteArray - private def uniqueAddressToProto(uniqueAddress: UniqueAddress): cm.UniqueAddress.Builder = { + private[akka] def uniqueAddressToProto(uniqueAddress: UniqueAddress): cm.UniqueAddress.Builder = { cm.UniqueAddress .newBuilder() .setAddress(addressToProto(uniqueAddress.address)) @@ -277,12 +283,22 @@ final class ClusterMessageSerializer(val system: ExtendedActorSystem) InternalClusterAction.ExitingConfirmed(uniqueAddressFromBinary(bytes)) } - private def deserializeHeartBeatRsp(bytes: Array[Byte]): ClusterHeartbeatSender.HeartbeatRsp = { - ClusterHeartbeatSender.HeartbeatRsp(uniqueAddressFromBinary(bytes)) + private def deserializeHeartBeatRspAsUniqueAddress(bytes: Array[Byte]): ClusterHeartbeatSender.HeartbeatRsp = { + ClusterHeartbeatSender.HeartbeatRsp(uniqueAddressFromBinary(bytes), -1, -1) } - private def deserializeHeartBeat(bytes: Array[Byte]): ClusterHeartbeatSender.Heartbeat = { - ClusterHeartbeatSender.Heartbeat(addressFromBinary(bytes)) + private def deserializeHeartBeatAsAddress(bytes: Array[Byte]): ClusterHeartbeatSender.Heartbeat = { + ClusterHeartbeatSender.Heartbeat(addressFromBinary(bytes), -1, -1) + } + + def deserializeHeartBeat(bytes: Array[Byte]): ClusterHeartbeatSender.Heartbeat = { + val hb = cm.Heartbeat.parseFrom(bytes) + ClusterHeartbeatSender.Heartbeat(addressFromProto(hb.getFrom), hb.getSequenceNr, hb.getCreationTime) + } + + def deserializeHeartBeatResponse(bytes: Array[Byte]): ClusterHeartbeatSender.HeartbeatRsp = { + val hbr = cm.HeartBeatResponse.parseFrom(bytes) + ClusterHeartbeatSender.HeartbeatRsp(uniqueAddressFromProto(hbr.getFrom), hbr.getSequenceNr, hbr.getCreationTime) } private def deserializeInitJoinNack(bytes: Array[Byte]): InternalClusterAction.InitJoinNack = { diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatReceiverSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatReceiverSpec.scala new file mode 100644 index 0000000000..59b7792dbc --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatReceiverSpec.scala @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2019 Lightbend Inc. + */ + +package akka.cluster + +import akka.cluster.ClusterHeartbeatSender.{ Heartbeat, HeartbeatRsp } +import akka.testkit.{ AkkaSpec, ImplicitSender } + +class ClusterHeartbeatReceiverSpec extends AkkaSpec(""" + akka.actor.provider = cluster + """.stripMargin) with ImplicitSender { + "ClusterHeartbeatReceiver" should { + "respond to heartbeats with the same sequenceNr and sendTime" in { + val heartBeater = system.actorOf(ClusterHeartbeatReceiver.props(() => Cluster(system))) + heartBeater ! Heartbeat(Cluster(system).selfAddress, 1, 2) + expectMsg(HeartbeatRsp(Cluster(system).selfUniqueAddress, 1, 2)) + } + } +} diff --git a/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderSpec.scala b/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderSpec.scala new file mode 100644 index 0000000000..91b608bda6 --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/ClusterHeartbeatSenderSpec.scala @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2019 Lightbend Inc. + */ + +package akka.cluster + +import akka.actor.{ ActorSelection, Address, Props } +import akka.cluster.ClusterEvent.{ CurrentClusterState, MemberUp } +import akka.cluster.ClusterHeartbeatSender.Heartbeat +import akka.cluster.ClusterHeartbeatSenderSpec.TestClusterHeartBeatSender +import akka.testkit.{ AkkaSpec, ImplicitSender, TestProbe } + +object ClusterHeartbeatSenderSpec { + class TestClusterHeartBeatSender(probe: TestProbe) extends ClusterHeartbeatSender { + // don't register for cluster events + override def preStart(): Unit = {} + + // override where the heart beats go to + override def heartbeatReceiver(address: Address): ActorSelection = { + context.actorSelection(probe.ref.path) + } + } +} + +class ClusterHeartbeatSenderSpec extends AkkaSpec(""" + akka.loglevel = DEBUG + akka.actor.provider = cluster + akka.cluster.failure-detector.heartbeat-interval = 0.2s + """.stripMargin) with ImplicitSender { + + "ClusterHeartBeatSender" must { + "increment heart beat sequence nr" in { + val probe = TestProbe() + val underTest = system.actorOf(Props(new TestClusterHeartBeatSender(probe))) + underTest ! CurrentClusterState() + underTest ! MemberUp( + Member(UniqueAddress(Address("akka", system.name), 1L), Set("dc-default")).copy(status = MemberStatus.Up)) + + probe.expectMsgType[Heartbeat].sequenceNr shouldEqual 1 + probe.expectMsgType[Heartbeat].sequenceNr shouldEqual 2 + } + } + +} diff --git a/akka-cluster/src/test/scala/akka/cluster/CrossDcHeartbeatSenderSpec.scala b/akka-cluster/src/test/scala/akka/cluster/CrossDcHeartbeatSenderSpec.scala new file mode 100644 index 0000000000..b17752c541 --- /dev/null +++ b/akka-cluster/src/test/scala/akka/cluster/CrossDcHeartbeatSenderSpec.scala @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2019 Lightbend Inc. + */ + +package akka.cluster + +import akka.actor.{ ActorSelection, Address, Props } +import akka.cluster.ClusterEvent.CurrentClusterState +import akka.cluster.ClusterHeartbeatSender.Heartbeat +import akka.cluster.CrossDcHeartbeatSenderSpec.TestCrossDcHeartbeatSender +import akka.testkit.{ AkkaSpec, ImplicitSender, TestProbe } + +import scala.collection.immutable.SortedSet + +object CrossDcHeartbeatSenderSpec { + class TestCrossDcHeartbeatSender(probe: TestProbe) extends CrossDcHeartbeatSender { + // disable register for cluster events + override def preStart(): Unit = {} + + override def heartbeatReceiver(address: Address): ActorSelection = { + context.actorSelection(probe.ref.path) + } + } +} + +class CrossDcHeartbeatSenderSpec extends AkkaSpec(""" + akka.loglevel = DEBUG + akka.actor.provider = cluster + akka.cluster.failure-detector.heartbeat-interval = 0.2s + akka.cluster.multi-data-center { + self-data-center = "dc1" + heartbeat-interval = 0.2s + } + """) with ImplicitSender { + "CrossDcHeartBeatSender" should { + "increment heart beat sequence nr" in { + val probe = TestProbe() + Cluster(system).join(Cluster(system).selfMember.address) + awaitAssert(Cluster(system).selfMember.status == MemberStatus.Up) + val underTest = system.actorOf(Props(new TestCrossDcHeartbeatSender(probe))) + underTest ! CurrentClusterState( + members = SortedSet( + Cluster(system).selfMember, + Member(UniqueAddress(Address("akka", system.name), 2L), Set("dc-dc2")).copy(status = MemberStatus.Up))) + + probe.expectMsgType[Heartbeat].sequenceNr shouldEqual 1 + probe.expectMsgType[Heartbeat].sequenceNr shouldEqual 2 + } + } +} diff --git a/akka-cluster/src/test/scala/akka/cluster/protobuf/ClusterMessageSerializerSpec.scala b/akka-cluster/src/test/scala/akka/cluster/protobuf/ClusterMessageSerializerSpec.scala index d784d6fdf2..1092e9ab00 100644 --- a/akka-cluster/src/test/scala/akka/cluster/protobuf/ClusterMessageSerializerSpec.scala +++ b/akka-cluster/src/test/scala/akka/cluster/protobuf/ClusterMessageSerializerSpec.scala @@ -9,11 +9,13 @@ import akka.actor.{ ActorSystem, Address, ExtendedActorSystem } import akka.cluster.InternalClusterAction.CompatibleConfig import akka.cluster.routing.{ ClusterRouterPool, ClusterRouterPoolSettings } import akka.routing.RoundRobinPool +import akka.cluster.protobuf.msg.{ ClusterMessages => cm } import collection.immutable.SortedSet import akka.testkit.{ AkkaSpec, TestKit } import com.github.ghik.silencer.silent import com.typesafe.config.ConfigFactory + @silent class ClusterMessageSerializerSpec extends AkkaSpec("akka.actor.provider = cluster") { @@ -59,8 +61,8 @@ class ClusterMessageSerializerSpec extends AkkaSpec("akka.actor.provider = clust checkSerialization(InternalClusterAction.InitJoin(ConfigFactory.empty)) checkSerialization(InternalClusterAction.InitJoinAck(address, CompatibleConfig(ConfigFactory.empty))) checkSerialization(InternalClusterAction.InitJoinNack(address)) - checkSerialization(ClusterHeartbeatSender.Heartbeat(address)) - checkSerialization(ClusterHeartbeatSender.HeartbeatRsp(uniqueAddress)) + checkSerialization(ClusterHeartbeatSender.Heartbeat(address, -1, -1)) + checkSerialization(ClusterHeartbeatSender.HeartbeatRsp(uniqueAddress, -1, -1)) checkSerialization(InternalClusterAction.ExitingConfirmed(uniqueAddress)) val node1 = VectorClock.Node("node1") @@ -168,6 +170,47 @@ class ClusterMessageSerializerSpec extends AkkaSpec("akka.actor.provider = clust join.roles should be(Set(ClusterSettings.DcRolePrefix + "default")) } } + + "Rolling upgrades for heart beat message changes in 2.5.23" must { + // FIXME, add issue for serializing this as the new message type + + "serialize heart beats as Address to support versions prior or 2.5.23" in { + serializer.manifest(ClusterHeartbeatSender.Heartbeat(a1.address, -1, -1)) should ===( + ClusterMessageSerializer.HeartBeatManifestPre2523) + } + + "serialize heart beat responses as UniqueAddress to support versions prior to 2.5.23" in { + serializer.manifest(ClusterHeartbeatSender.HeartbeatRsp(a1.uniqueAddress, -1, -1)) should ===( + ClusterMessageSerializer.HeartBeatRspManifest2523) + } + + "be able to deserialize HeartBeat protobuf message" in { + val hbProtobuf = cm.Heartbeat + .newBuilder() + .setFrom(serializer.addressToProto(a1.address)) + .setSequenceNr(1) + .setCreationTime(2) + .build() + .toByteArray + + serializer.fromBinary(hbProtobuf, ClusterMessageSerializer.HeartBeatManifest) should ===( + ClusterHeartbeatSender.Heartbeat(a1.address, 1, 2)) + } + + "be able to deserialize HeartBeatRsp probuf message" in { + val hbrProtobuf = cm.HeartBeatResponse + .newBuilder() + .setFrom(serializer.uniqueAddressToProto(a1.uniqueAddress)) + .setSequenceNr(1) + .setCreationTime(2) + .build() + .toByteArray + + serializer.fromBinary(hbrProtobuf, ClusterMessageSerializer.HeartBeatRspManifest) should ===( + ClusterHeartbeatSender.HeartbeatRsp(a1.uniqueAddress, 1, 2)) + } + } + "Cluster router pool" must { "be serializable with no role" in { checkSerialization(