5.2 Release Notes

New Features

  • SQL stream-to-stream joins: You can now enrich the data of one stream with the data of another by joining them together.

  • Generic MapStore (BETA): You no longer need to write Java code to get data from an external data store, such as a relational database, into Hazelcast by implementing the MapStore or MapLoader interfaces.

  • JDBC Connector (BETA): You can now use SQL to connect to and query any database that supports the JDBC interface.

  • Experimental User Defined Types: You can now query nested objects within Java, compact, and portable mappings using the User Defined Types (UDTs).

  • CP Leadership Priority: You can now transfer CP member leadership to another member to ensure the availability of the CP subsystem.

Breaking Changes

  • Introduced a check to control the versions of Hazelcast Platform members and Hazelcast CLI are matched. Previously, it was possible to submit a job using a different version of CLI from the member version. Generally, it would work when there were no change in the serialized form of pipeline. Now, Hazelcast fails earlier in this case. #22224

  • Compact serialization is now stable and enabled by default. The BETA annotations have been removed from the related classes. #21997

Enhancements

Performance

  • MapStore Offloading: Added the offload element to map store configuration. It is used to offload map store and loader operations for each map in the cluster. This way, a map store operation does not block the next operations by blocking a partition thread indefinitely. Partition threads are one of the most important shared resources in a cluster; this offloading enables faster completion of the operations in these threads. See Offloading MapStore and MapLoader Operations. #21651

Cloud

  • Enterprise Enhanced the experience of using Hazelcast with persistence under Kubernetes by removing requirements for manual interventions. Previously, when there is a restart on such a cluster, the cluster states were needed to be changed manually. For some cases, this might have led to data loss. Now, the shutdown process is automated. See Configuring Kubernetes for details. #22501

SQL Engine

Distribution

  • Enterprise Removed the hazelcast-jet-cdc-mysql module from the Hazelcast Platform Enterprise distributions. See Capture Changes from MySQL to learn how to manually add it when using the Enterprise edition. #5295

  • Removed hazelcast-hibernate53 dependency from the main Hazelcast Platform distribution as it is not needed anymore. #22282

  • Minor versions of Hazelcast Platform are now released as X.Y.0, instead of the previous X.Y versioning scheme. #22218

Serialization

  • Added support of List, ArrayList, Set, HashSet, Map, and HashMap for the zero-config serializers. #21980

  • Added a check to the array of Compact and GenericRecord object fields, that does not allow different item types and schemas in such fields. #21958

  • Moved the GenericRecord and GenericRecordBuilder interfaces to the new serialization.genericrecord package. #21955

  • In case there is a field type that is not supported by the reflective serializer, now Hazelcast fails with an exception; all JDK classes are now excluded from the zero-config serialization, meaning, they cannot be used as types, field types, or array component types in the reflective serializers. #21918

  • Hazelcast now does not provide methods to read a default value in case of a missing field in the data. Instead, the following method has been introduced in CompactReader to check the existence of a field with its name and kind.

    FieldKind getFieldKind(String fieldName);

    You can use this method for fields that have changed or have a potential to change in the future. #21876

  • Moved the type-name and class configuration elements into the compact-serialization block. Removed the registered-classes element. #21861

  • Renamed the cloneWithBuilder() method as newBuilderWithClone() in the GenericRecord class. #21730

  • Added support for char fields in the compact serialization format. With this, char, char[], Character, and Character[] fields are now supported in the reflective compact serializers. #21054

Configuration

  • REST API is now enabled by default when you use Hazelcast Platform with Docker or by downloading the distribution packages (ZIP or TAR). #22249

  • Member discoveries in cloud environments (AWS, GCP, Azure, Kubernetes, Eureka) in Spring XML can be configured now using property placeholders. #21995

  • Added configuration elements for external data stores used by map stores, and JDBC sinks and sources. See Configuring Connections to External Data Stores. #21716

  • Introduced a way to configure AWS Asynchronous Client’s executor service used by Jet engine’s Kinesis sources and sinks (thread pool size, threads names pattern). For this purpose, AwsConfig is extended with an additional executorServiceSupplier field that allows to specify what executor service to be used. #21075

WAN Replication

  • Enterprise Acknowledgements for WAN synchronization are now sent asynchronously. This makes the WAN synchronization progress more reliable and resilient by doing retries if something goes wrong in any phase. #21415

Tiered Storage

  • Enterprise Tiered Storage is now a separately licensed feature and requires a license key with the feature enabled. Trial license keys are available for those who want to evaluate the functionality.

  • Enterprise Added a validation for the Tiered Storage configuration which checks whether the sum of memory tier capacities of all maps is lower than or equal to the native memory size. If not, an invalid configuration exception is thrown. #5243

