From 88a6bbce2a6160a25da2a051519c5d8b1ceff690 Mon Sep 17 00:00:00 2001 From: ihsan Date: Mon, 20 Oct 2025 15:08:42 +0300 Subject: [PATCH 1/3] Updated the codecs used with latest changes. Also, updated the code to use these codecs properly with the new introduced parameters. Associated protocol PR is https://github.com/hazelcast/hazelcast-client-protocol/pull/557 --- .../client/protocol/codec/codecs.cpp | 216 ++++++++++-------- .../hazelcast/client/protocol/codec/codecs.h | 186 ++++++++++++--- .../hazelcast/client/internal/version.h | 37 +++ .../hazelcast/client/protocol/ClientMessage.h | 24 ++ .../spi/impl/listener/cluster_view_listener.h | 15 +- hazelcast/src/hazelcast/client/network.cpp | 12 +- hazelcast/src/hazelcast/client/spi.cpp | 15 ++ 7 files changed, 378 insertions(+), 127 deletions(-) create mode 100644 hazelcast/include/hazelcast/client/internal/version.h diff --git a/hazelcast/generated-sources/src/hazelcast/client/protocol/codec/codecs.cpp b/hazelcast/generated-sources/src/hazelcast/client/protocol/codec/codecs.cpp index d01e997742..de66931965 100644 --- a/hazelcast/generated-sources/src/hazelcast/client/protocol/codec/codecs.cpp +++ b/hazelcast/generated-sources/src/hazelcast/client/protocol/codec/codecs.cpp @@ -15,9 +15,9 @@ */ #include -#include "hazelcast/client/member.h" -#include "hazelcast/client/serialization/pimpl/compact/schema.h" + #include "hazelcast/logger.h" +#include "hazelcast/client/member.h" #include "codecs.h" @@ -34,11 +34,14 @@ client_authentication_encode(const std::string& cluster_name, byte serialization_version, const std::string& client_hazelcast_version, const std::string& client_name, - const std::vector& labels) + const std::vector& labels, + byte routing_mode, + bool cp_direct_to_leader_routing) { - size_t initial_frame_size = ClientMessage::REQUEST_HEADER_LEN + - ClientMessage::UUID_SIZE + - ClientMessage::UINT8_SIZE; + size_t initial_frame_size = + ClientMessage::REQUEST_HEADER_LEN + ClientMessage::UUID_SIZE + + ClientMessage::UINT8_SIZE + ClientMessage::UINT8_SIZE + + ClientMessage::UINT8_SIZE; ClientMessage msg(initial_frame_size); msg.set_retryable(true); msg.set_operation_name("client.authentication"); @@ -48,6 +51,8 @@ client_authentication_encode(const std::string& cluster_name, msg.set(uuid); msg.set(serialization_version); + msg.set(routing_mode); + msg.set(cp_direct_to_leader_routing); msg.set(cluster_name); msg.set_nullable(username); @@ -73,11 +78,14 @@ client_authenticationcustom_encode(const std::string& cluster_name, byte serialization_version, const std::string& client_hazelcast_version, const std::string& client_name, - const std::vector& labels) + const std::vector& labels, + byte routing_mode, + bool cp_direct_to_leader_routing) { - size_t initial_frame_size = ClientMessage::REQUEST_HEADER_LEN + - ClientMessage::UUID_SIZE + - ClientMessage::UINT8_SIZE; + size_t initial_frame_size = + ClientMessage::REQUEST_HEADER_LEN + ClientMessage::UUID_SIZE + + ClientMessage::UINT8_SIZE + ClientMessage::UINT8_SIZE + + ClientMessage::UINT8_SIZE; ClientMessage msg(initial_frame_size); msg.set_retryable(true); msg.set_operation_name("client.authenticationcustom"); @@ -87,6 +95,8 @@ client_authenticationcustom_encode(const std::string& cluster_name, msg.set(uuid); msg.set(serialization_version); + msg.set(routing_mode); + msg.set(cp_direct_to_leader_routing); msg.set(cluster_name); msg.set(credentials); @@ -126,7 +136,7 @@ void client_addclusterviewlistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 770) { + if (messageType == EVENT_MEMBERS_VIEW) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -138,7 +148,7 @@ client_addclusterviewlistener_handler::handle(ClientMessage& msg) handle_membersview(version, member_infos); return; } - if (messageType == 771) { + if (messageType == EVENT_PARTITIONS_VIEW) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -150,6 +160,26 @@ client_addclusterviewlistener_handler::handle(ClientMessage& msg) handle_partitionsview(version, partitions); return; } + if (messageType == EVENT_MEMBER_GROUPS_VIEW) { + auto* initial_frame = + reinterpret_cast( + msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); + auto version = msg.get(); + msg.seek(static_cast(initial_frame->frame_len)); + + auto member_groups = + msg.get>>(); + + handle_membergroupsview(version, member_groups); + return; + } + if (messageType == EVENT_CLUSTER_VERSION) { + msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN); + + auto version = msg.get(); + handle_clusterversion(version); + return; + } HZ_LOG( get_logger(), finest, @@ -159,20 +189,6 @@ client_addclusterviewlistener_handler::handle(ClientMessage& msg) .str()); } -ClientMessage -client_triggerpartitionassignment_encode() -{ - size_t initial_frame_size = ClientMessage::REQUEST_HEADER_LEN; - ClientMessage msg(initial_frame_size, true); - msg.set_retryable(true); - msg.set_operation_name("client.triggerpartitionassignment"); - - msg.set_message_type(static_cast(4096)); - msg.set_partition_id(-1); - - return msg; -} - ClientMessage client_createproxy_encode(const std::string& name, const std::string& service_name) @@ -271,7 +287,7 @@ void client_localbackuplistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 3842) { + if (messageType == EVENT_BACKUP) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -290,6 +306,69 @@ client_localbackuplistener_handler::handle(ClientMessage& msg) .str()); } +ClientMessage +client_triggerpartitionassignment_encode() +{ + size_t initial_frame_size = ClientMessage::REQUEST_HEADER_LEN; + ClientMessage msg(initial_frame_size, true); + msg.set_retryable(true); + msg.set_operation_name("client.triggerpartitionassignment"); + + msg.set_message_type(static_cast(4096)); + msg.set_partition_id(-1); + + return msg; +} + +ClientMessage +client_sendschema_encode(const serialization::pimpl::schema& schema) +{ + size_t initial_frame_size = ClientMessage::REQUEST_HEADER_LEN; + ClientMessage msg(initial_frame_size); + msg.set_retryable(true); + msg.set_operation_name("client.sendschema"); + + msg.set_message_type(static_cast(4864)); + msg.set_partition_id(-1); + + msg.set(schema, true); + + return msg; +} + +ClientMessage +client_fetchschema_encode(int64_t schema_id) +{ + size_t initial_frame_size = + ClientMessage::REQUEST_HEADER_LEN + ClientMessage::INT64_SIZE; + ClientMessage msg(initial_frame_size, true); + msg.set_retryable(true); + msg.set_operation_name("client.fetchschema"); + + msg.set_message_type(static_cast(5120)); + msg.set_partition_id(-1); + + msg.set(schema_id); + return msg; +} + +ClientMessage +client_sendallschemas_encode( + const std::vector& schemas) +{ + size_t initial_frame_size = ClientMessage::REQUEST_HEADER_LEN; + ClientMessage msg(initial_frame_size); + msg.set_retryable(true); + msg.set_operation_name("client.sendallschemas"); + + msg.set_message_type(static_cast(5376)); + msg.set_partition_id(-1); + + msg.set(schemas, true); + + return msg; +} + ClientMessage map_put_encode(const std::string& name, const serialization::pimpl::data& key, @@ -832,7 +911,7 @@ void map_addentrylistenerwithpredicate_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 71426) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -899,7 +978,7 @@ void map_addentrylistenertokey_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 71682) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -962,7 +1041,7 @@ void map_addentrylistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 71938) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -1533,7 +1612,7 @@ void map_addnearcacheinvalidationlistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 81666) { + if (messageType == EVENT_I_MAP_INVALIDATION) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -1546,7 +1625,7 @@ map_addnearcacheinvalidationlistener_handler::handle(ClientMessage& msg) handle_imapinvalidation(key, source_uuid, partition_uuid, sequence); return; } - if (messageType == 81667) { + if (messageType == EVENT_I_MAP_BATCH_INVALIDATION) { msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN); auto keys = msg.get>(); @@ -1858,7 +1937,7 @@ void multimap_addentrylistenertokey_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 134402) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -1920,7 +1999,7 @@ void multimap_addentrylistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 134658) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -2438,7 +2517,7 @@ void queue_addlistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 200962) { + if (messageType == EVENT_ITEM) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -2555,7 +2634,7 @@ void topic_addmessagelistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 262658) { + if (messageType == EVENT_TOPIC) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -2808,7 +2887,7 @@ void list_addlistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 330498) { + if (messageType == EVENT_ITEM) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -3237,7 +3316,7 @@ void set_addlistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 396034) { + if (messageType == EVENT_ITEM) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -4284,7 +4363,7 @@ replicatedmap_addentrylistenertokeywithpredicate_handler::handle( ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 854530) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -4348,7 +4427,7 @@ void replicatedmap_addentrylistenerwithpredicate_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 854786) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -4412,7 +4491,7 @@ void replicatedmap_addentrylistenertokey_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 855042) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -4471,7 +4550,7 @@ void replicatedmap_addentrylistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 855298) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -4601,7 +4680,7 @@ void replicatedmap_addnearcacheentrylistener_handler::handle(ClientMessage& msg) { auto messageType = msg.get_message_type(); - if (messageType == 856578) { + if (messageType == EVENT_ENTRY) { auto* initial_frame = reinterpret_cast( msg.rd_ptr(ClientMessage::EVENT_HEADER_LEN)); @@ -5887,7 +5966,7 @@ sql_execute_encode(const std::string& sql, msg.set(skip_update_statistics); msg.set(sql); - msg.set(parameters); + msg.set_contains_nullable(parameters); msg.set_nullable(schema); @@ -5915,55 +5994,6 @@ sql_fetch_encode(const sql::impl::query_id& query_id, return msg; } -ClientMessage -client_sendschema_encode(const serialization::pimpl::schema& schema) -{ - size_t initial_frame_size = ClientMessage::REQUEST_HEADER_LEN; - ClientMessage msg(initial_frame_size); - msg.set_retryable(true); - msg.set_operation_name("client.sendschema"); - - msg.set_message_type(static_cast(4864)); - msg.set_partition_id(-1); - - msg.set(schema, true); - - return msg; -} - -ClientMessage -client_sendallschemas_encode( - const std::vector& schemas) -{ - size_t initial_frame_size = ClientMessage::REQUEST_HEADER_LEN; - ClientMessage msg(initial_frame_size); - msg.set_retryable(true); - msg.set_operation_name("client.sendallschemas"); - - msg.set_message_type(static_cast(5376)); - msg.set_partition_id(-1); - - msg.set(schemas, true); - - return msg; -} - -ClientMessage -client_fetchschema_encode(int64_t schema_id) -{ - size_t initial_frame_size = - ClientMessage::REQUEST_HEADER_LEN + ClientMessage::INT64_SIZE; - ClientMessage msg(initial_frame_size, true); - msg.set_retryable(true); - msg.set_operation_name("client.fetchschema"); - - msg.set_message_type(static_cast(5120)); - msg.set_partition_id(-1); - - msg.set(schema_id); - return msg; -} - } // namespace codec } // namespace protocol } // namespace client diff --git a/hazelcast/generated-sources/src/hazelcast/client/protocol/codec/codecs.h b/hazelcast/generated-sources/src/hazelcast/client/protocol/codec/codecs.h index 3d227a4512..0f5d12176e 100644 --- a/hazelcast/generated-sources/src/hazelcast/client/protocol/codec/codecs.h +++ b/hazelcast/generated-sources/src/hazelcast/client/protocol/codec/codecs.h @@ -24,6 +24,13 @@ namespace hazelcast { namespace client { + +namespace serialization { +namespace pimpl { +class schema; +} // namespace pimpl +} // namespace serialization + namespace protocol { namespace codec { /** @@ -38,7 +45,9 @@ client_authentication_encode(const std::string& cluster_name, byte serialization_version, const std::string& client_hazelcast_version, const std::string& client_name, - const std::vector& labels); + const std::vector& labels, + byte routing_mode, + bool cp_direct_to_leader_routing); /** * Makes an authentication request to the cluster using custom credentials. @@ -51,7 +60,9 @@ client_authenticationcustom_encode(const std::string& cluster_name, byte serialization_version, const std::string& client_hazelcast_version, const std::string& client_name, - const std::vector& labels); + const std::vector& labels, + byte routing_mode, + bool cp_direct_to_leader_routing); /** * Adds a cluster view listener to a connection. @@ -62,6 +73,15 @@ client_addclusterviewlistener_encode(); struct HAZELCAST_API client_addclusterviewlistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_MEMBERS_VIEW = 770, + EVENT_PARTITIONS_VIEW = 771, + EVENT_MEMBER_GROUPS_VIEW = 772, + EVENT_CLUSTER_VERSION = 773, + }; + client_addclusterviewlistener_handler(logger& l); void handle(ClientMessage& msg); @@ -83,13 +103,21 @@ struct HAZELCAST_API client_addclusterviewlistener_handler int32_t version, std::vector>> const& partitions) = 0; -}; -/** - * Triggers partition assignment manually on the cluster. - * Note that Partition based operations triggers this automatically - */ -ClientMessage HAZELCAST_API client_triggerpartitionassignment_encode(); + /** + * @param version Holds the state of member-groups and member-list-version + * @param member_groups Grouped members by their UUID. Grouping is done + * based on RoutingStrategy. + */ + virtual void handle_membergroupsview( + int32_t version, + std::vector> const& member_groups) = 0; + + /** + * @param version The cluster version. + */ + virtual void handle_clusterversion(internal::version const& version) = 0; +}; /** * Creates a cluster-wide proxy with the given name and service. @@ -297,6 +325,12 @@ client_localbackuplistener_encode(); struct HAZELCAST_API client_localbackuplistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_BACKUP = 3842, + }; + client_localbackuplistener_handler(logger& l); void handle(ClientMessage& msg); @@ -307,6 +341,32 @@ struct HAZELCAST_API client_localbackuplistener_handler virtual void handle_backup(int64_t source_invocation_correlation_id) = 0; }; +/** + * Triggers partition assignment manually on the cluster. + * Note that Partition based operations triggers this automatically + */ +ClientMessage HAZELCAST_API +client_triggerpartitionassignment_encode(); + +/** + * Sends a schema to cluster + */ +ClientMessage HAZELCAST_API +client_sendschema_encode(const serialization::pimpl::schema& schema); + +/** + * Fetches a schema from the cluster with the given schemaId + */ +ClientMessage HAZELCAST_API +client_fetchschema_encode(int64_t schema_id); + +/** + * Sends all the schemas to the cluster + */ +ClientMessage HAZELCAST_API +client_sendallschemas_encode( + const std::vector& schemas); + /** * Puts an entry into this map with a given ttl (time to live) value.Entry will * expire and get evicted after the ttl If ttl is 0, then the entry lives @@ -558,6 +618,12 @@ map_addentrylistenerwithpredicate_encode( struct HAZELCAST_API map_addentrylistenerwithpredicate_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 71426, + }; + map_addentrylistenerwithpredicate_handler(logger& l); void handle(ClientMessage& msg); @@ -605,6 +671,12 @@ map_addentrylistenertokey_encode(const std::string& name, struct HAZELCAST_API map_addentrylistenertokey_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 71682, + }; + map_addentrylistenertokey_handler(logger& l); void handle(ClientMessage& msg); @@ -651,6 +723,12 @@ map_addentrylistener_encode(const std::string& name, struct HAZELCAST_API map_addentrylistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 71938, + }; + map_addentrylistener_handler(logger& l); void handle(ClientMessage& msg); @@ -968,6 +1046,13 @@ map_addnearcacheinvalidationlistener_encode(const std::string& name, struct HAZELCAST_API map_addnearcacheinvalidationlistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_I_MAP_INVALIDATION = 81666, + EVENT_I_MAP_BATCH_INVALIDATION = 81667, + }; + map_addnearcacheinvalidationlistener_handler(logger& l); void handle(ClientMessage& msg); @@ -1115,6 +1200,12 @@ multimap_addentrylistenertokey_encode(const std::string& name, struct HAZELCAST_API multimap_addentrylistenertokey_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 134402, + }; + multimap_addentrylistenertokey_handler(logger& l); void handle(ClientMessage& msg); @@ -1160,6 +1251,12 @@ multimap_addentrylistener_encode(const std::string& name, struct HAZELCAST_API multimap_addentrylistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 134658, + }; + multimap_addentrylistener_handler(logger& l); void handle(ClientMessage& msg); @@ -1424,6 +1521,12 @@ queue_addlistener_encode(const std::string& name, struct HAZELCAST_API queue_addlistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ITEM = 200962, + }; + queue_addlistener_handler(logger& l); void handle(ClientMessage& msg); @@ -1481,6 +1584,12 @@ topic_addmessagelistener_encode(const std::string& name, bool local_only); struct HAZELCAST_API topic_addmessagelistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_TOPIC = 262658, + }; + topic_addmessagelistener_handler(logger& l); void handle(ClientMessage& msg); @@ -1601,6 +1710,12 @@ list_addlistener_encode(const std::string& name, struct HAZELCAST_API list_addlistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ITEM = 330498, + }; + list_addlistener_handler(logger& l); void handle(ClientMessage& msg); @@ -1819,6 +1934,12 @@ set_addlistener_encode(const std::string& name, struct HAZELCAST_API set_addlistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ITEM = 396034, + }; + set_addlistener_handler(logger& l); void handle(ClientMessage& msg); @@ -2289,6 +2410,12 @@ replicatedmap_addentrylistenertokeywithpredicate_encode( struct HAZELCAST_API replicatedmap_addentrylistenertokeywithpredicate_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 854530, + }; + replicatedmap_addentrylistenertokeywithpredicate_handler(logger& l); void handle(ClientMessage& msg); @@ -2335,6 +2462,12 @@ replicatedmap_addentrylistenerwithpredicate_encode( struct HAZELCAST_API replicatedmap_addentrylistenerwithpredicate_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 854786, + }; + replicatedmap_addentrylistenerwithpredicate_handler(logger& l); void handle(ClientMessage& msg); @@ -2381,6 +2514,12 @@ replicatedmap_addentrylistenertokey_encode( struct HAZELCAST_API replicatedmap_addentrylistenertokey_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 855042, + }; + replicatedmap_addentrylistenertokey_handler(logger& l); void handle(ClientMessage& msg); @@ -2424,6 +2563,12 @@ replicatedmap_addentrylistener_encode(const std::string& name, bool local_only); struct HAZELCAST_API replicatedmap_addentrylistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 855298, + }; + replicatedmap_addentrylistener_handler(logger& l); void handle(ClientMessage& msg); @@ -2504,6 +2649,12 @@ replicatedmap_addnearcacheentrylistener_encode(const std::string& name, struct HAZELCAST_API replicatedmap_addnearcacheentrylistener_handler : public impl::BaseEventHandler { + // Define event constants + enum event_message_type + { + EVENT_ENTRY = 856578, + }; + replicatedmap_addnearcacheentrylistener_handler(logger& l); void handle(ClientMessage& msg); @@ -3119,25 +3270,6 @@ ClientMessage HAZELCAST_API sql_fetch_encode(const sql::impl::query_id& query_id, int32_t cursor_buffer_size); -/** - * Replicates schema on cluster - */ -ClientMessage HAZELCAST_API -client_sendschema_encode(const serialization::pimpl::schema& schema); - -/** - * Sends all the schemas to the cluster - */ -ClientMessage HAZELCAST_API -client_sendallschemas_encode( - const std::vector& schemas); - -/** - * Fetches a schema from the cluster with the given schemaId - */ -ClientMessage HAZELCAST_API -client_fetchschema_encode(int64_t schema_id); - } // namespace codec } // namespace protocol } // namespace client diff --git a/hazelcast/include/hazelcast/client/internal/version.h b/hazelcast/include/hazelcast/client/internal/version.h new file mode 100644 index 0000000000..5a74055ae9 --- /dev/null +++ b/hazelcast/include/hazelcast/client/internal/version.h @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2008-2025, Hazelcast, Inc. All Rights Reserved. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#pragma once + +#include "hazelcast/util/byte.h" + +namespace hazelcast { +namespace client { +namespace internal { +/** + * A generic version to be used with version aware classes. The version is composed of two bytes, denoting + * {@code MAJOR.MINOR} version. It is used to represent the Hazelcast cluster version. + * + * @since 5.5 + */ +struct version +{ + byte major; + byte minor; +}; +} // namespace impl +} // namespace client +} // namespace hazelcast \ No newline at end of file diff --git a/hazelcast/include/hazelcast/client/protocol/ClientMessage.h b/hazelcast/include/hazelcast/client/protocol/ClientMessage.h index 4aa1f36895..cfc3f0e72a 100644 --- a/hazelcast/include/hazelcast/client/protocol/ClientMessage.h +++ b/hazelcast/include/hazelcast/client/protocol/ClientMessage.h @@ -52,6 +52,7 @@ #include "hazelcast/client/protocol/codec/builtin/custom_type_factory.h" #include "hazelcast/client/serialization/pimpl/compact/schema.h" #include "hazelcast/client/serialization/pimpl/compact/field_descriptor.h" +#include "hazelcast/client/internal/version.h" namespace hazelcast { namespace util { @@ -692,6 +693,22 @@ class HAZELCAST_API ClientMessage return address(host, port); } + template + typename std::enable_if::value, + T>::type inline get() + { + // skip begin frame + rd_ptr(SIZE_OF_FRAME_LENGTH_AND_FLAGS); + + rd_ptr(SIZE_OF_FRAME_LENGTH_AND_FLAGS); + auto major = get(); + auto minor = get(); + + fast_forward_to_end_frame(); + + return internal::version{ major, minor }; + } + template typename std::enable_if::value, T>::type inline get() @@ -1341,6 +1358,13 @@ class HAZELCAST_API ClientMessage } } + template + void set_contains_nullable(const std::vector& values, bool is_final = false) + { + set(values, is_final); + } + + void set(const frame_header_type& header) { auto pos = wr_ptr(SIZE_OF_FRAME_LENGTH_AND_FLAGS); diff --git a/hazelcast/include/hazelcast/client/spi/impl/listener/cluster_view_listener.h b/hazelcast/include/hazelcast/client/spi/impl/listener/cluster_view_listener.h index a20135bd4c..2f32413c16 100644 --- a/hazelcast/include/hazelcast/client/spi/impl/listener/cluster_view_listener.h +++ b/hazelcast/include/hazelcast/client/spi/impl/listener/cluster_view_listener.h @@ -50,18 +50,25 @@ class cluster_view_listener event_handler(int connectionId, cluster_view_listener& viewListener, logger &logger); - virtual void before_listener_register(); + virtual void before_listener_register() override; - virtual void on_listener_register(); + virtual void on_listener_register() override; virtual void handle_membersview( int32_t version, - const std::vector& member_infos); + const std::vector& member_infos) override; virtual void handle_partitionsview( int32_t version, const std::vector>>& - partitions); + partitions) override; + + void handle_membergroupsview( + int32_t version, + const std::vector>& member_groups) + override; + + void handle_clusterversion(const internal::version& version) override; }; void try_register(std::shared_ptr connection); diff --git a/hazelcast/src/hazelcast/client/network.cpp b/hazelcast/src/hazelcast/client/network.cpp index addec9e4f0..b90961d6f6 100644 --- a/hazelcast/src/hazelcast/client/network.cpp +++ b/hazelcast/src/hazelcast/client/network.cpp @@ -346,7 +346,9 @@ ClientConnectionManagerImpl::encode_authentication_request( serializationVersion, HAZELCAST_VERSION, client_.get_name(), - labels_); + labels_, + 1, // default routing to ALL_MEMBERS + false); } switch (credential->type()) { @@ -363,7 +365,9 @@ ClientConnectionManagerImpl::encode_authentication_request( serializationVersion, HAZELCAST_VERSION, client_.get_name(), - labels_); + labels_, + 1, // default routing to ALL_MEMBERS, + false); } case security::credentials::credential_type::token: { auto cr = @@ -376,7 +380,9 @@ ClientConnectionManagerImpl::encode_authentication_request( serializationVersion, HAZELCAST_VERSION, client_.get_name(), - labels_); + labels_, + 1, // default routing to ALL_MEMBERS + false); } } assert(0); diff --git a/hazelcast/src/hazelcast/client/spi.cpp b/hazelcast/src/hazelcast/client/spi.cpp index 694416d40a..05a6de91d6 100644 --- a/hazelcast/src/hazelcast/client/spi.cpp +++ b/hazelcast/src/hazelcast/client/spi.cpp @@ -3094,6 +3094,21 @@ cluster_view_listener::event_handler::on_listener_register() connection_id)); } +void +cluster_view_listener::event_handler::handle_membergroupsview( + int32_t version, + const std::vector>& member_groups) +{ + // TODO: implement member groups handling is implemented +} + +void +cluster_view_listener::event_handler::handle_clusterversion( + const internal::version& version) +{ + // TODO: implement cluster version handling is implemented +} + cluster_view_listener::event_handler::event_handler( int connectionId, cluster_view_listener& viewListener, From 5dcf325e7175f09c458dbcf36f13e771f48399f5 Mon Sep 17 00:00:00 2001 From: ihsan demir Date: Tue, 21 Oct 2025 10:33:35 +0300 Subject: [PATCH 2/3] Update hazelcast/include/hazelcast/client/internal/version.h Co-authored-by: Jack Green --- hazelcast/include/hazelcast/client/internal/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hazelcast/include/hazelcast/client/internal/version.h b/hazelcast/include/hazelcast/client/internal/version.h index 5a74055ae9..656656b1f6 100644 --- a/hazelcast/include/hazelcast/client/internal/version.h +++ b/hazelcast/include/hazelcast/client/internal/version.h @@ -34,4 +34,4 @@ struct version }; } // namespace impl } // namespace client -} // namespace hazelcast \ No newline at end of file +} // namespace hazelcast From 62ab2d8d8c5f1b5b020a17462318f4df9f3ddc5c Mon Sep 17 00:00:00 2001 From: ihsan Date: Tue, 21 Oct 2025 14:24:39 +0300 Subject: [PATCH 3/3] Review comment fix. Defined constant `ALL_MEMBERS_ROUTING`. --- .../client/connection/ClientConnectionManagerImpl.h | 1 + hazelcast/src/hazelcast/client/network.cpp | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/hazelcast/include/hazelcast/client/connection/ClientConnectionManagerImpl.h b/hazelcast/include/hazelcast/client/connection/ClientConnectionManagerImpl.h index 0f16849b2e..fd2131e990 100644 --- a/hazelcast/include/hazelcast/client/connection/ClientConnectionManagerImpl.h +++ b/hazelcast/include/hazelcast/client/connection/ClientConnectionManagerImpl.h @@ -199,6 +199,7 @@ class HAZELCAST_API ClientConnectionManagerImpl static constexpr int32_t CLIENT = 1; static const endpoint_qualifier PUBLIC_ENDPOINT_QUALIFIER; static constexpr int SQL_CONNECTION_RANDOM_ATTEMPTS = 10; + static constexpr byte ALL_MEMBERS_ROUTING = 1; struct auth_response { diff --git a/hazelcast/src/hazelcast/client/network.cpp b/hazelcast/src/hazelcast/client/network.cpp index b90961d6f6..91c9369a1b 100644 --- a/hazelcast/src/hazelcast/client/network.cpp +++ b/hazelcast/src/hazelcast/client/network.cpp @@ -347,7 +347,7 @@ ClientConnectionManagerImpl::encode_authentication_request( HAZELCAST_VERSION, client_.get_name(), labels_, - 1, // default routing to ALL_MEMBERS + ALL_MEMBERS_ROUTING, // default routing to ALL_MEMBERS false); } @@ -366,7 +366,7 @@ ClientConnectionManagerImpl::encode_authentication_request( HAZELCAST_VERSION, client_.get_name(), labels_, - 1, // default routing to ALL_MEMBERS, + ALL_MEMBERS_ROUTING, // default routing to ALL_MEMBERS, false); } case security::credentials::credential_type::token: { @@ -381,7 +381,7 @@ ClientConnectionManagerImpl::encode_authentication_request( HAZELCAST_VERSION, client_.get_name(), labels_, - 1, // default routing to ALL_MEMBERS + ALL_MEMBERS_ROUTING, // default routing to ALL_MEMBERS false); } }