Diffusion 6.3 Release Notes

6.3.1 (26 Jun 2019)

Changes made to existing features at release 6.3.1

Java & Android Client: Java client now supports Server Name Indication extension to SSL/TLS (20774)

The Java client now supports the SNI extension for SSL/TLS handshakes. This is always enabled, and uses the host name that the client is connecting to.

Bugs cleared at release 6.3.1

Android Client: Update streams do not work on Android (20511)

Addresses an issue where the Android client was unable to update topics using update streams or validate update streams.

Client: Incorrect topic view examples in API documentation (20766)

Incorrect topic view examples in API documentation have been corrected.

Configuration: Default setting for GeoLite City 2 database incorrect (20537)

An issue where the default setting for the GeoLite2 city database was pointing to 'data/GeoLiteCity.dat' rather than 'data/GeoLite2-City.mmdb' has been resolved.

Console: "Cannot read property 'specification' of undefined" when showing details of a time series topic (20485)

Time series topic values can now be viewed in the topic details view.

Console: Add new principal does not work (20523)

The [+] button to add a principal in the Security tab did not work. This issue has been resolved.

Console: Overflow when displaying large topic values (20564)

Large topic values no longer overflow the topic tree details view. Instead, values are broken up into multiple lines.

Console: Incorrect sorting of topic names (20635)

Topic node entries are now correctly sorted when being displayed.

Console: Console lags or crashes when expanding wide topic tree (20641)

The topic tree browser suffered from lags or crashes with wide topic trees. Performance has been improved by applying caching and paging mechanisms. Google Chrome may still have issues with wider topic trees. As a workaround, use the console in Firefox or Safari.

Console: Add new role does not work (20713)

The [+] button to add a role in the Security tab did not work. This issue has been resolved.

Console: Session metric collector 'Remove metrics when no sessions match' field not displayed correctly in console (20749)

A bug in the console session metric collector tab meant that the "Remove metrics when no sessions match" option could appear inactive, even if it was active. This has been corrected in this release.

Demos: ValueStream emits error after it is closed (20570)

A ValueStream would sometimes emitted an error after it was closed. This has now been fixed.

Java & Android Client: Javadoc is incorrect regarding the exceptions returned from CompletableFuture API calls (20722)

The Java API documentation for methods that return a CompletableFuture incorrectly stated that an ExecutionException is returned, when in fact a CompletionException is returned. This has now been corrected. Some methods do inconsistently return ExecutionException and these have been highlighted in the documentation and will be corrected in a future release.

Licensing: Issues with cluster licensing view of cluster (20789)

Due to a race, the cluster soft and hard connection limits were not being consistent for all the servers in the cluster. This issue has now been solved.

Persistence: File persistence service fails to restore - topic has different specification (20628)

When using both persistence and replication together a server could fail with the message "The file persistence service has failed to restore from existing files" indicating that a subsequent ADD_TOPIC record has a different specification. This made it impossible to restore from affected files. This issue has now been resolved.

Security: Roles with no permissions and no included roles are now reliably removed from the security configuration (20266)

In previous releases, if multiple roles were updated to have no included roles, redundant "set role 'X' includes []" statements could be left in the security store. If these roles had no associated global or topic permissions, they would incorrectly be included in the result of SecurityConfiguration.getRoles(). The bug has been fixed in this release.

Server: Using topic views causes NullPointerException in TopicManagerImpl.createReferenceTopic (20575)

When using topic views, some circumstances could cause a NullPointerException in TopicManagerImpl.createReferenceTopic. This problem has now been resolved.

System Monitoring/Statistics: Session metric collectors: session filter fails to match user session properties that have not yet been used (20748)

In Diffusion 6.3.0, a bug in the session property index affected the evaluation of session metrics collectors. If a session metrics collector had a session filter that referred to a user session property not previously used by a session, it would fail to match new sessions with that property. The bug has been fixed in this release.

Topics: Slave topics do not rebind after removal and recreation of master (20657)

Slave topics did not bind to the master topic if it was removed and then recreated. This has now been resolved.

6.3.0 (6 May 2019)

Features introduced at release 6.3.0

.NET Client: New operations to query the permissions of the current session (20272)

The new GetGlobalPermissionsAsync and GetPathPermissionsAsync methods in the ISecurity feature allow sessions to query the permissions that have been assigned to them.

