

In this Release Notes document, you will find the new features, enhancements and fixes of the Hazelcast 3.9 and 3.9.x releases.

The numbers in the square brackets refer to the issue numbers.

==== 3.9.4 RELEASE NOTES ====

Enhancements: 

- Introduced variable replacers. [#12809]
- Reporting of the ExecuteScriptRequest and ThreadDumpRequest: These two types of requests are sent from the Hazelcast Management Center to members. When they finish, there is no distinction between the logs (it is not obvious whether the responses end up with error or success). [#12437]
- Version of the client should be added to the Statistics API. [#12394]
- Outdated warnings regarding to time-to-live should be removed from IMap's Javadoc. [#12357]

Fixes:

- Reliable Topic cannot continue to operate if owner and backup of the backed ringbuffer go down at the same time. [#12919]
- `NullPointerException` is thrown when the method `QueryCache.getAll()` is called. [#12918]
- Query cache listener which is configured declaratively is not registered properly. [#12825]
- Query cache is created after each getQueryCache() call. [#12814]
- Portable serialization is mistakenly reporting incompatible class definitions when nested portables are used in certain scenarios. [#12733]
- ILock cannot the release lock properly based on the leasing time, if the lock name contains "@". [#12614]
- When map has a query cache, oldValue must be published after the method IMap.set(). [#12576]
- The method IMap.addEntryListener throws NullPointerException when a null is provided instead of a listener object. The same check should be done in all similar addListener methods in all proxies. [#12552]
- When an entry event listener is registered with oldValueRequired==false then both CacheEntryEvent#value and CacheEntryEvent#oldValue must be null or equal to the value that was removed/expired. [#12507]
- When using AWS discovery on a Hazelcast client, if the initial connection fails due to a 503 error being returned from AWS, then the connection is not retried as per the configured retry count. [#12457]
- IMap MBean is not created when a client reconnects to the cluster (when it uses cached map proxy). [#12417]
- ClientJoinOperation should be moved to PreJoin: the client ownership information is carried via the method OnJoinClientOperation. It is invoked after the joins, which creates a potential race. In rare cases, it is possible that a recently joined member is not aware of the client, if a client is also joined recently. [#12375]
- Authentication timeout logic must be revised to prevent the slow shutdowns: the clients need to wait all the scheduled tasks to finish before shutdown. [#12362]
- The method HazelcastCache#getNativeCache should define a narrowed type: Currently, it does not narrow the return type to the actual native cache that is used internally. This requires unnecessary cast in the calling code. [#12342]
- Shutting down members via console on Hazelcast Management Center should be disabled: it does not ask for credentials when stopping a member. [#12328]
- The text connection send buffer is not correctly sized: it is based on the server setting, not on the client. [#12326]
- Adding dynamic map configuration from HazelcastClient omits the time-to-live-seconds value. [#12292]
- The methods QueryCache#destroy and then create does not give a fresh query cache. [#12246]
- When using a HazelcastClient instance to add dynamic map configuration, it generally works for most of other parameters but the parameter timeToLiveSeconds is always 0. [#12273]
- A dynamically added configuration for Replicate Map structure causes a ConfigurationException. [#12222]


==== 3.9.3 RELEASE NOTES ====

Enhancements:

- Ping Failure Detector for Hazelcast Java Client: Ping Failure Detector provides a quicker and more deterministic detection of hardware and other lower level events. It has been available for Hazelcast members; now, it can also be used for Hazelcast Java clients. The related PR is [#12049]. Please see the Client Ping Failure Detector section.

The following are the other improvements performed to solve the enhancement issues opened by the Hazelcast customers/team.

- Enhancements in the WAN Diagnostics: Introduced latency tracking for WAN endpoints and 
counters for sent and received WAN events. [[#12615]](https://github.com/hazelcast/hazelcast/pull/12165)
- Introduced a system property to allow overriding the configured serialization byte order for better testing. [[#12145]](https://github.com/hazelcast/hazelcast/issues/12145)
- Performed updates for JCache 1.1 compatibility. [[#12014]](https://github.com/hazelcast/hazelcast/pull/12014)
- Allow ciphersuites and protocol configuration in the `SSLEngine` provided by the JRE. This support is already present in the OpenSSL engine. [#1884]
- Enhancements in the WAN Diagnostics: Introduced latency tracking for WAN endpoints and 
counters for sent and received WAN events. [#1878]
- Introduced a system property to allow overriding the configured
serialization byte order for better testing. [#1868]
- Performed updates for JCache 1.1 compatibility. [#1857]


Fixes:

- CacheMergeOperation does not publish WAN events. [#12186]
- Java serialization compression issue: Since GZipInputStream read more bytes than it needs, the fields coming after a compressed data is not able to be read. [#12104]
- Setting the property hazelcast.mc.max.visible.instance.count to Integer.MAX or a huge value causes OOME. [#12095]
- The Javadoc for SHUFFLE_MEMBER_LIST in the class ClientProperty is not correct. The shuffling is done when the related property (hazelcast.client.shuffle.member.list) is set to true. Also the description in the Hazelcast Reference Manual should be corrected accordingly. [#12082]
- Endianness not taken into account consistently for serializer type IDs. [#12077]
- Hazelcast client throws "AuthenticationException: Invalid credentials after owner member left". Clients should detect when a member is gone ungracefully. [#12038]
- Query results should be converted to OBJECT in-memory format while creating the query-result-set, if the transaction is not originated from the client. [#12050]
- IMap's aggregate, projection, localKeySet and executeOnEntries methods throws exception when PartitionPredicate is being used. [#11962]
- There is a race condition in the client's Near Cache: "File is already being used by this Hazelcast instance". This was caused by the a problem with the synchronization between Near Cache creation and the destroy inside the Near Cache manager. [#11648]
- The map screen of Management Center does not show throughput info for `TransactionalMap`s. [#11640]
- Support for multiple Principals in JAAS Subject: With this support, permission checking in DefaultPermissionPolicy is fixed to allow multiple ClusterPrincipal instances assigned to a JAAS Subject. The resulting permission set is the union of permissions mapped to all the ClusterPrincipal names in JAAS Subject. [#1879]
- WAN replication event should be generated inside the method afterRun of the merge operation. [#1875]

Behavioral Changes:

- Default value of the system property hazelcast.mc.max.visible.instance.count changed from 100 to Integer.MAX_VALUE. So you may see more than usual data in your Management Center, if you have more than 100 data structures in your Hazelcast cluster.

==== 3.9.2 RELEASE NOTES ====

Enhancements: 

- Expiration operations can be stopped/canceled during the SHUTTING_DOWN state. Otherwise it causes graceful shutdowns which take longer, especially on clusters with a large amount of data, e.g., High-Density Memory Store backed maps. It is not necessary to block the shutdown for these operations since it will eventually be handled on the new owner of the entries. [#11919]
- Changed Hazelcast base images from Debian to Alpine Linux. Hence, the size of the image is reduced. [#48](On Hazelcast-Docker GitHub repo).


Fixes:

- PartitionPredicate on MapAggregation throws exception when it is called from the client. [#11923]
- Some client TransactionalMap operations deserializes on the server side, while IMap.values() does not do so. This causes serialization exceptions on a client-member setup when members do not have the serialization information, e.g., in case where portables are used. [#11885]
- Replicated map's Javadoc contains only member behaviors/requirements which the client cannot meet due to its technical difference. [#11707]
- Ringbuffer access throws HazelcastInstanceNotActiveException when cluster state is PASSIVE. [#11664]
- Due to a problem in the TLS mechanism, IO threads could become stuck and fail to process further frames. Once this happens, traffic between members stops and the cluster ceases to operate correctly. Symptoms included heartbeat timeouts and split-brains. This fix resolves this issue. [#1825]

Coverity Fixes:

- The method addressTranslator.translate(target) of com.hazelcast.client.connection.nio.ClientConnectionManagerImpl.InitConnectionTask.run() may return null. The returned value is used as an argument for the method createSocketConnection(Address) which uses the value without a null-check. [#11771]

==== 3.9.1 RELEASE NOTES ====

New Features:

- Ping Failure Detector: Ping Failure Detector provides a quicker and more deterministic detection of hardware and other lower level events.


Fixes:

- MulticastJoiner may cause OOME because of the self-amplification in SplitBrainJoinMessage sending. [#11836]
- Dynamic config added on lite member not found after split-brain healing. [#11815]
- Client Transactions does not respect unisocket behavior. [#11802]
- Incorrect null log message in Delegating Address Picker Contribution-Welcome. [#11783] 
- Excessive EntryEventType[] allocations. [#11777]
- Hazelcast Client fails to connect the cluster if the first cluster member is down. [#11735]
- After promoting a member (HazelcastInstance.getCluster ().promoteLocalLiteMember ()), the instance of the member retrieved by getMembers() is not updated. [#11720]
- Enqueued item gets lost when the client stops and reconnects sooner than hazelcast.client.endpoint.remove.delay.seconds. [#11700]
- Node Initialization order is wrong. [#11681]
- QueryCache on an IMap that is subsequently destroyed and recreated doesn't work. [#11666]
- DefaultQueryCache::getAll doesn't check for null values. [#11665]
- "Could not retrieve ringbuffer service to destroy event journal" on shutdown. [#11662]
- Defining ManCenter in config causes PartitonMigration even though there is no data. [#11598]
- Weird split-brain like issue with Hazelcast 3.8.4. [#11533]
- Consider logging new HTTP connections with DEBUG or lower level. [#11196]
- HashSet and HashMaps initialized to too small size. [#9445]
- Introduce configuration option for WAN to connect to a private address when using Discovery SPI. [#1176]
- Member throws OutOfMemoryException in the smaller cluster side on Split-Brain recovery cycle. [#1763]


Coverity Fixes:

- Dereference null return value - ClientConnectionManagerImpl.encodeAuthenticationRequest(). [#11767]
- Using invalid iterator - SmartClientListenerService.deregisterListenerInternal(String). [#11760]
- Resource leak in client's ProxyManager. [#11751]


==== 3.9 RELEASE NOTES ====


1. New Features

- WAN Replication Using Discovery API: With this new feature, you can run multiple clusters within environments, that have Hazelcast's Discovery SPI implemented, without manually configuring IP addresses and use Hazelcast's WAN replication to keep them in sync.
- Dynamic Creation of Distributed Objects Configuration: You can perform on the fly configuration of your distributed objects.

2. Enhancements

- OpenSSL Integration: OpenSSL is integrated into Hazelcast
- Client Support for User Code Deployment: You can now perform dynamic class loading from Hazelcast clients too. Please see the Client User Code Deployment section.
- Event Journal: This new distributed data structure stores the history of mutation actions on data structures such as map or cache. Please see the Event Journal section.
- Fine-Grained Anti-Entropy Mechanism: Allows to detect inconsistencies for each data structure in a single partition and replicate only the specific fragment of it instead of the whole partition. Please see the Consistency and Replication Model chapter.
- Offloadable and Readonly entry processors: These interfaces introduced in order to significantly improve entry processors' throughput. Please see the Entry Processor Performance Optimizations section.
- Gigantic Cache Migration Enhancements: It enables manual control on the partition migrations. Partitions can be migrated/replicated in small fragments. Please refer to the hazelcast.partition.migration.fragments.enabled system property and NO_MIGRATION cluster state.
- Storing Near Cache Keys by Reference: This enhancement provides a functionality to skip the serialization of keys for Near Caches to improve the performance of the Near Caches. Please see the serialize-keys option in the Near Cache section.
- Client Connection Strategy Enhancements: Allows lazy initiation for Hazelcast Clients. Please see the Configuring Client Connection Strategy section.
- Default Group Password and Symmetric Encryption Default Credentials Policy: Hazelcast requires the default group password and default symmetric encryption password/salt to be changed. Please see the Validating Secrets Using Strength Policy section.
- Hazelcast Consistency Model Documentation: We added a new chapter explaining the full picture of Hazelcast's consistency model. Please see the Consistency and Replication Model chapter.
- Keeping JCache Implementation Updated: Hazelcast JCache implementation is updated for JSR 1.1 compliance when it is released.

The following are the other improvements performed to solve the enhancement issues opened by the Hazelcast customers/team.

- Support for properties in RingbufferStoreConfig must be added. [#11077]
- There should be the ability to add a timeout to get operations for Spring HazelcastCache. [#10756]
- Exception causes get lost when using IExecutorService with the Hazelcast client. [#10591]
- The attribute override-java-serialization should be added to the element global-serializer in hazelcast-client-config.xsd. [#10449]
- Hazelcast should have a method like gerOrCreateHazelcastInstance() to detect a default configuration file and either create an instance or get an existing one. [#10007]
- Allow binding any port without using the method setPortAutoIncrement() and specifying the port count. [#9775]
- Consistent interface for IMap and TransactionalMap is needed. [#8729]
- Hazelcast instance's name should be added as a prefix to the name of the threads managed by Hazelcast. [#8542]
- When back pressure is enabled members always use back-off and clients always throws HazelcastOverloadedException. This is not consistent and the behavior should be configurable on both members and clients. [#8533]
- There should be a Spring property placeholder for cache-deserialized-values in the map configuration. [#8487]
- For OperationService, the contention on the counters should be reduced. [#4925]
- Some of the properties mentioned in GroupProperties are not used anymore, it should be cleaned up. [#4505]
- When a grid member is configured to use port 0, it should be handled properly. [#2506]
- There should be the ability to configure the distributed objects on the fly. [#592]


3. Fixes

- Members cannot join to 3.9 cluster when using cache with a key/value type that is only resolvable from the user code deployment repository. [#11505]
- Hazelcast listeners may fail to be registered to a new joined member. This is caused by a race condition between PostJoinOperations and the member doing the listener registration. [#11490]
- Regression occurs after returning ResultSet instead of SortedQueryResultSet. [#11489]
- Performance issue in MapProxyImpl.readFromEventJournal with projection. Projection cloning on the method readFromEventJournal must be skipped. [#11410]
- There is an issue with MapStore: the method hcInstance.getMap(mapName) gets blocked when a new member joins and data is being loaded. [#11407]
- Migration operation during the member startup raises ERROR level exception. [#11406]
- SpringAware and NodeAware are not taken into account when injecting dependencies to various cache resources. [#11406]
- When the method execute() from OperationServiceImpl is used and if it times out, the operation cannot send a response since responseHandler is null (assuming the caller did not set it initially). This leads to NullPointerException. [#11375]
- In the method DataRecordComparator.isEqual(), the objects are always serialized so that the binary form is used to determine if something equals another object. This can lead to a lot of unwanted serializations. [#11290]
- There is an inconsistent behavior for the method exists() of CacheEntryProcessorEntry. [#11266]
- Hazelcast 3.8.4 source code does not match the JAR classes. [#11261]
- OperationTimeoutException should include the cause of exception. [#11233]
- There is no way to configure the "port-count" element within Spring context. [#11224]
- Registration objects cause a memory leak while using ScheduledExecutor. [#11221]
- Incorrect UnsupportedOperationException message: "Event journal actions are not available when cluster version is 3.9 or higher". It should be "....are available...". [#11220]
- loadClasses of client user code deployment throws ClassNotFoundException. [#11217]
- Dead cluster member causes a high reconnect count. [#11176]
- MapGetInvalidationMetaDataOperation throws NullPointerException in a Near Cache scenario. [#11147]
- REST endpoints for cluster version management should be documented. [#11139]
- CacheDestroyOperation must be invoked on the generic operation thread. [#11137]
- Hazelcast members keep leaving and rejoining from/to the cluster in Docker (via the plugin Hazelcast AWS). [#11118]
- The method ICache.getAndRemove() doesn't invalidate the Near Cache. [#11110]
- IScheduledExecutorService with @SpringAware does not inject ApplicationContext or Beans. [#11108]
- IMap allows passing null collection in putAll and getAll, and null keys in loadAll. [#11099]
- MapLoader NullPointerException occurs on loadAll(Collection) when the value is null and MapLoader implements PostProcessingMapStore or has an Interceptor. [#11081]
- "CacheNotExistsException" is thrown when a new member joins a cluster where the primary member is creating and destroying JCaches. [#11047]
- NullPointerException on ScheduledExecutor when handling multiple migration requests on the same source should be fixed. [#11047]
- The exception NoClassDefFoundError: com/hazelcast/com/eclipsesource/json/JsonObject is thrown when using Payara Server and Hazelcast-AWS. [#10994]
- There should be a warning or an information message when DiscoveryStrategy SPI is not on the classpath. [#10993]
- There is a rolling upgrade compatibility issue for native queries in Hazelcast 3.9. It will fail when a 3.8 member send a QueryOperation to 3.9. [#10973]
- SSL Incorrect Error Message: Memcached not enabled. Connecting to a Hazelcast Cluster that has SSL/Security disabled with a Hazelcast Client that has SSL enabled gives this error. [#10971]
- Statistics getTotalGetLatency, getTotalRemoveLatency, and getTotalPutLatency works incorrectly. [#10938]
- Map destroy doesn't remove invalidation sequences and this causes OutOfMemoryException. [#10936]
- Ensure dynamic configuration is available before HazelcastInstance is returned to user. [#10926]
- Illegal character exception is thrown at index for the character "^". [#10921]
- The method ScheduledTaskHandler.of(urn) fails when IPv6 address is used. [#10898]
- There is a thread leak after calling the method HazelcastInstance.shutdown() in 3.8.2; so, JVM won't exit. [#10886]
- Transactional Queue: Backup reserve is failed, itemId: is not found. [#10867]
- Map configurations inconsistency between members. [#10860]
- PostJoinMapOperation is running on a generic thread; it means it cannot create high-density memory store indexes. It should probably spawn partition specific operations. [#10841]
- The element config-permission cannot be configured in Hazelcast Spring XML. [#10835]
- DynamicSecurityConfig and SecurityService lifecycle should be clarified. [#10834]
- Eliminate synchronization when checking task permissions. [#10833]
- Dynamic configuration tasks should be non-blocking. [#10813]
- Hazelcast declares commons-logging (OSGi) as a required dependency, but it is not required. [#10770]
- Comparing Version.UNKNOWN with other versions results in strange results. [#10755]
- Multiple threads from Spring boot application are able to acquire lock on the same document id ( String ). [#10754]
- The system property hazelcast.cache.invalidation.batchfrequency.seconds does not work for IMap. [#10743]
- The method isEnterprise() for BuildInfoProvider does not work in Hazelcast 3.7.x. [#10740]
- Infinite loop trying to initialize Cache configuration when deserialization fails. [#10728]
- There is a race between CacheConfig addition and Proxy creation when a new member joins cluster. [#10727]
- There is an infinite loop trying to initialize cache configuration when deserialization fails. [#10723]
- Fail fast should occur when the cache's in-memory format is incompatible with its eviction configuration. [#10716]
- When a Java application is run with Hazelcast 3.8.2 within Docker, and after switching from openjdk:8u121-jre-alpine to openjdk:8u131-jre-alpine, IllegalArgumentException is thrown during cluster bootstrap. [#10704]
- Performance Issue in Hazelcast 3.8.1: QueueStore.loadAll() is called way too often when draining items from Queue. [#10621]
- Hazelcast instance is not injected into predicate. It occurs when the predicate is not serialized and deserialized because it was invoked on the partition owner. [#10620].
- Hazelcast client always tries to connect to localhost when using DiscoveryStrategy. [#10606]
- Scheduled task remains cancelled after migration. [#10603]
- SplitBrainMergeValidationOperation ignores the join check from [NODEB]:5701, because that node is not master. [#10587]
- Problem setting up a cluster into Docker Swarm (overlay network). [#10477]
- New cache eviction is populated among nodes very slowly. [#10470]
- WAN backup events are published twice. The publishWanReplicationEventBackups method is called in the run and afterRun method in the PartitionWideEntryBackupOperation. Elsewhere it is only called in afterRun. This needs to be checked but possibly the fix is just to remove the call in run. [#10457]
- "PortableFactory[-22] is already registered" error when using Spring Boot 1.4.2 and Hazelcast 3.7.x. [#10438]
- Source parameter is null on JCache.loadAll() call. [#10328]
- TransactionalMapProxy depends on MapContainer. Also, creating a TransactionalMapProxy should not trigger creation of the backing MapContainer. [#10254]
- It is impossible to stop a Hazelcast Client service if it has never connected to the server. [#10237]
- TcpIpJoiner throws the exceptionConcurrentModificationException: null. [#10207]
- Cache.cacheManager may be overwritten with a different CacheManager. [#10200]
- It seems like the Near Cache statistics seem to be off-by-one for at least the ownedEntryCount. Sometimes the ownedEntryMemoryCost seems to be affected as well. [#10193]
- PagingPredicate does not work for the method executeOnEntries(). [#10174]
- Setting up a Hazelcast listener in a Spring configuration format does not seem to work when using the class property of hz:listener. [#10154]
- Test coverage for NearCacheClientCacheProxy should be increased. [#10127]
- Fast Aggregations for any operator on empty arrays do not work. [#10126]
- CachingProvider should attempt to get or create HazelcastInstance with the default configuration when only instance name is provided. [#10094]
- MulticastDiscoveryStrategy does not work correctly with client discovery. [#10089]
- Updates with IMap#putTransient should trigger EntryUpdatedListener. [#10077]
- The method loadAll(boolean replaceExistingValues) does not reload the map store after the method cache.evictAll is called. [#10057]
- Hazelcast XML configuration does not allow RANDOM eviction as an eviction policy. [#10053]
- There is a race condition in TestClientRegistry where the tests are calling blockFrom and blockTo before any connection was made (via createSocketConnection). This causes NullPointerException in those block methods. [#10021]
- Client side query cache declarative configuration does not support wildcard usage mapName configuration. [#9990]
- When health check is enabled, the user can send a garbage request like http://<your member's host IP>:5701/hazelcast/healthqqq and it returns a correct response. [#9967]
- Durable Executor Service re-executes the completed tasks in case of a member failure. [#9965]
- There is a problem with virtual IP assignments when Hazelcast is used into a Docker Swarm cluster. [#9963]
- Currently there is no Spring support for Near Cache preloader. [#9771]
- MapStore: write delay is not precisely respected as it has been in the previous Hazelcast releases (before 3.7.4). [#9745]
- The option cache-local-entries is not supported at the client side Near Cache configuration. [#9712]
- Latest member-list may not be received when FinalizeJoinOperation invocation timeouts. [#9501]
- Cluster member-list update operations are not ordered, new member addition and removal operations can get reordered on receiving/processing side. Also periodic member-list publish operation has no order with other member adding/removing operations. That can cause having different member lists on different members. [#9486]
- Hazelcast Client API (3.7.3) is not able to execute get/put/delete operations on the maps when used in AWS with smart-routing enabled (values and clear operation work). [#9419]
- Single map with ten items and three members, Split-Brain case: After isolating one member, the merge occurs only with some of the keys, not all of them. [#9358]
- When attempting to start a cluster member (3.6.5) with JMX enabled, IllegalArgumentException is thrown and the member is self-terminated immediately. [#9293]
- Backup is lost if maxIdle property is used. [#9153]
- MultiMap lock: Thread is getting stuck when calling lock(key). [#9055]
- Near Cache on the Hazelcast Client side returns old values. [#8838]
- Behavior of TTL when it is a negative value should be clarified. [#7729]
- Heartbeat only removes a member if it is related to the master member. [#5253]
- Multicast discovery does not work after loading some data. [#4721]
- The HD CachePutAllOperation loses backup entries, when a NOOME occurs and the operation is executed again after the forced eviction. [#1753]
- If an HD map operation runs on a generic partition thread, the RecordStore will be null, which leads to a NullPointerException in the forced eviction code. [#1749]
- The HD Near Cache record store is not properly disposed on destroy() calls. This affects all HD Near Cache scenarios. [#1672]
- WAN replication's EnterpriseMapReplicationRemove event causes SerializationException. [#1636]
- When OpenSSL integration is configured, it would be nice to have something in the logs like "OpenSSL integration enabled.". Current status is that there is only "SSL is enabled", which is confusing. [#1627]
- WanReplicationService should implement FragmentedMigrationAwareService. [#1596]
- OpenSSL chapter in the reference manual should list supported configurations. [#1582]
- HeapData cannot be cast to NativeMemoryData on HDEntryOperation. [#1580]
- WAN synchronization using REST fails. [#1548]
- CachePutAllOperation does not emit WAN events. [#1531]
- Rolling Upgrade: 3.9 member cannot join to 3.8 cluster. [#1492]
- ObjectNamespace cannot be serialized compatibly. [#1471]
- When serializing a Versioned DataSerializable, Input/Output.getVersion() returns UNKNOWN when a non-versioned field is serialized inside outer Versioned. [#1369]
- Object passed to LoginModuleConfig.setImplementation is never used. [#1337]

4. Behavioral Changes

- Maximum timeout of heartbeat for a member to assume it is dead was 300 seconds. Starting with Hazelcast 3.9, it is reduced to 60 seconds. Related property is hazelcast.max.no.heartbeat.seconds. Also, starting with Hazelcast 3.9, maximum timeout of master confirmation from other members is reduced to 150 seconds from 450 seconds. Related property is hazelcast.max.no.master.confirmation.seconds.

- Starting with Hazelcast 3.9, the default `Cache` merge policy is "Put if Absent". It was "Pass Through" before Hazelcast 3.9.

- Starting with Hazelcast 3.9, the format of member list shown in the logs is changed. Before Hazelcast 3.9, it was like the following:

Members [3] {
    Member [127.0.0.1]:5701 - c1ccc8d4-a549-4bff-bf46-9213e14a9fd2 this
    Member [127.0.0.1]:5702 - 33a82dbf-85d6-4780-b9cf-e47d42fb89d4
    Member [127.0.0.1]:5703 - 813ec82f-9d9e-4712-bae1-6c95b32d6d7d
}
Starting with Hazelcast 3.9, it is shown as follows:

Members {size:3, ver:3} [
  Member [127.0.0.1]:5701 - e40081de-056a-4ae5-8ffe-632caf8a6cf1 this
  Member [127.0.0.1]:5702 - 93e82109-16bf-4b16-9c87-f4a6d0873080
  Member [127.0.0.1]:5703 - 06fb4e61-9757-443b-a19f-7af1f3966f30
]
Here, you can see the size of your cluster (size) and member list version (ver). The member list version will be incremented when changes happen to the cluster, e.g., a member leaving from or joining to the cluster.

You can set the system property hazelcast.legacy.memberlist.format.enabled to true if you want to see the member list in its old format.