Other Enhancements

  • You can now provide comma-separated lists to give multiple labels for the Kubernetes Discovery Plugin configurations service-label-name, service-label-value, pod-label-name, and pod-label-value. #22277

  • Added a new method which allows to update a map entry’s value without changing its previously set expiration time. See setValueWithoutChangingExpiryTime. #22199

  • Added support of configuring the maximum message size for Python runner, when using the Jet engine with Python. #22106

  • Fixed an issue where a client was infinitely trying to reconnect to the cluster with CP persistence enabled. #21769

  • Improved the change data capture API:

    • Introduced two new methods, newValue() `and `oldValue(), to compare values before and after an update of a record.

    • Methods that are used to extract metadata are no longer doing on the fly parsing of the payload, meaning there won’t be any ParsingException and you don’t have to deal with those possible exceptions.

    • Expose the Debezium source method, which takes a class instance instead of String with class name, to make the code more strongly-typed.

  • You can now specify multiple partitions while using predicate queries. This can only be done using programmatically. #21319

  • To decrease the load on the Management Center for large clusters, the level of network related metrics has been changed to DEBUG. When you need these metrics, you can use the hazelcast.metrics.debug.enabled property. #21232

  • While building Hazelcast from the source, you can now use the boolean hazelcast.disable.docker.tests property to ignore the tests that require Docker to run (by setting it to false). #21087

  • Improved connection handling. #21631

  • Added support of dynamic update of IP addresses of cluster members. For this, a new REST endpoint (hazelcast/rest/config/tcp-ip/member-list) is introduced for getting and updating the member list at runtime. This improves the split-brain recovery under even certain corner cases and ensures that the cluster recovery from split-brain in every cluster setup can be initially formed. #21552

  • Added support of nested fields for Hazelcast’s Java classes. #19954

Fixes

  • Enterprise Fixed an issue where a Hazelcast Enterprise member could not start when there is a custom serializer and the allow-override-default-serializers configuration is enabled. #4835

  • Fixed an issue where map persistence was not working when configured programmatically.

  • Fixed an issue where the WAN synchronization for all maps when using the REST API was done for all the WAN replications instead of the replication specified in the REST call. #22252

  • Fixed an issue where the IS NULL condition was being ignored when there is another condition for the same column. #22238

  • Fixed an issue where the IMap.get() call was blocked when NoNodeAvailableException is thrown from the MapStore. #22168

  • Fixed an issue where ClearBackupOperation in maps was being reported as a slow operation on the members which was causing the entire cluster to be frozen. #22082

  • Fixed an issue where the cluster merge was not happening properly when the master member does not know the addresses of the other members and if the other members start before the master one. #22021

  • Fixed an issue where the failover client statistics was not calculated properly. #21807

  • Fixed an issue where an internal periodic task (with an interval of 1 second) was trying to connect a client to all cluster members, even if there is no connection to the cluster yet:

    • A client connects to the cluster (where smart routing is enabled by default)

    • Connection is lost due to a failure

    • When the cluster is up, the client retries to connect for the configured wait time between retries

    • During these reconnection attempts, the internal periodic task was outputting logs of connection failure for each second until the client connects to the cluster.

  • SQL storage now replicates data to the newly joined members in the cluster. #21632

  • Fixed an issue where NullPointerException was thrown around the CREATE JOB statement which is using Kafka Sink connector when Kafka has no records yet. Now, it produces an appropriate log message. #21460

  • Fixed an issue where a cluster could not be formed when security is enabled, various client permissions are set, and multiple members are started simultaneously. #21440

  • Fixed an issue where data persistence and tiered storage configurations could not be added dynamically. #21432

  • Fixed a data loss issue which was occurring with graceful shutdown with when a member (with zero backup) restarts on the same address. #21428

  • Fixed an issue where a map remains empty after a put operation when the max-idle-seconds configuration has the value of Integer.MAX_VALUE. #21409

  • Fixed an issue where the connections were dropping in an active-active WAN replication setup using advanced network configurations. #21219

  • Fixed an issue where a cluster was unresponsive when you perform a health check to see the members are in the safe state; cluster members were hanging in the REPLICA_NOT_SYNC state during such health checks. #21145

  • Fixed an issue where the statistics like puts and removals were not increasing when these operations are executed through Transactional interface. #21086

  • Fixed an issue where a set time-to-live (TTL) duration for an entry was ignoring the split seconds. For example, when you set TTL as 1 seconds and put an entry at 01:01:5.99 AM , then the entry was already expired when you want to get this entry at 01:01:6.01 AM (should have been expired at 01:01:6.99 AM). #21018

  • Fixed a data race in SingleProtocolEncoder; while one method of this interface is called from the input thread, another one is called from the output thread which was causing the race. #20991

  • Fixed an issue where the automatic module name in hazelcast-5.x.jar could not be detected using Gradle. The reason was /META-INF/MANIFEST.MF not being the first or second entry in the JAR file; now this manifest file is the second entry. #20969

  • Fixed an issue where the list of members in the cluster was reset to an empty list when the UUID of a cluster changes after its restart: this was causing startup failures since Hazelcast could not manage the events due to the empty member list after a restart. #20818

  • Fixed an issue where JSON_QUERY with expression filter in SQL was not producing a result when the data source contains internal array(s). #20761

  • Fixed the mapping issue of Hazelcast map fields in SQL; when the value object contains a public getter of java.util.Map, the CREATE MAPPING statement was failing. #20256

  • Fixed an issue where the cluster was not merging properly if the master member does not know other members' addresses and when the other members start before the master member. #18661

Known Issues

  • Enterprise After upgrading to Hazelcast Platform 5.2.0, the cluster may stop suddenly due to the global index usage by the IMap’s High-Density memory store, which may lead to data loss. The issue resolves if you are not using global indexes.

Contributors

We would like to thank the contributors from our open source community who worked on this release: