This document lists the new features, enhancements, fixed issues and, removed or deprecated features for Hazelcast IMDG 4.2 release. The numbers in the square brackets refer to the issues in Hazelcast's GitHub repositories.
New Features
Hazelcast IMDG Open Source New Features:
- Sorting Support for Hazelcast SQL: Added the support of SQL sorting feature.
By using the newly implemented ORDER BY, LIMIT, and OFFSET constructions,
you can see the query results being ordered in ascending or descending fashion,
limit the count of results, or skip some results. See https://docs.hazelcast.com/imdg/4.2/sql/select-statement.html#sorting for examples. - Node Aware Partition Grouping: Added the support of
partition grouping mechanism in the Hazelcast discovery plugin for Kubernetes.
You can create partition groups according to the name of the node which is
provided by this plugin and on which the containers/pods run. See the https://docs.hazelcast.com/imdg/4.2/clusters/partition-group-configuration.html#node-aware-partition-grouping of the IMDG Reference Manual for more information. - Placement Aware Partition Grouping: Added the support of
partition grouping mechanism in the Hazelcast discovery plugin for AWS.
You can group members according to their placement metadata provided by the cloud providers,
such as rack, fault domain, power sources, network, and resources of a virtual machine in a zone.
See https://docs.hazelcast.com/imdg/4.2/clusters/partition-group-configuration.html#placement-aware of the IMDG Reference Manual for more information. - Dynamic Log Level Support: Added the support of changing Hazelcast log levels
without restarting cluster members. See https://docs.hazelcast.com/imdg/4.2/clusters/logging-configuration.html#dynamically-changing-log-levels.
Breaking Changes
-
Improved the
GenericRecord
and serialization API [#18100]:
**GenericRecord#read()
andGenericRecord.Builder#write()
methods have been renamed asget()
andset()
, respectively.
**GenericRecord.Builder
has been moved to its own class asGenericRecordBuilder
.
**UTF
has been renamed asString
for the following methods, which are now deprecated:
***ClassDefinitionBuilder.addUTFField()
***ClassDefinitionBuilder.addUTFArrayField()
***PortableWriter.writeUTF()
***PortableWriter.writeUTFArray()
***PortableReader.readUTF()
***PortableReader.readUTFArray()
***ObjectDataOutput.writeUTF()
***ObjectDataOutput.writeUTFArray()
***ObjectDataInput.readUTF()
***ObjectDataInput.readUTFArray()
**UTF
has been renamed asString
for the following without deprecation:
***GenericRecord.readUTF()
***GenericRecord.readUTFArray()
***GenericRecordBuilder.writeUTF()
***GenericRecordBuilder.writeUTFArray()
-
Per-entry statistics of maps now are disabled by default; they were enabled in
the previous releases. See the Enhancements section below. -
The default value for cluster connection timeout for clients has been set as
-1
(infinite timeout):
This is the timeout value for the client to give up to connect to the current cluster.
For the default value, the client will not stop trying to connect to the target cluster.
See https://docs.hazelcast.com/imdg/4.2/clients/java.html#configuring-client-connection-retry for more information. [#18094]
Enhancements
Hazelcast IMDG Open Source Enhancements:
- Per-Entry Statistics of Maps: Introduced a configuration option (
per-entry-stats-enabled
)
for retrieving per-entry statistics of a map, which is disabled by default.
See https://docs.hazelcast.com/imdg/4.2/data-structures/map.html#accessing-entry-statistics. - Default Serializer Overriding: Added the ability to override Hazelcast's built-in serializers.
Also added the serialization support ofjava.util.Optional
. See https://docs.hazelcast.com/imdg/4.2/serialization/serialization.html.
The following are the improvements performed to solve the enhancement issues opened by the Hazelcast customers/team.
- Added support of named parameters in SQL's
HazelcastFunction
. [#18328] - Added the HTTPS/TLS support for phone home pings. Also enhanced the phone home data by adding the following information [#18337], [#18326], [#18307], [#18287]:
** Java classpath on which the member runs
** Detailed client information such as total connection durations and client versions
** Total number of created proxies for each distributed object service - Improved the
LIKE
query predicate so that it now supports indexes. [#18289] - Added
management-permission
to the client permissions that defines which Management Center client principals/endpoints are allowed to perform management tasks. [#18264] - Added the temporal types support for indexes by introducing converters for the missing types (
LocalTime
,LocalDate
,LocalDateTime
andOffsetDateTime
) [#18244] - Added the support of bitmap index statistics to be propagated to local map statistics. [#18220]
- Improved the map store configuration such that it is enabled unless you explicitly disable it; this improvement has been introduced to eliminate the inconsistencies between map store's declarative and programmatic configurations. [#18217]
- Implemented the High-Density Metadata Store to store all the metadata for on-heap and off-heap storages. This new store is based on
BinaryElasticHashMap
.
A new type of record calledHDMetadataRecord
has been introduced for this purpose that references the key and value part of the metadata. [#18186] - Added the ability to register the class definition of the parent generic record and check the class definition compatibility for nested portable fields. [#18180]
- Improved the SQL engine so that it attempts to re-use the already deserialized values stored in an index; this has been improved the map scan operations
performance when there is at least one index on an IMap. [#18172] - Added the
iterator()
anditerable()
methods with different parameter combinations to the map. [#18126] - Added the support of non-nullable columns for the SQL service. [#18114]
- Implemented the fetch and offset SQL clauses without pushing the operator on the individual member. [#18091]
- Introduced a new serialization mechanism for SQL row data. Previously, every value was being serialized as
Data
which was inefficient and the non-Java clients could not read some types, e.g.,decimal
. With this new mechanism, a new custom codecSqlPageCodec
has been introduced that serializes values using a custom built-in list serializer depending on the type of the column. [#18089] - Added
Nonnull
annotations toStreamSerializer
. [#18071] - Added the ability to cancel queries on the client side when there are active requests sent to the member; this enhancement facilitates the future implementation of a non-blocking SQL client handler. [#18047]
- Added the support of
OBJECT
type in the comparison operators in Hazelcast's SQL service. [#18016] - Implemented the
ORDER BY
clause for the SQL service; it supports the ASC and DESC sortings with limitations. [#18013] - Added the support of
remainder
operation to Hazelcast's SQL service. [#17997] - Added the support of
NOT LIKE
expression to Hazelcast's SQL service. [#17996] - Introduced a new SQL threading model to improve its performance. [#17985]
- Introduced the support of schemas for the SQL public API. [#17953]
- Implemented the
IMap.entrySet()
method for the partition ID set. [#17937] - Improved the discovery by external smart clients in the cloud environments: the clients now only need to know the address of any member (or that of a load balancer if members are exposed via load balancer). [#17895]
- Introduced a configuration property to ignore errors during enabling the XXE protection. This protection works with JAXP 1.5 (Java 7 Update 40) and newer.
When an older JAXP implementation is added to the classpath, e.g., Xerces and Xalan, an exception is thrown. The newly introduced property, namelyhazelcast.ignoreXxeProtectionFailures
, allows you to ignore those exceptions. [#17839] - Added the missing
replicatedmap-permission
support to the XML and YAML configuration handlers. [#17810] - Replaced
Charset
withStandardCharsets
to be used in JSON querying. [#17741] - Implemented migration listener for the Java client. [#17713]
- Introduced tenant control when creating JCache caches. [#17673]
- Added the
BigDecimal
,LocalTime
,LocalDate
,LocalDateTime
,OffsetDateTime
types to the Portable Serialization. [#17257] - Introduced the
unparkAll()
method for event journal read operations. [#14081]
Fixes
- Fixed a regression issue where the locked and expired entry keys could not be
reached over indexes. [#18386] - Improved the deserialization for indexes: when having multiple indexes on a map,
each time an entry is put in the map and thus to the index, the entry is
deserialized for each index instead just once. This was causing performance issues. [#18343] - Fixed an issue where SQL's
ORDER BY
statement was failing if the field is indexed
and there are other clauses such asWHERE
in the query. [#18341] - Fixed an issue where
GenericRecord
could not be queried when the
in-memory format of the map isOBJECT
. [#18336] - Fixed a discrepancy between the behaviors of index-scan and full-scan in maps; the
eviction of the idle map entries was not stable in IMDG 4.x series due to this
discrepancy. [#18334] - Fixed an issue where the health monitor was logging no values for
garbage collection metrics. [#18317] - Fixed an issue that occurred when there is Near Cache configured for both the member and
client sides for the same map andserialize-keys
option isfalse
. [#18312] - Fixed an issue where the transactions was not throwing
TransactionTimeOutException
in case of a timeout. [#18305] - Fixed an issue where Hazelcast IMDG was not picking the
hazelcast.xml
configuration file from the download package but from the current working
directory where IMDG has been started. [#18304] - Fixed the race condition occurring during the serialization of writes for the
copy-on-write data structures. [#18285] - Fixed an issue where the clients, in a blue/green deployment,
were hanging while reconnecting to the alternative cluster due to
mishandling of member list. [#18276] - Fixed an issue where
CachedQueryEntry
could not be serialized since it didn't
have a default serializer. [#18238] - Fixed an issue where the Java client was not receiving membership events
in its membership listener when a member with Hot Restart Persistence enabled is restarted. [#18234] - Fixed a regression issue: when overlapping wildcard configurations
are defined declaratively, the most specific one was inheriting
attributes from the more generic one during parsing. [#18187] - Fixed an issue where the non-UTF characters in a JSON value was
causing query failures. [#18183] - Fixed an issue where tasks were not running in parallel when
they are submitted to all the cluster members in some scenarios. [#18107] - Fixed an issue that prohibited Hazelcast from being used as Tomcat session manager
when it is also deployed in a web application context:
When a client application that uses Hazelcast tries to connect to the Hazelcast cluster and this
application's web sessions are persisted using Hazelcast's Tomcat session manager,
the session manager could not connect to the cluster. This has been
fixed by improving Hazelcast's service loader mechanism. [#18103] - When the in-memory format of a map is NATIVE and the uploaded user code has missing
classes (in case the user code deployment feature is used), the resulting exception
could not be seen on the client side when a map query is run. This was causing the
client to hang indefinitely and fixed by improving the failure handling for this case. [#18081] - Fixed an issue where the queue items were being delivered more than once
when they are reproduced after a member leaves the cluster. [#18057] - Fixed the syntax for
inMemoryFormat
variable in theMapConfig.toString()
method. [#17976] - Fixed a failure which happened when a client is recreated with the same
client failover configuration after creating a map that has the default near cache eviction
configuration. [#17952] - Fixed several issues when handling the SQL expressions. The fixes
include not relying on Apache Calcite for inference and coercion anymore and
introducing custom operand checker implementations provided by every operator. [#17947] - Fixed an issue where the metrics for map hits statistics in Management Center
were decreasing as the map entries are being expired. [#17930] - Fixed an issue where the clients were opening two connections
to the same member when the member is behind a private network. [#17844] - Fixed an issue where the failures in
SessionAwareSemaphore
was preventing
the acquired permits from their releases. [#17826] - Fixed an issue where the Javadoc of release methods for
session-aware semaphore structure was incorrectly addressing
"threads" instead of "Hazelcast instances". [#17823] - Fixed an issue where the
remove()
anddelete()
operations
of maps were not updating the local map statistics. [#17771] - Fixed the metrics unit for cache statistics to be declared in
microseconds. [#17742] - Fixed a failure when retrieving the member state before the member becomes ACTIVE
on Kubernetes using Helm charts. [#17773] - Fixed an issue where the parsing of configurations for some Hazelcast features, such as
Hot Restart and user code deployment, was
overriding the existing configuration values.
[#17675], [#17681], [#17885], [#17917], [#17923], [#17924], [#17940], [#17945], [#17946], [#17875], [#17878], [#17969], [#17971], [#17972] - Removed
InetSocketAddressCache
from the Java client code
so that the client can continue to work, while preserving the
behaviors in a Blue/Green Deployment scenario; the Java client was not able
to resolve the new address of a restarted member, e.g., for a setup in Docker environment. [#17239]
Removed/Deprecated Features
- The Symmetric Encryption feature has been deprecated. You can
use the TLS/SSL protocol to establish an encrypted communication
across your Hazelcast cluster. - The following system properties have been deprecated:
**hazelcast.partition.group.rack
**hazelcast.partition.group.host
**hazelcast.hotrestart.free.native.memory.percentage
Contributors
We would like to thank the contributors from our open source
community who worked on this release: