diff --git a/src/cc/flwr/include/flwr/proto/fleet.pb.cc b/src/cc/flwr/include/flwr/proto/fleet.pb.cc index b519b4f87361..5aea6cadc615 100644 --- a/src/cc/flwr/include/flwr/proto/fleet.pb.cc +++ b/src/cc/flwr/include/flwr/proto/fleet.pb.cc @@ -19,7 +19,8 @@ PROTOBUF_PRAGMA_INIT_SEG namespace flwr { namespace proto { constexpr CreateNodeRequest::CreateNodeRequest( - ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized){} + ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized) + : ping_interval_(0){} struct CreateNodeRequestDefaultTypeInternal { constexpr CreateNodeRequestDefaultTypeInternal() : _instance(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized{}) {} @@ -176,6 +177,7 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_flwr_2fproto_2ffleet_2eproto:: ~0u, // no _oneof_case_ ~0u, // no _weak_field_map_ ~0u, // no _inlined_string_donated_ + PROTOBUF_FIELD_OFFSET(::flwr::proto::CreateNodeRequest, ping_interval_), ~0u, // no _has_bits_ PROTOBUF_FIELD_OFFSET(::flwr::proto::CreateNodeResponse, _internal_metadata_), ~0u, // no _extensions_ @@ -262,17 +264,17 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_flwr_2fproto_2ffleet_2eproto:: }; static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, -1, sizeof(::flwr::proto::CreateNodeRequest)}, - { 6, -1, -1, sizeof(::flwr::proto::CreateNodeResponse)}, - { 13, -1, -1, sizeof(::flwr::proto::DeleteNodeRequest)}, - { 20, -1, -1, sizeof(::flwr::proto::DeleteNodeResponse)}, - { 26, -1, -1, sizeof(::flwr::proto::PingRequest)}, - { 34, -1, -1, sizeof(::flwr::proto::PingResponse)}, - { 41, -1, -1, sizeof(::flwr::proto::PullTaskInsRequest)}, - { 49, -1, -1, sizeof(::flwr::proto::PullTaskInsResponse)}, - { 57, -1, -1, sizeof(::flwr::proto::PushTaskResRequest)}, - { 64, 72, -1, sizeof(::flwr::proto::PushTaskResResponse_ResultsEntry_DoNotUse)}, - { 74, -1, -1, sizeof(::flwr::proto::PushTaskResResponse)}, - { 82, -1, -1, sizeof(::flwr::proto::Reconnect)}, + { 7, -1, -1, sizeof(::flwr::proto::CreateNodeResponse)}, + { 14, -1, -1, sizeof(::flwr::proto::DeleteNodeRequest)}, + { 21, -1, -1, sizeof(::flwr::proto::DeleteNodeResponse)}, + { 27, -1, -1, sizeof(::flwr::proto::PingRequest)}, + { 35, -1, -1, sizeof(::flwr::proto::PingResponse)}, + { 42, -1, -1, sizeof(::flwr::proto::PullTaskInsRequest)}, + { 50, -1, -1, sizeof(::flwr::proto::PullTaskInsResponse)}, + { 58, -1, -1, sizeof(::flwr::proto::PushTaskResRequest)}, + { 65, 73, -1, sizeof(::flwr::proto::PushTaskResResponse_ResultsEntry_DoNotUse)}, + { 75, -1, -1, sizeof(::flwr::proto::PushTaskResResponse)}, + { 83, -1, -1, sizeof(::flwr::proto::Reconnect)}, }; static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = { @@ -293,34 +295,35 @@ static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = const char descriptor_table_protodef_flwr_2fproto_2ffleet_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = "\n\026flwr/proto/fleet.proto\022\nflwr.proto\032\025fl" "wr/proto/node.proto\032\025flwr/proto/task.pro" - "to\"\023\n\021CreateNodeRequest\"4\n\022CreateNodeRes" - "ponse\022\036\n\004node\030\001 \001(\0132\020.flwr.proto.Node\"3\n" - "\021DeleteNodeRequest\022\036\n\004node\030\001 \001(\0132\020.flwr." - "proto.Node\"\024\n\022DeleteNodeResponse\"D\n\013Ping" - "Request\022\036\n\004node\030\001 \001(\0132\020.flwr.proto.Node\022" - "\025\n\rping_interval\030\002 \001(\001\"\037\n\014PingResponse\022\017" - "\n\007success\030\001 \001(\010\"F\n\022PullTaskInsRequest\022\036\n" - "\004node\030\001 \001(\0132\020.flwr.proto.Node\022\020\n\010task_id" - "s\030\002 \003(\t\"k\n\023PullTaskInsResponse\022(\n\treconn" - "ect\030\001 \001(\0132\025.flwr.proto.Reconnect\022*\n\rtask" - "_ins_list\030\002 \003(\0132\023.flwr.proto.TaskIns\"@\n\022" - "PushTaskResRequest\022*\n\rtask_res_list\030\001 \003(" - "\0132\023.flwr.proto.TaskRes\"\256\001\n\023PushTaskResRe" - "sponse\022(\n\treconnect\030\001 \001(\0132\025.flwr.proto.R" - "econnect\022=\n\007results\030\002 \003(\0132,.flwr.proto.P" - "ushTaskResResponse.ResultsEntry\032.\n\014Resul" - "tsEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\r:\0028\001\"" - "\036\n\tReconnect\022\021\n\treconnect\030\001 \001(\0042\206\003\n\005Flee" - "t\022M\n\nCreateNode\022\035.flwr.proto.CreateNodeR" - "equest\032\036.flwr.proto.CreateNodeResponse\"\000" - "\022M\n\nDeleteNode\022\035.flwr.proto.DeleteNodeRe" - "quest\032\036.flwr.proto.DeleteNodeResponse\"\000\022" - ";\n\004Ping\022\027.flwr.proto.PingRequest\032\030.flwr." - "proto.PingResponse\"\000\022P\n\013PullTaskIns\022\036.fl" - "wr.proto.PullTaskInsRequest\032\037.flwr.proto" - ".PullTaskInsResponse\"\000\022P\n\013PushTaskRes\022\036." - "flwr.proto.PushTaskResRequest\032\037.flwr.pro" - "to.PushTaskResResponse\"\000b\006proto3" + "to\"*\n\021CreateNodeRequest\022\025\n\rping_interval" + "\030\001 \001(\001\"4\n\022CreateNodeResponse\022\036\n\004node\030\001 \001" + "(\0132\020.flwr.proto.Node\"3\n\021DeleteNodeReques" + "t\022\036\n\004node\030\001 \001(\0132\020.flwr.proto.Node\"\024\n\022Del" + "eteNodeResponse\"D\n\013PingRequest\022\036\n\004node\030\001" + " \001(\0132\020.flwr.proto.Node\022\025\n\rping_interval\030" + "\002 \001(\001\"\037\n\014PingResponse\022\017\n\007success\030\001 \001(\010\"F" + "\n\022PullTaskInsRequest\022\036\n\004node\030\001 \001(\0132\020.flw" + "r.proto.Node\022\020\n\010task_ids\030\002 \003(\t\"k\n\023PullTa" + "skInsResponse\022(\n\treconnect\030\001 \001(\0132\025.flwr." + "proto.Reconnect\022*\n\rtask_ins_list\030\002 \003(\0132\023" + ".flwr.proto.TaskIns\"@\n\022PushTaskResReques" + "t\022*\n\rtask_res_list\030\001 \003(\0132\023.flwr.proto.Ta" + "skRes\"\256\001\n\023PushTaskResResponse\022(\n\treconne" + "ct\030\001 \001(\0132\025.flwr.proto.Reconnect\022=\n\007resul" + "ts\030\002 \003(\0132,.flwr.proto.PushTaskResRespons" + "e.ResultsEntry\032.\n\014ResultsEntry\022\013\n\003key\030\001 " + "\001(\t\022\r\n\005value\030\002 \001(\r:\0028\001\"\036\n\tReconnect\022\021\n\tr" + "econnect\030\001 \001(\0042\206\003\n\005Fleet\022M\n\nCreateNode\022\035" + ".flwr.proto.CreateNodeRequest\032\036.flwr.pro" + "to.CreateNodeResponse\"\000\022M\n\nDeleteNode\022\035." + "flwr.proto.DeleteNodeRequest\032\036.flwr.prot" + "o.DeleteNodeResponse\"\000\022;\n\004Ping\022\027.flwr.pr" + "oto.PingRequest\032\030.flwr.proto.PingRespons" + "e\"\000\022P\n\013PullTaskIns\022\036.flwr.proto.PullTask" + "InsRequest\032\037.flwr.proto.PullTaskInsRespo" + "nse\"\000\022P\n\013PushTaskRes\022\036.flwr.proto.PushTa" + "skResRequest\032\037.flwr.proto.PushTaskResRes" + "ponse\"\000b\006proto3" ; static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_flwr_2fproto_2ffleet_2eproto_deps[2] = { &::descriptor_table_flwr_2fproto_2fnode_2eproto, @@ -328,7 +331,7 @@ static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor }; static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_flwr_2fproto_2ffleet_2eproto_once; const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_flwr_2fproto_2ffleet_2eproto = { - false, false, 1192, descriptor_table_protodef_flwr_2fproto_2ffleet_2eproto, "flwr/proto/fleet.proto", + false, false, 1215, descriptor_table_protodef_flwr_2fproto_2ffleet_2eproto, "flwr/proto/fleet.proto", &descriptor_table_flwr_2fproto_2ffleet_2eproto_once, descriptor_table_flwr_2fproto_2ffleet_2eproto_deps, 2, 12, schemas, file_default_instances, TableStruct_flwr_2fproto_2ffleet_2eproto::offsets, file_level_metadata_flwr_2fproto_2ffleet_2eproto, file_level_enum_descriptors_flwr_2fproto_2ffleet_2eproto, file_level_service_descriptors_flwr_2fproto_2ffleet_2eproto, @@ -350,30 +353,169 @@ class CreateNodeRequest::_Internal { CreateNodeRequest::CreateNodeRequest(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase(arena, is_message_owned) { + : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { + SharedCtor(); + if (!is_message_owned) { + RegisterArenaDtor(arena); + } // @@protoc_insertion_point(arena_constructor:flwr.proto.CreateNodeRequest) } CreateNodeRequest::CreateNodeRequest(const CreateNodeRequest& from) - : ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase() { + : ::PROTOBUF_NAMESPACE_ID::Message() { _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); + ping_interval_ = from.ping_interval_; // @@protoc_insertion_point(copy_constructor:flwr.proto.CreateNodeRequest) } +void CreateNodeRequest::SharedCtor() { +ping_interval_ = 0; +} + +CreateNodeRequest::~CreateNodeRequest() { + // @@protoc_insertion_point(destructor:flwr.proto.CreateNodeRequest) + if (GetArenaForAllocation() != nullptr) return; + SharedDtor(); + _internal_metadata_.Delete<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); +} + +inline void CreateNodeRequest::SharedDtor() { + GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); +} + +void CreateNodeRequest::ArenaDtor(void* object) { + CreateNodeRequest* _this = reinterpret_cast< CreateNodeRequest* >(object); + (void)_this; +} +void CreateNodeRequest::RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena*) { +} +void CreateNodeRequest::SetCachedSize(int size) const { + _cached_size_.Set(size); +} + +void CreateNodeRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:flwr.proto.CreateNodeRequest) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + ping_interval_ = 0; + _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); +} + +const char* CreateNodeRequest::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + switch (tag >> 3) { + // double ping_interval = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 9)) { + ping_interval_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad(ptr); + ptr += sizeof(double); + } else + goto handle_unusual; + continue; + default: + goto handle_unusual; + } // switch + handle_unusual: + if ((tag == 0) || ((tag & 7) == 4)) { + CHK_(ptr); + ctx->SetLastTag(tag); + goto message_done; + } + ptr = UnknownFieldParse( + tag, + _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), + ptr, ctx); + CHK_(ptr != nullptr); + } // while +message_done: + return ptr; +failure: + ptr = nullptr; + goto message_done; +#undef CHK_ +} + +::PROTOBUF_NAMESPACE_ID::uint8* CreateNodeRequest::_InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { + // @@protoc_insertion_point(serialize_to_array_start:flwr.proto.CreateNodeRequest) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + // double ping_interval = 1; + if (!(this->_internal_ping_interval() <= 0 && this->_internal_ping_interval() >= 0)) { + target = stream->EnsureSpace(target); + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteDoubleToArray(1, this->_internal_ping_interval(), target); + } + + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); + } + // @@protoc_insertion_point(serialize_to_array_end:flwr.proto.CreateNodeRequest) + return target; +} + +size_t CreateNodeRequest::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:flwr.proto.CreateNodeRequest) + size_t total_size = 0; + + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + // double ping_interval = 1; + if (!(this->_internal_ping_interval() <= 0 && this->_internal_ping_interval() >= 0)) { + total_size += 1 + 8; + } + return MaybeComputeUnknownFieldsSize(total_size, &_cached_size_); +} const ::PROTOBUF_NAMESPACE_ID::Message::ClassData CreateNodeRequest::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase::CopyImpl, - ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase::MergeImpl, + ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSizeCheck, + CreateNodeRequest::MergeImpl }; const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*CreateNodeRequest::GetClassData() const { return &_class_data_; } +void CreateNodeRequest::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, + const ::PROTOBUF_NAMESPACE_ID::Message& from) { + static_cast(to)->MergeFrom( + static_cast(from)); +} +void CreateNodeRequest::MergeFrom(const CreateNodeRequest& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:flwr.proto.CreateNodeRequest) + GOOGLE_DCHECK_NE(&from, this); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + if (!(from._internal_ping_interval() <= 0 && from._internal_ping_interval() >= 0)) { + _internal_set_ping_interval(from._internal_ping_interval()); + } + _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); +} + +void CreateNodeRequest::CopyFrom(const CreateNodeRequest& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:flwr.proto.CreateNodeRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} +bool CreateNodeRequest::IsInitialized() const { + return true; +} +void CreateNodeRequest::InternalSwap(CreateNodeRequest* other) { + using std::swap; + _internal_metadata_.InternalSwap(&other->_internal_metadata_); + swap(ping_interval_, other->ping_interval_); +} ::PROTOBUF_NAMESPACE_ID::Metadata CreateNodeRequest::GetMetadata() const { return ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors( diff --git a/src/cc/flwr/include/flwr/proto/fleet.pb.h b/src/cc/flwr/include/flwr/proto/fleet.pb.h index 76a001f3a6dc..6c2adc1ad4cc 100644 --- a/src/cc/flwr/include/flwr/proto/fleet.pb.h +++ b/src/cc/flwr/include/flwr/proto/fleet.pb.h @@ -119,9 +119,10 @@ namespace proto { // =================================================================== class CreateNodeRequest final : - public ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase /* @@protoc_insertion_point(class_definition:flwr.proto.CreateNodeRequest) */ { + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:flwr.proto.CreateNodeRequest) */ { public: inline CreateNodeRequest() : CreateNodeRequest(nullptr) {} + ~CreateNodeRequest() override; explicit constexpr CreateNodeRequest(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); CreateNodeRequest(const CreateNodeRequest& from); @@ -193,15 +194,27 @@ class CreateNodeRequest final : CreateNodeRequest* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { return CreateMaybeMessage(arena); } - using ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase::CopyFrom; - inline void CopyFrom(const CreateNodeRequest& from) { - ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase::CopyImpl(this, from); - } - using ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase::MergeFrom; - void MergeFrom(const CreateNodeRequest& from) { - ::PROTOBUF_NAMESPACE_ID::internal::ZeroFieldsBase::MergeImpl(this, from); - } + using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; + void CopyFrom(const CreateNodeRequest& from); + using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; + void MergeFrom(const CreateNodeRequest& from); + private: + static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message* to, const ::PROTOBUF_NAMESPACE_ID::Message& from); public: + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize( + ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(CreateNodeRequest* other); friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { return "flwr.proto.CreateNodeRequest"; @@ -210,6 +223,8 @@ class CreateNodeRequest final : explicit CreateNodeRequest(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned = false); private: + static void ArenaDtor(void* object); + inline void RegisterArenaDtor(::PROTOBUF_NAMESPACE_ID::Arena* arena); public: static const ClassData _class_data_; @@ -221,6 +236,18 @@ class CreateNodeRequest final : // accessors ------------------------------------------------------- + enum : int { + kPingIntervalFieldNumber = 1, + }; + // double ping_interval = 1; + void clear_ping_interval(); + double ping_interval() const; + void set_ping_interval(double value); + private: + double _internal_ping_interval() const; + void _internal_set_ping_interval(double value); + public: + // @@protoc_insertion_point(class_scope:flwr.proto.CreateNodeRequest) private: class _Internal; @@ -228,6 +255,7 @@ class CreateNodeRequest final : template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; typedef void InternalArenaConstructable_; typedef void DestructorSkippable_; + double ping_interval_; mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; friend struct ::TableStruct_flwr_2fproto_2ffleet_2eproto; }; @@ -1813,6 +1841,26 @@ class Reconnect final : #endif // __GNUC__ // CreateNodeRequest +// double ping_interval = 1; +inline void CreateNodeRequest::clear_ping_interval() { + ping_interval_ = 0; +} +inline double CreateNodeRequest::_internal_ping_interval() const { + return ping_interval_; +} +inline double CreateNodeRequest::ping_interval() const { + // @@protoc_insertion_point(field_get:flwr.proto.CreateNodeRequest.ping_interval) + return _internal_ping_interval(); +} +inline void CreateNodeRequest::_internal_set_ping_interval(double value) { + + ping_interval_ = value; +} +inline void CreateNodeRequest::set_ping_interval(double value) { + _internal_set_ping_interval(value); + // @@protoc_insertion_point(field_set:flwr.proto.CreateNodeRequest.ping_interval) +} + // ------------------------------------------------------------------- // CreateNodeResponse diff --git a/src/cc/flwr/src/communicator.cc b/src/cc/flwr/src/communicator.cc index 98569b752fb0..bcbea9de60ef 100644 --- a/src/cc/flwr/src/communicator.cc +++ b/src/cc/flwr/src/communicator.cc @@ -83,6 +83,8 @@ void create_node(Communicator *communicator) { flwr::proto::CreateNodeRequest create_node_request; flwr::proto::CreateNodeResponse create_node_response; + create_node_request.set_ping_interval(300.0); + communicator->send_create_node(create_node_request, &create_node_response); // Validate the response