Apple Client: Session locks (18751)

Adds support for per-session locks. To request session locks, use the lockWithName:completionHandler: and lockWithName:scope:completionHandler: methods on PTDiffusionSession instances.

Apple Client: Client proposed session properties (19416)

It is now possible for Apple clients to propose user-defined session properties when opening a session. These properties may be accepted, changed or vetoed by authentication handlers that implement the new Authenticator interface.

Apple Client: New update API (19498)

The Apple client now features the improved update API, with more flexible options when updating topics. It adds conditional updates, non-exclusive update streams and the creation of missing topics through the update API.

Apple Client: New operations to query the permissions of the current session (20274)

New 'get global' and 'get topic' permissions methods have been added to the PTDiffusionSecurityFeature, allowing sessions to query the permissions that have been assigned to them.

C Client: Subscribe/unsubscribe other sessions using session properties filters (12790)

The C Client is now able to subscribe/unsubscribe a number of sessions which match a given session properties filter to/from topics. This functionality is located in subscription-control.h.

C Client: Set session properties of other clients (17354)

The C client is now able to set session properties for an individual session or number of sessions matching a session properties filter. This functionality is located in client-control.h.

C Client: Time series topics (17501)

The C client now supports time series topics. Functions and information relating to time series topics can be found in time-series.h and range-query.h.

C Client: Change roles of other clients (19394)

Client control feature (located in client-control.h) has two new API functions: diffusion_change_roles_with_session_id and diffusion_change_roles_with_filter. These functions allow clients with sufficient permissions to change the security roles of other clients.

C Client: New topic notifications feature. (19619)

Introduces the Topic Notification feature (located in topic-notifications.h). Users may select topic paths, for which notifications of the presence, addition or removal of matching topics will be received. This allows users to build a view of the topic model held within the server.

C Client: New operations to query the permissions of the current session (20273)

The new diffusion_get_global_permissions and diffusion_get_path_permissions functions in security.h allow sessions to query the permissions that have been assigned to them.

Client: Session properties filters now support an 'all' clause (20200)

The session properties filter language has been extended to include an "all" clause that matches all sessions.

Console: New Diffusion console features (19805)

The web-based monitoring console has been expanded with new features, including: a new topic tree view; a new subscription view; the ability to view topic permissions; management of topics, metric collectors and topic views; improved logs tab with syntax highlighting and tooltips; counts of log messages by code and severity.

Java & Android Client: New operations to query the permissions of the current session (20159)

The new getGlobalPermissions and getPathPermissions methods in the Security feature allow sessions to query the permissions that have been assigned to them.

JavaScript Client: New TypeScript API (17983)

The JavaScript client has been completely re-written with TypeScript. All type definitions are now automatically generated.

JavaScript Client: New Authenticator interface supersedes AuthenticationHandler (19230)

A new Authenticator API has been implemented in the JavaScript client. The AuthenticationHandler has been deprecated.

JavaScript Client: Change roles (19395)

The JavaScript client now includes the change roles operation, enabling client sessions with sufficient permissions to change the security roles of other client sessions.

JavaScript Client: New operations to query the permissions of the current session (20160)

The new methods getGlobalPermissions and getPathPermissions on Session.security allow sessions to query the permissions assigned to them.

System Monitoring/Statistics: Server metrics redesign (18452)

The set of metrics published by the server has been completely redesigned. Highlights include: new metrics for the number of connected sessions, session-related messages and bytes (inbound and outbound), total network bytes (inbound and outbound), topic data size, topic subscriptions, topic subscribers, topic updates, topic subscriber updates. Log event metrics are now broken down by log level and code. Please refer to the product documentation for full details. The new metrics are published to the developer console, JMX, and the Prometheus gateway.

System Monitoring/Statistics: Metric Collectors allow focussed aggregation of topic and session metrics (19913)

Session metric collectors can be configured to record metrics for subsets of the sessions. Each session metric collector specifies the target sessions using a session filter. The metrics can optionally be further partitioned by an arbitrary list of session properties. Topic metric collectors can be configured to record metrics for subsets of the topics. Each topic metric collector specifies the target topics using a topic selector. The metrics can optionally be further partitioned by topic type. Like server-level metrics, collected metrics are published to the console, JMX, and (optionaly) the Prometheus gateway. Metric collectors can be defined using the console or JMX. The server will be persist the configuration, so the metric collectors will be recreated if the server is restarted. If the server belongs to a cluster, the configuration will be replicated across all members of the cluster.

Topics: New Topic Views Feature (9832)

Topic views can be used to automatically derive topics from other topics. The dynamically managed topics, generated by topic views are called reference topics. Reference topics are derived based on the path, specification and value of the source topics. Reference topics appear as ordinary topics to clients. Topic views allow Diffusion to separate how it represents topics internally and how it presents them to clients. Topic views can modify the topic properties, apply mappings to the value published and throttle the publication rate of reference topics. Topic views are specified using a new DSL. The management of topic views is supported in all client APIs.

Changes made to existing features at release 6.3.0

.NET Client: Deprecated exceptions within PushTechnology.DiffusionCore.Exceptions removed (19004)

The previously deprecated exception types have been removed: DecryptException, InboundMessageException, InboundProtocolException, InvalidTopicException, NotCompressedException, TopicInvalidException.

.NET Client: Deprecated TopicDetails types removed (19073)

The previously deprecated TopicDetails types have been removed. The list of the deprecated types includes: ISchemaId, ITopicDetailsSchema, ITopicDetailsBuilder, ITopicDetailsBuilder<TD>, ITopicDetailsBuilder<TB, TD>, IStatelessTopicDetailsSchema, IStatelessTopicDetailsBuilder, IStatelessTopicDetailsAttributes, ISlaveTopicDetailsBuilder, ISlaveTopicDetailsSchema, IRoutingTopicDetailsSchema, IUniversalTopicDetailsSchema, IUniversalTopicDetailsBuilder, ITopicDetailsBuilderFactory, IRoutingTopicDetailsBuilder and ICacheSchemaHandler<TC>.

.NET Client: Deprecated SecurityControl methods removed. (19096)

The previously deprecated ISecurityControl.ScriptBuilder() and IScriptBuilder.Script() methods have been removed.

.NET Client: Improved memory profile during connection loss (19948)

Previously, a connection loss under high load could cause a significant increase in memory usage due to the exceptions thrown by asynchronous methods. The behavior has now been changed so that the garbage collector has an easier time cleaning up memory during a connection loss.

.NET Client: IFetchRequest.First and IFetchRequest.Last now allows 0 to be supplied as an argument. (20432)

IFetchRequest.First and IFetchRequest.Last now allow zero as a parameter. Such a request can used to discover the existence of topics IFetchResult.HasMore.

.NET Client: New FetchResult.Count and FetchResult.IsEmpty properties (20440)

IFetchResult now provides Count and IsEmpty properties for direct access to the values in the Results property.

Apple Client: Fetch operations for time series topics (19615)

Adds support for fetch operations on time series topics.

Apple Client: Conform enum descriptions (20386)

Return values for description methods on classes inheriting from PTDiffusionEnumeration have been conformed to match the equivalent values in the Java API, as returned by the toString() method.

C Client: Fetch first/last now allows 0 to be specified. (20435)

diffusion_fetch_request_first and diffusion_fetch_request_last can now accept a 0 value. Fetching zero topics which match a selector can be used to detect the existence of matching topics by using diffusion_fetch_result_has_more.

C Client: New fetch_result_size and fetch_result_is_empty functions (20438)

diffusion_fetch_result_size and diffusion_fetch_result_is_empty functions have been added for fetch requests for convenience when processing result sets.

Client: Relaxed naming rules for session property keys (19265)

User proposed session property keys were previously restricted to strings of alphanumeric characters. This restriction has been relaxed to allow all Unicode characters with the exception of: ' ', '\t', '\r', '\n', '"', ''', '(', ')'.

Client: Per-session throttling has been deprecated (20335)

The client control methods that allow individual client sessions to be throttled, together with the throttling related methods and types of MessageQueuePolicy have been deprecated and will be removed in a future release. Applications that need to control the rate of data flow should prefer the per-topic throttling capabilities of topic views. Per-topic throttling has a far lower performance impact and is easier to use than per-session throttling.

Configuration: Persistence store-directory deprecated in favor of persistence-home (20149)

The Server.xml persistence.store-directory configuration item has been deprecated in favor of the new persistence-home item. This is also reflected in PersistenceConfig and ServerConfig classes in the Publisher configuration API. This change is because the 'persistence' directory is now used to hold the security store files as well as topic persistence files.

Installation: Non-versioned versions of the client libraries are no longer included in the installation (19822)

Previously the product installation included two copies of each client library. One copy had the product version in the name and one did not, but the files were otherwise identical. The unversioned copies are no longer included.

Java & Android Client: New FetchResult.size and FetchResult.isEmpty methods (19656)

FetchResult now provides FetchResult.size and FetchResult.isEmpty methods for direct access to the values returned by FetchResult.results.

Java & Android Client: New DataType.binaryDeltaType() method (19804)

The DataType interface now provides a binaryDeltaType() convenience method. This method is equivalent to calling deltaType(BinaryDelta.class), except it returns null if the data type does not support binary deltas, rather than throwing IllegalArgumentException. Diffusion implementation code has been changed to use the new method to avoid using exceptions for flow control when working with the long and double data types.

Java & Android Client: FetchRequest.first and FetchRequest.last now allow zero to be supplied as an argument (19862)

FetchRequest.first and FetchRequest.last can now accept a 0 value. Fetching zero topics which match a selector can be used to detect the existence of matching topics by using FetchResult.hasMore.

Java Client: Prevent blocking CompletableFuture calls from Diffusion threads (19505)

In previous releases, if a client application called a blocking CompletableFuture method, such as get() or join(), from a Diffusion thread would cause the client to deadlock because the same thread is used to deliver responses to the session. This situation typically happens when chaining CompletableFutures. For example: messaging.sendMessage("x", "m1", String.class, String.class) .thenAccept(r1 -> { // This will run in the Diffusion input thread, when the result of the first call is received. CompletableFuture<String> cf = messaging.sendMessage("y", r1, String.class, String.class); String r2 = cf.get(); // Before 6.3, this blocks the input thread so the response can't be delivered. After 6.3, it will cause r2 to complete exceptionally. LOG.info("Result {}", r2); }); From this release, the Java client will detect the use of a blocking method from a Diffusion thread, and complete the CompletableFuture exceptionally with a UnsupportedOperationException. To avoid the problem, when calling a second Diffusion method from a handler attached to a Diffusion-supplied CompletableFuture, only use non-blocking methods such as thenAccept() on the result returned by the second method. For example: messaging.sendMessage("x", "m1", String.class, String.class) .thenAccept(r1 -> { // This will run in the Diffusion input thread, when the result of the first call is received. CompletableFuture<String> cf = messaging.sendMessage("y", r1, String.class, String.class); cf.thenAccept(r2 -> { LOG.info("Result {}", r2); }); });

JavaScript Client: 'UNKNOWN' added to some API enums to allow for future extension (20229)

To improve interoperability between this version of the client and future versions of the server, new "unknown" values have been added to several enumerations. The additions are: an UNKNOWN_TOPIC_TYPE topic type; UNKNOWN_GLOBAL_PERMISSION and UNKNOWN_TOPIC_PERMISSION permission types; and an UNKNOWN_UNSUBSCRIBE_REASON unsubscription reason.

JavaScript Client: Fetch first/last now allows 0 to be specified. (20434)

FetchQuery.first and FetchQuery.last can now accept a 0 value. Fetching zero topics which match a selector can be used to detect the existence of matching topics by using FetchResults.hasMore.

JavaScript Client: New FetchResult.size() and FetchResult.isEmpty() methods (20439)

The convenience methods FetchResult.size() and FetchResult.isEmpty() have been added for easier processing of result sets.

Logging: The server will not start if the ConnectionCount statistics file cannot be created (19943)

The server logs daily connection count statistics to a ConnectionCount file. The file path is determined by the default-log-directory element of the Logs.xml configuration file, evaluated relative to the Diffusion installation directory. In previous releases, if the configured log directory was not writable when the server was started, a temporary directory would be created and a warning logged. From this release, if a writable ConnectionCount file in the configured log directory does not exist and cannot be created, the server will log an error and fail to start.

Logging: Log metrics are now partitioned by code and level (20181)

The server records event counts log messages that have a PUSH-XXXXX message code, grouped by the code. From this release, these metrics are also grouped by the the log level (trace, debug, info, warn, error). Downstream systems which consume these metrics using JMX or Prometheus will need to be updated to account for this change.

Publisher API: The unused HTTPCache interface has been removed (19920)

Since Diffusion 6.1, the HTTPCache interface has not been used. It has been removed from the product in this release.

Publisher API: Per-session throttling has been deprecated (20340)

The methods in com.pushtechnology.diffusion.api.publisher.Client which allow individual client sessions to be throttled have been deprecated, together with the ClientThrottlerType enum, and will be removed in a future release. Applications which need to control the rate of data flow should prefer the per-topic throttling capabilities of topic views. Per-topic throttling has a far lower performance impact and is easier to use than per-session throttling.

Replication: Cluster-aware system authentication and security control APIs (18957)

In previous releases, the system authentication and security APIs would only update the security stores on the server that the client session was attached to. This meant that in a clustered environment, servers would be out of step, unless the same changes were made to each server. From this release, all changes to the system authentication or security stores done via the API will be properly replicated across the cluster, regardless of which server the client session was attached to.

Replication: Hazelcast configuration file now held in the etc directory. (20069)

The hazelcast.xml configuration file for configuring Hazelcast has been moved to the etc directory with the other configuration files. It can still be resolved from the data directory, but a file in etc will take precedence.

Replication: New fallback for failures when compacting the partition log (20112)

When compaction of the partition log fails, a second attempt will now be made using a new compactor, without any state carried over from previous compactions.

Replication: Replication of Configuration Items (20297)

At this release if replication is enabled then changes made to security stores using the client API will automatically be replicated to all members of the cluster. Topic Views and Metric Collectors (both new at this release) will also be replicated across the cluster if either topic or session replication is enabled. It is also possible to replicate such items across a cluster even if neither topic nor session replication is enabled using a new configurationReplication element in the Replication.xml file.

Security: The SSLv2Hello TLS handshake protocol is now disabled by default (20051)

The SSLv2Hello handshake is no longer enabled by default. It can be enabled by using the diffusion.tls.protocols Java system property.

Security: Security store files are now held in the persistence directory (20070)

In previous releases, the security store files (Security.store and SystemAuthentication.store) were held in the 'etc' directory under the Diffusion home directory. From this release, these files are held in the same directory as the persistence log files - by default, in 'persistence' under the Diffusion home directory. The sample files issued in the 'etc' directory are copied to the 'persistence' directory when a server first starts if there are no such files there already, but from then on will be maintained in the 'persistence' directory. Though these files may be manually edited, this is not recommended, especially when using replication (as changes would need to be done on every server in the cluster). The Diffusion API should be used to update these stores.

Server: Improved parsing of session filter expressions (20140)

Session filter expressions can now span multiple lines. Parsing of session filters has been tightened up and and the parser will now reject expressions with additional trailing text.

Server: Topic selector performance improvements (20276)

The runtime performance of split-path pattern topic selectors and selector sets has been improved.

System Monitoring/Statistics: Multiplexer event diagnostic recording (19792)

Diagnostic recording of multiplexer events has been added, to be used at the direction of Push Technology support. Recordings can be controlled per-multiplexer using the startEventDiagnosticRecording() and stopEventDiagnosticRecording() operations of the Multiplexer JMX MBean, or for all multiplexers using the similarly named operations of the MultiplexerManager JMX MBean.

System Monitoring/Statistics: New JMX metrics MBeans (19850)

The JMX interface to metrics has been completely revised. Previously, if the JMX statistic reporter was enabled, metric data was exposed by JMX mbeans below the com.pushtechnology.diffusion.metrics tree, each delivering a single metric value. Statistic reporters, including the JMX statistic reporter, have been removed in this release, so these mbeans are no longer available. In their place, JMX mbeans have been added to the com.pushtechnology.diffusion tree. These are always available, they do not need to be enabled separately. The new mbeans include: a NetworkMetrics mbeans that provides the server network metrics; SessionMetrics mbeans that provide server and per-session metric collector session metrics; TopicMetrics mbeans that provide server and per-topic metric collector topic metrics; LogMetrics mbeans that provide a break down of log events by severity level and code; MetricsCollector mbeans that allow Session and Topic metric collectors to be created, removed, and listed.

System Monitoring/Statistics: Per-publisher metrics have been removed (19926)

Metrics are no longer accumulated on a per-publisher basis. The PublisherStatistics interface and the related methods that were deprecated in 6.1 have been removed. Publisher code can access server-wide statistics using the Publisher.getServerStatistics() method.

System Monitoring/Statistics: Client and topic instance statistics have been replaced by Metric Collectors (20218)

In previous releases, the server could be configured to enable reporting of per-topic and per-client instance metrics. Enabling either had a significant performance impact. Topic and client instance statistics have been removed in this release. The server configuration and Publisher API to enable/disable these features is deprecated and has no effect. Users wishing to monitor a subset of topic or sessions can use the new metric collectors feature. Metric collectors are superior to instance statistics in several ways. The implementation is far more efficient, and production use of metric collectors is encouraged. A richer set of metrics is provided. Metric collectors aggregate the results across a number of instances, identified using a topic selector (for topic metric collectors) or a session filter (for session metric collectors). Metric collectors can be added and removed at anytime using the console or JMX.

System Monitoring/Statistics: Statistics reporters have been removed (20271)

In previous releases, the console dashboard required a topic statistics reporter to be enabled in the server configuration; otherwise, some metric values would not be displayed. From this release, the console communicates with the server using an internal service. The topic statistics reporter has been removed. In previous releases, a JMX statistics reporter could optionally be enabled in the server configuration which would bind server metrics to JMX MBeans. In this release, server metrics have been substantially revised. Server metrics are published via new JMX MBeans which are always enabled. The JMX statistics reporter has been removed. The reporters section of Statistics.xml and the corresponding Publisher API methods are deprecated. If any reporter configuration is found in the configuration, a warning will be logged on start up.

Web Server/HTTP: The REST service has been retired and removed (19894)

Previous releases provided a simple REST service implementation that allowed topic information to be polled over HTTP. The implementation has major functional limitations. It does not provide topic values for any of the supported topic types. It does not handle topic paths containing characters that cannot be used in XML names. Additionally, it has security issues. The topic tree structure could be browsed without authenticating against the server. The query to calculate the response could be expensive, making it a possible vector for a denial of service attack. Given these issues, we have retired the REST service and the associated XMLUtils publisher API class, and both have been removed from the product. If you are upgrading a configuration, remove http-service elements referencing com.pushtechnology.diffusion.service.RESTService class from /etc.WebServer.xml to avoid a warning message when the server starts.

Bugs cleared at release 6.3.0

Android Client: Session properties listeners do not work on Android (20283)

Addresses an issue where session properties listeners failed on particular update events.

Android Client: The authenticator API does not work on Android (20344)

Addresses an issue where the authenticator API would fail when used by the Android client. This case also resolves a similar issue with the setToString utility method.

Apple Client: Primitive value updater raising exception on attempt to update with null value (20169)

Fixes a bug in the update methods on both the PTDiffusionStringValueUpdater and PTDiffusionNumberValueUpdater classes. The API states that the values are nullable (may be provided with nil pointers) but at runtime an exception was being thrown.

C Client: unsubscribe_client function does not invoke callbacks (20037)

Addresses an issue where callback functions supplied to an unsubscribe_client() operation were not called. This has now been fixed.

C Client: Double free possible when removing a value stream with remove_stream() (20092)

Addresses an issue where a double free can occur when removing a value stream.

C Client: Incomplete topic value from topics with compression enabled (20096)

Addresses an issue where topic values received from subscriptions returned incomplete values.

C Client: Invalid raw bytes from diffusion value returned from a fetch request's result (20142)

Addresses an issue where an incorrect raw bytes value (retrieved by calling diffusion_value_get_raw_bytes) is returned from the fetch result to a fetch request

C Client: Invalid delta calculated when updating with topic update streams (20193)

Addresses an issue where subsequent invalid delta updates were calculated when updating with an update stream (after the stream's first update). This has now been resolved.

C Client: Possible crash when subscribing to a topic with REMOVAL topic property (20284)

Addresses an issue where subscribing to a topic created with the REMOVAL topic property set would crash a client application. This has now been resolved.

C Client: Incorrect value returned when NULL is supplied to topic result and fetch result functions (20455)

If a NULL pointer was supplied to topic result and fetch result functions, the correct value was not returned. This has now been resolved.

Client: New user defined properties are not reported to SessionPropertiesListener (19481)

When a session properties listener is notified of an update event, any new session properties added should be represented in the old values map with null values. This was not occurring. This problem has now been resolved.

Console: Timezone when you hover over the clients graph in the console is always GMT (14296)

Area and line charts in the console Overview tab now render time popups in locale sensitive formats.

Console: The button to the console sometimes does not appear (19752)

The "Go To Monitoring Console" button would not appear if the front page was loaded before the console DAR was loaded. This issue is resolved, and the button now appears so long as the console DAR is loaded.

Fan-out: Fanout connections to older servers are not supported (19826)

There was an issue with automatic protocol downgrade, preventing a Diffusion server from establishing a fan-out link to a primary server running an older version. This has been fixed so that the appropriate protocol version is correctly negotiated.

Installation: NullPointerException if multiple products found (19713)

A NullPointerException would occur in the installer if multiple products were found. This has been resolved.

Installation: Installer does not warn about existing license file (19745)

If the Diffusion installer detects a license file in the file system, it will now ask whether to use that license or the default license.

Java & Android Client: The withProperties method of TopicSpecification returns a new specification not based on the current one (20191)

The withProperties method of TopicSpecification should return a new specification based on the current one but with the properties provided. Previously it would return a new specification based on the default specification. The method has been updated to base the new specification on the current specification.

Java Client: Correct IO_EXCEPTION close reason documentation (20426)

The IO_EXCEPTION close reason documentation in ClientControl referred to incorrect information. This was regarding connection closure due to the input buffer limit being exceeded - this has now been corrected.

JavaScript Client: Updater does not implement updateValue (19836)

Updater.updateValue has been implemented.

JavaScript Client: session.select() fails when given a SelectorSet topic selector (19854)

session.select() and other methods taking a string type topic selector will now also accept a TopicSelector.

JavaScript Client: There is no public method to obtain a time series event datatype (19981)

Added DataTypes.timeseries() function to obtain a time series data type.

JavaScript Client: QueryResult.merge throws an error when called (20203)

QueryResult.merge now works as documented.

JavaScript Client: TopicControl.add() function result is not correct (20215)

TopicControl.add() now correctly returns result.added==false when a topic already exists.

Replication: Configured Hazelcast map backup count ignored (19898)

Hazelcast allows the number of backups used by distributed maps to be configured. Diffusion was overriding the configuration with its own settings for the map. This discarded the number of backups. Diffusion now merges its configuration with the configuration discovered by Hazelcast.

Replication: A race condition prevents the removal of a replicated topic (19936)

A race between reading and modifying the children of an array can prevent the removal of replicated topics. The concurrency issue has been corrected.

Replication: PartitionMigrationWatcher NullPointerException when server starts (19986)

In previous releases, a server configured to use topic replication could occasionally fail to start. A NullPointerException originating from the PartitionMigrationWatcher.onNewOwner() method would be logged. The problem has been fixed in this release.

Replication: Wildcard Hazelcast map XML configuration generates invalid configuration (20042)

The use of wildcards to configure maps in the hazelcast.xml could cause clustering to fail. Diffusion modifies the configuration found in the hazelcast.xml to ensure Hazelcast is optimised for Diffusion's use case. Hazelcast uses the same configuration object for all matching wildcard configuration this results in the optimisations being merged, breaking Diffusion. This has been fixed by introducing appropriate deep copies of the configuration to prevent merging optimisations.

Replication: Hazelcast partition log compaction failure (20068)

Hazelcast was failing to compact the partition log during the recover of a partition. The partition log is divided into two parts compacted and uncompacted records. During recovery the uncompacted records are compacted. Compaction was losing track of values associated with previously compacted records. Preventing the uncompacted records being applied. Following the compaction of the log if a delta update had been published and no value update had the next attempt to recover the partition would fail. This was made possible by a recent optimisation to the logging that reduced the circumstances values were logged. Compaction now correctly tracks values of previously compacted records.

Replication: Exception generating peer credentials during shutdown (20099)

Once a local Hazelcast has been shut down, it will throw exceptions if further operations are attempted with it. Additional handling has been added so background operations using Hazelcast do not cause these exceptions during shutdown.

Replication: Value not preserved across multiple remappings (20110)

Errors maybe reported during compaction of the backup partition that indicated a delta had been found with no value or that a delta can't be applied. This caused compaction to fail and the server to shutdown. This problem has now been resolved.

Server: Session queue threshold notifications have been corrected to work with conflation and TIDY_ON_UNSUBSCRIBE (19720)

Due to a bug, threshold notifications could fail to be generated if conflation or TIDY_ON_UNSUBSCRIBE removed multiple messages from a session's queue. The bug has been corrected in this release.

Server: NullPointerException in SessionPropertiesDispatcherImpl - Race condition (20306)

A race condition led to a possible NullPointerException in SessionPropertiesDispatcherImpl being reported on the server. This has now been resolved.

Topics: VALIDATE_VALUES not respected when adding, setting and creating update stream (20210)

The VALIDATE_VALUES topic property was not respected when adding and setting a topic using an update stream. Support for the topic property has been added to this code path.

Topics: The TopicUpdate method createUpdateStream not checking the topic and value types (20211)

The TopicUpdate method createUpdateStream documented that the topic and value types were checked for consistency. This check was not performed. The implementation has been brought inline with the documentation.

Topics: IncompatibleTopicStateException performing allowed replacement using addAndSet (20235)

It should be possible to replace topics recovered from persistence with topics with a different topic specification using the 'TopicUpdate.addAndSet' method and update streams that can create topics. These operations were failing. This has been corrected so topics are replaced as expected.

Topics: Conflation causes loss of time series topic events (20341)

Conflation of time series topics causes subscribers to miss events. This works against the expectation that time series topics should provide the full history of the topic. Conflation will no longer be supported for time series topics. The default conflation policy for time series topics is now 'off'. Attempting to create time series topics with conflation policies of 'conflate' and 'always' will now fail with an invalid specification error. It is still possible to set the conflation policy to 'unsubscribe'.

Topics: Multiple deltas may be composed incorrectly during conflation (20363)

During conflation binary deltas for the same topic may be composed together. This could result in incorrect deltas. These incorrect deltas would then be published to clients. When the clients applied these deltas they might see either an error or corrupted data. The server should now compose deltas correctly.

Topics: Conflation may cause a duplicate value to be published (20393)

Conflation could cause subscribers to see duplicate values. Conflation may replace queued messages with the latest value for the topic. When this happened the server could still queue a message for that topic. This could result in the subscriber receiving a duplicate or corrupt value. The server will now correctly not queue a message after conflating queued messages to the latest value.

Topics: Split path pattern topic selectors with disjunctions and descendant qualifiers are not evaluated correctly (20475)

Due to a bug introduced in Diffusion 6.2.4, split path pattern topic selectors containing disjunctions and descendant qualifiers (e.g. ?x|y//) were not evaluated correctly. The bug has been fixed in this release.

Web Server/HTTP: The web server does not cache large resources correctly (19918)

In previous releases, the web server did not cache large resources correctly (files larger than 1 MiB). This affected the Diffusion console, which would always be downloaded from the server rather than being served from browser cache. The bug has been fixed in this release.

Known Issues

Console: Console shows fractional users connected (20482)

The concurrent clients and client connections graphs on the console can display fractional users.

Publisher API: Rapid adds and deletes of topics can cause TopicTreeListener notifications to arrive out of order (20333)

Under some circumstances, when the same topic is added and removed very rapidly, it is possible for added and removed notifications to be delivered to the TopicTreeListener out of order. For example, several adds could arrive before a remove. Even the very rapid addition and removal of different topics may not notify in the exact order that the requests were made, although this is only likely to cause an issue where processing of branches overlap. Users should be aware of this possibility, but there is no immediate plan to resolve this issue, as the cases where it would have an impact are thought to be extremely rare.

Publisher API: TopicTreeListener notifications incorrect for topic detach/attach operations (20483)

Since release 5.9, unbound topic tree nodes (nodes without topics) can be created by the standard API. When a hierarchic topic A/B/C is created, nodes A and A/B will have no associated topic. For backwards compatibility, when such a topic is created by a publisher, A and A/B will be stateless topics. The Publisher API will see such unbound nodes as if they had a stateless topic, even though there is no usable topic at the node. For consistency, when the standard API adds a topic to an unbound node, the TopicTreeListener is notified of a remove (the notional stateless topic) followed by an add (of the newly attached topic) and when a topic is removed from a node (as opposed to the topic branch being removed) the TopicTreeListener is notified of a remove (the previous topic) followed by an add (of a notional stateless topic). The problem with this is that in both cases the remove notification suggests that the whole branch has been removed when in fact it has not. It would be more correct if the remove was notified on the TopicDeletionListener, but the fact that these are different interfaces makes this impractical. This may be resolved in a future release by rationalizing the notifications into a single notification interface.