Release Date: Tuesday, September 28, 2016

THESE RELEASE NOTES ARE PRELIMINARY AND SUBJECT TO CHANGE PRIOR TO FINAL RELEASE.

Release Highlights

  • MAJOR performance improvements in the store replication for both latency and throughput.
  • Support for preserving subscriptions on graceful shutdown.
  • Packing improvements: Introduction of separate native library jars and new nvx-talon-all jar.
  • More improvements to ADM incremental build and error reporting.
  • Under the covers configuration improvements including first round of defining global configuration properties in Constants classes.
  • Preliminary implementation of support for Guaranteed QoS in direct message bus binding.
  • Bug fixes.

 

Compatibility Notes

ADM Compatibility Level: 3.2.0 (see ADM Compatibility Matrix) The Adm Compatibility level last changed in Core X 3.4.68 

(warning) The following issues have compatibility implications:

Change Log

New Feature

XPLATFORM-1221 - Detached Cluster Replication Dispatch

Prior to this release, network read, de-serialization of the packetize form of a store commit entry and dispatch of the deserialized object to the engine multiplexer is done by the network reader thread. This story adds the capability to perform this activity by a dedicated thread. This can considerably improve overall system throughput. The following parameters on the store descriptor control this functionality:

detachedDispatch

  • "true" switched on detached dispatch functionality while "false" disables it. Default
  • default=false

dispatcherQueueDepth

  • Controls the depth of the detached dispatch queue
  • default=1024

dispatcherCpuAffinityMask

  • Specifies the CPU mask to which the dispatcher thread should be affinitized to
  • default=0

dispatcherQueueWaitStrategy

  • Specifies the dispatchers queue wait strategy. Permissible values are
    • Blocking
    • Sleeping
    • Yielding
    • BusySpin
  • default=Blocking

The name of the dispatcher thread is "X-ODS-Native-Dispatcher-<storename>.<membername>

XPLATFORM-1350 - Implement Talon Message Sender

TBD

Improvement

XPLATFORM-667 - Incremental Code Regeneration

The ADM code generator has been enhanced to provide the option of incremental code generation for faster build times. This is the default mode. Source code won't be re-generated on each build unless model XML file or some of its imports changed. Maven plugin(s) can control this through incrementalBuild configuration parameter.

To disable new ADM code generator change detection mechanism, useBasicDeltaDetection configuration parameter can be set to true.

This feature causes some additional metadata to be written to the generated source folder root to track model changes.

XPLATFORM-893 - Non commit-queue playback of large transactions from the transaction log

This release improves playback of large transactions during cluster sync.

XPLATFORM-1223 - General performance improvements in ODS store

This release implements the following performance improvements to the ODS store.

  • Replace the use of read-write locks with lock free concurrency mechanisms.

XPLATFORM-1298 - Improved facilities for detecting "too late" config initialization

This release introduces new diagnostic trace to detect cases where the runtime environment is accessed prior to it being initialized with the full set of platform configuration. This is particularly helpful for customers that use ther own configuration mechanisms to initialize the runtime, because in that scenario it is possible that some platform components may be initialized prior to such configuration being applied.

The new diagnostic options must be enabled with the following properties being set as System properties on the process' command line or as environment variables by replacing the '.' with '_'.

Property Name

Description

nv.env.warnonearlyaccess=true

This property allows tracing of access to the runtime environment before it has been initialized.

When set to true a warning message will be traced to System.err to flag possible premature access to the environment. This is useful in cases where a component is created and sources configuration before the environment has been fully initialized

Property Name: "nv.env.warnonearlyaccess"
Default value: false

nv.env.dumponearlyaccess=true

This property allows dumping a stack trace on access to the runtime environment before it has been initialized.

When set to true a stack dump will be traced to System.err to flag possible premature access to the environment.

Property Name: "nv.env.dumponearlyaccess"
Default value: false

nv.env.warnonreinit=true

This property allows tracing when the runtime environment has been reinitialized.

When set to true a warning message will be traced to System.err to flag possible occurences of the environment being inadvertently reinitialized.

Property Name: "nv.env.warnonreinit"
Default value: false

nv.env.dumponreinit=true

This property allows dumping a stack trace when the runtime environment has been reinitialized.

When set to true a stack dump will be traced to System.err to flag possible occurences of the environment being inadvertently reinitialized.

Property Name: "nv.env.dumponreinit"
Default value: false

For the most up to date usage of these constants:
See also: UtlConstants Javadoc

XPLATFORM-1316 - Enhance UtlTime to support epoch offset timestamps.

This release changes the timestamps returned by UtlTime.now() to represent the number of microseconds since the Epoch (1970-01-01 UTC). This allows such timestamps to be more meaningfully displayed as a date string and allows them to be better compared against System.currentTimeMillis(). As a measure of the number of microseconds from the epoch the timestamp only has millisecond resolution and is based on the resolution supported by System.currentTimeMillis(). The delta timestamp between subsequent calls remains at microsecond level resolution.

Returning epoch relative time is controlled by the property nv.time.useepochoffset=true|false. The property can be set to false to disable epoch based timestamps.
Compatiblity Notes:

 

UtlTime.now() now returns the the microseconds since the Epoch. In prior releases with native time disabled ... the timestamp was returned as System.nanoTime() / 1000. With this change, this will no longer be the case.

XPLATFORM-1348 - AepEngine should emit AepEngineStoppingEvent before engine is stopped

As of this release the AepEngine will not emit an AepEngineStoppingEvent prior to stopping the engine. This adds greater visibility into the engine lifecycle and is also can be used by an application to augment handling of whether channel joins are preserved.

See Also: Aep Engine Lifecycle
Compatiblity Notes:

 

Applications that declare handlers for IAlertEvent or ILifecycleEvent should consider whether additional processing is required for this event.

XPLATFORM-1356 - Enhance AEP Engine to output whether detached pool washing is enabled

Prior to this release, the AEP engine did not output whether detached pool washing is enabled or not in its config trace (i.e. when nv.aep.trace=config). This story adds this additional information to the engine's config trace

XPLATFORM-1357 - Enhance AepEngine config option to provide option to control subscription removal on graceful shutdown.

This release adds a new configuration option to an AepEngine to allow the application to control whether channel joins are preserved on shutdown. The engine's default behavior on graceful shutdown is to "leave" channels meaning underlying subscriptions are removed ... this new configuration property allows this behavior to be changed.

See:

(lightbulb) The behavior set for preserveChannelJoinsOnStop can additionally be overridden at runtime by setting a different value on the AepEngineStoppingEvent (See AepEngineStoppingEvent.html.setPreserveChannelJoins).

XPLATFORM-1367 - Set network link trace level on link descriptor

Prior to this release, a user could only set network link trace level at a global level by using X/SLF4J mechanisms to configure the trace/logging level for the nv.network.link logger. This release adds the ability to set the trace level using the "trace" link descriptor parameter.

For application cluster replication links, this parameter can be included in the <linkParams> element of the application store's <clustering> element in the X DDL configuration file. For example, the following sets an app's cluster replication link's trace level to config.

<storage enabled="true">
    <clustering enabled="true">
        <linkParams>trace=config</linkParams>
     </clustering>
</storage>

XPLATFORM-1368 - Enable network link statistics using link descriptor

Prior to this release, a user could only enable network link statistics trace at a global level by setting the nv.link.network.stats.interval parameter to a positive value (indicating the interval at which link stats are output to the nv.link.network.stats logger). This release adds the ability to enable statistics output and set the statistics output frequency using the "statsinterval" link descriptor parameter. Once enabled, the network link will output statistics to the nv.link.network.stats trace logger.

For application cluster replication links, this parameter can be included in the <linkParams> element of the application store's <clustering> element in the X DDL configuration file. For example, the following enables and sets an app's cluster replication link's statistics output interval to 1 second.

<storage enabled="true">
    <clustering enabled="true">
        <linkParams>statsinterval=1</linkParams>
     </clustering>
</storage>

XPLATFORM-1371 - "warning: dep-ann deprecated item is not annotated with @Deprecated" in ADM generated source

This release improves ADM generated source to include @Deprecated annotation in addition to the the javadoc annotations which avoids compiler warnings.

XPLATFORM-1375 - Direct Binding should populate preWireTs and postWireTs when message latency stats are enabled.

Prior to this release if the direct binding was not configured with stampiots=true in its descriptor preWireTs and postWireTs would not be populated, this release additionally enables wire timestamp capture when nv.msg.latency.stats=true is enabled making allowing the full set of latency statistics to be computed.

XPLATFORM-1376 - Rationalize UnhandleMessageEventHandling in Direct binding

This release enhances the Direct Binding to emit UnhandledMessageEvent to emit UnhandledMessageEvents in the same manner as the platform's other built in bus bindings.

XPLATFORM-1385 - Exception subscribing to solace should show channel name and subscription.

This release improves the Solace binding to append channel and topic name to exceptions related to subscribe and unsubscribe operations to make issue easier to diagnose.

XPLATFORM-1406 - Provide javadoc for com.neeve.util

This release provides javadoc for the com.neeve.util package which contains some utilities that are pertinent to the end user. Not all apis in the util package are intended for use by end users, so users should check the class level javadoc to check if APIs are supported prior to using them.

XPLATFORM-1410 - Separate create and open of a discovery cache

Prior to this release, the act of instantiating a discovery cache automatically opened the cache too. This prevented the use case where a user could create and open a cache and just tap into the event stream to obtain the full, lossless picture of what is happening in the cache. This is because event handlers could only be created after the creation of the cache which was too late since events could start streaming in immediately after create completes. This release provides a mechanism by which the user can decouples the creation and opening of the cache to allow the act of create->addEventHandler->open to get all events happening on the cache without loss

XPLATFORM-1411 - Support entity creation before addition to the discovery cache

Prior to this release, a user of a discovery cache could only get the entity added to the cache after the addition is complete. There are situations where a user would like to know the entity before addition to the cache. To support this requirement, this release implements the create() method that creates a new DiscoveryEntity and a add() that accepts discovery entity for addition. This allows for a user to get a reference to the entity before it is added to the cache

XPLATFORM-1412 - Discontinue support for ODS store auto open

Prior to this release, the ODS store automatically opened the store during creation and provided a flag to override that behavior. This release discontinues support for this flag and, by default, does not open the store during create. This means that direct users of the store API must create the store and then explicitly open it

XPLATFORM-1417 - Enhance discovery cache to return "JVM shutting down" exception when calls made during JVM shutdown

Prior to this release, the discovery cache returned IllegalStateException if a method is invoked on a closed closed cache. During JVM shutdown, it is possible for the JVM shutdown hook thread to close the cache while other threads are concurrently accessing the cache. The other threads do not expect the cache to be closed and so the IllegalStateException results in an ugly stack trace. This occurs particularly in the ODS store when JVM shutdown occurs while store membership changes are in progress. This release adds a new exception to the discovery cache - EDiscoveryJVMShuttingDownException - that the store traps and ignore thus eliminating the stack traces.

XPLATFORM-1430 - Unsubscribing from a loopback bus channel doesn't remove messages.

This release enhanced the loopback bus binding to ensure that message queued for a client are removed when a loopback channel is left and later rejoined. Prior to this release it was possible for messages queued prior to leaving the channel would be redelivered on subsequent rejoin.

XPLATFORM-1432 - Create diagnostic log on transaction log corruption

This release enhances the transaction log to create a diagnostic dump to a temporary file when corruption is detected. This file can be used by Neeve support to diagnose issue related to transaction log corruption.

...Corrupted packet dump written to /temp/PktLogCorruption7801847786289107932.dump
Failed to open '/usr/local/myapp/rdat/myapp': 8
...***** Recovery log 'C:\temp\XPLATFORM-1428\rdat\market.log' is corrupt [com.neeve.pkt.log.EPktLogCorruptException: 8].
...***** ...[preamble=[ver=1 checkpoints=0], recoverableEntries=9909, recoverableLength=4111137]

Note: This dump will be emitted even in cases where transaction log corruption can be repaired by setting repair flag on the transaction log being opened. In many cases such 'corruption' is harmless: there is always the chance that an ungraceful shutdown of an engine will leave partially written records at the end of a transaction log which is not a cause for concern for a properly configured application.

Change

XPLATFORM-1010 - Include object in remove log entries

Prior to this release, the serialized form of the object that was removed from the store was not logged in remove entry in the transaction log (for applications using StateReplication). CDC processors typically need more information, in addition to the object's id, about the object - e.g. it's type - for it to efficiently process the remove. This story adds the object's serialized form in the remove entry in the transaction log and the deserialized form of the object in the remove event dispatched by the store to the application during initialization from the transaction log (for both primary initializing from local transaction log or backup initializing from the primary's transaction log).

XPLATFORM-1433 - Separate nvx native libraries out into a separate jar

This release changes packaging of the platform's native libraries into a separate artifact. This change is intended to make it operation easier for end users that require root privileges for deploy native libraries, and reduces the size of the non native artifacts.

As of this release to use the neeve native libraries the following change should be made in maven builds:

<dependencies>
  <dependency>
      <groupId>com.neeve</groupId>
      <artifactId>nvx-core-all</artifactId>
      <classifier>linux-x86-64</classifier>
  </dependency>  
</dependencies>
<dependencies>
  <dependency>
      <groupId>com.neeve</groupId>
      <artifactId>nvx-core-all</artifactId>
  </dependency>  
  <dependency>
      <groupId>com.neeve</groupId>
      <artifactId>nvx-netive</artifactId>
      <classifier>linux-x86-64</classifier>
  </dependency>  
</dependencies>

Compatiblity Notes:

 

Users that have a dependency on the neeve native libraries must update their builds to declare the nvx-netive dependency and should be aware that nvx-core-all no longer bundles the native libaries.

Bug

XPLATFORM-1194 - Talon XVM (Server) deadlocks when application is concurrently stopped by XVM and user

In X v3.1, if an application is stopped concurrently by the user and the Talon XVM (server) via a command, then the XVM can experience a deadlock between the XVM thread and the application engine thread. This ticket fixes that issue.

XPLATFORM-1216 - Server Pool Stats deadlock

This release fixes the following deadlock that can occur during Talon Server shutdown:

Found one Java-level deadlock:
=============================
"X-Server-s2-Main":
  waiting to lock monitor 0x00007f0178001a98 (object 0x00000000daa0e7e0, a com.neeve.lang.XLinkedHashMap),
  which is held by "X-Server-s1-Main"
"X-Server-s1-Main":
  waiting for ownable synchronizer 0x00000000dd53fef8, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
  which is held by "X-STEMux-robinTest-2"
"X-STEMux-robinTest-2":
  waiting to lock monitor 0x00007f0178001a98 (object 0x00000000daa0e7e0, a com.neeve.lang.XLinkedHashMap),
  which is held by "X-Server-s1-Main"

Java stack information for the threads listed above:
===================================================
"X-Server-s2-Main":
	at com.neeve.server.controller.SrvController$StatsRunner$Pools.onPoolAdded(SrvController.java:1442)
	- waiting to lock <0x00000000daa0e7e0> (a com.neeve.lang.XLinkedHashMap)
	at com.neeve.server.controller.SrvController$StatsRunner.onPoolAdded(SrvController.java:3230)
	at com.neeve.server.controller.SrvController.onPoolAdded(SrvController.java:3673)
	at com.neeve.server.controller.SrvController$PoolWatcher.onPoolAdded(SrvController.java:568)
	at com.neeve.util.UtlPoolRegistry.put(UtlPoolRegistry.java:131)
	at com.neeve.util.UtlPool.<init>(UtlPool.java:818)
	at com.neeve.util.UtlPool.create(UtlPool.java:849)
	at com.neeve.aep.AepEngine$Transaction.<init>(AepEngine.java:1065)
	at com.neeve.aep.AepEngine.<init>(AepEngine.java:3192)
	at com.neeve.aep.AepEngine.create(AepEngine.java:6139)
	at com.neeve.server.app.SrvAppLoader.open(SrvAppLoader.java:1564)
	at com.neeve.server.app.SrvAppManager.loadAppUnprotected(SrvAppManager.java:409)
	at com.neeve.server.app.SrvAppManager.open(SrvAppManager.java:574)
	at com.neeve.server.controller.SrvController.init(SrvController.java:4636)
	at com.neeve.daemon.controller.DmnController.start(DmnController.java:306)
	at com.neeve.robin.test.util.RobinTestServer$1.run(RobinTestServer.java:52)
	at java.lang.Thread.run(Thread.java:662)
"X-Server-s1-Main":
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000dd53fef8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:842)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1178)
	at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:186)
	at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
	at com.neeve.util.UtlPool.acquireLock(UtlPool.java:879)
	at com.neeve.util.UtlPool.size(UtlPool.java:1147)
	at com.neeve.server.controller.SrvController$StatsRunner$Pools$PoolStats.<init>(SrvController.java:1259)
	at com.neeve.server.controller.SrvController$StatsRunner$Pools.onPoolAdded(SrvController.java:1442)
	- locked <0x00000000daa0e7e0> (a com.neeve.lang.XLinkedHashMap)
	at com.neeve.server.controller.SrvController$StatsRunner.onPoolAdded(SrvController.java:3230)
	at com.neeve.server.controller.SrvController$2.apply(SrvController.java:4597)
	at cern.colt.list.ObjectArrayList.forEach(Unknown Source)
	at com.neeve.server.controller.SrvController.init(SrvController.java:4593)
	at com.neeve.daemon.controller.DmnController.start(DmnController.java:306)
	at com.neeve.robin.test.util.RobinTestServer$1.run(RobinTestServer.java:52)
	at java.lang.Thread.run(Thread.java:662)
"X-STEMux-robinTest-2":
	at com.neeve.server.controller.SrvController$StatsRunner$Pools.onPoolRemoved(SrvController.java:1451)
	- waiting to lock <0x00000000daa0e7e0> (a com.neeve.lang.XLinkedHashMap)
	at com.neeve.server.controller.SrvController$StatsRunner.onPoolRemoved(SrvController.java:3237)
	at com.neeve.server.controller.SrvController.onPoolRemoved(SrvController.java:3684)
	at com.neeve.server.controller.SrvController$PoolWatcher.onPoolRemoved(SrvController.java:576)
	at com.neeve.util.UtlPoolRegistry.remove(UtlPoolRegistry.java:215)
	at com.neeve.util.UtlPool.closeUnprotected(UtlPool.java:1053)
	at com.neeve.util.UtlPool.close(UtlPool.java:1231)
	at com.neeve.server.link.SrvLinkSmaMessageBusBinding.doClose(SrvLinkSmaMessageBusBinding.java:696)
	at com.neeve.sma.impl.MessageBusBindingBase.close(MessageBusBindingBase.java:921)
	at com.neeve.aep.AepBusManager.close(AepBusManager.java:1894)
	at com.neeve.aep.AepEngine.stopMessaging(AepEngine.java:4119)
	- locked <0x000000008d7a5c58> (a com.neeve.aep.AepEngine$MessagingStartCompletionNotifier)
	at com.neeve.aep.AepEngine.stopCore(AepEngine.java:8418)
	at com.neeve.aep.AepEngine.onEvent(AepEngine.java:8920)
	at com.neeve.event.EventMultiplexer.dispatchEvent(EventMultiplexer.java:381)
	at com.neeve.event.EventMultiplexerSingleThreaded.dispatch(EventMultiplexerSingleThreaded.java:674)
	at com.neeve.event.EventMultiplexerSingleThreaded.access$1300(EventMultiplexerSingleThreaded.java:51)
	at com.neeve.event.EventMultiplexerSingleThreaded$CarrierEventProcessor.onEvent(EventMultiplexerSingleThreaded.java:522)
	at com.neeve.event.EventMultiplexerSingleThreaded$CarrierEventProcessor.onEvent(EventMultiplexerSingleThreaded.java:515)
	at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:113)
	at java.lang.Thread.run(Thread.java:662)
	at com.neeve.event.EventMultiplexerSingleThreaded$ProcessorThread.run(EventMultiplexerSingleThreaded.java:280)

Found 1 deadlock.

XPLATFORM-1304 - Solace JNI binding msg latency stats are not correct

This change adds preWireTs and postWireTs timestamps to the Solace JCSMP binding and additionally, allows capturing these values in the JNI binding even when nv.time.usenative is disabled. Prior to the latter change the timestamp in the JNI layer would not be in sync with the Java layer leading to skewed timestamps for latency calculations like w2d or s2w.

Note, however, that this comes at the cost of not measuring the time spent in the JNI portion of the binding. To measure the additional JNI binding time one must set nv.time.usenative=false and nv.time.useepochoffset=true so that JNI captured timestamps are in sync with those captured in the Java layer.

XPLATFORM-1369 - Descriptor properties are not applied to the server side of direct bindings

This release resolves a bug in which some binding properties on the server side of a direct binding were being ignored

XPLATFORM-1374 - SrvController.stop() does not block until server has stopped

Prior to this release, there was a bug in the SrvController.stop() method that caused it to not block and wait until the server has shutdown. This release fixes this issue.

XPLATFORM-1381 - Error closing heartbeat log during server shutdown

Prior to this release, the following error was intermittently reported when shutting down a server with heartbeat logging enabled:

<32,5335,Girishs-MacBook-Pro.local> 20160905-09:59:55:910 (wrn)...Error closing heartbeat log: java.lang.RuntimeException: com.neeve.ods.OdsException: com.neeve.pkt.EPktException
	at com.neeve.rog.log.RogLog.flush(RogLog.java:2280)
	at com.neeve.server.controller.SrvController.closeHeartbeatLog(SrvController.java:3635)
	at com.neeve.server.controller.SrvController.doClose(SrvController.java:4756)
	at com.neeve.daemon.controller.DmnController.stop(DmnController.java:554)
	at com.neeve.daemon.controller.DmnController.stop(DmnController.java:588)
	at com.neeve.daemon.controller.DmnController$StopEventHandler.onEvent(DmnController.java:36)
	at com.neeve.emx.nio.EmxNioDispatcher.dispatchReadyEvents(EmxNioDispatcher.java:242)
	at com.neeve.emx.nio.EmxNioDispatcher.run(EmxNioDispatcher.java:1454)
	at com.neeve.daemon.thread.DmnThread.run(DmnThread.java:216)
	at com.neeve.daemon.thread.DmnThreadPool.start(DmnThreadPool.java:253)
	at com.neeve.daemon.thread.DmnThreadManager.start(DmnThreadManager.java:189)
	at com.neeve.daemon.controller.DmnController.start(DmnController.java:404)
	at com.neeve.server.embedded.EmbeddedServer$3.run(EmbeddedServer.java:208)
	at java.lang.Thread.run(Thread.java:695)
Caused by: com.neeve.ods.OdsException: com.neeve.pkt.EPktException
	at com.neeve.rog.log.RogLog.log(RogLog.java:2265)
	at com.neeve.server.controller.SrvController.onHeartbeat(SrvController.java:4561)
	at com.neeve.server.controller.SrvController$StatsRunner.run(SrvController.java:3291)
Caused by: com.neeve.pkt.EPktException
	at com.neeve.pkt.log.PktRecoveryLog.flush(PktRecoveryLog.java:1718)
	at com.neeve.pkt.log.PktRecoveryLog.write(PktRecoveryLog.java:1546)
	at com.neeve.rog.log.RogLog.doWrite(RogLog.java:1631)
	at com.neeve.ods.impl.StorePacketPersisterBase.write(StorePacketPersisterBase.java:427)
	at com.neeve.ods.impl.StorePacketPersisterBase.packetizeAndWrite(StorePacketPersisterBase.java:671)
	at com.neeve.rog.log.RogLog.log(RogLog.java:2249)
	... 2 more
Caused by: java.nio.channels.ClosedByInterruptException
	at java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184)
	at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:233)
	at com.neeve.pkt.log.PktRecoveryLog.flush(PktRecoveryLog.java:1672)
	... 7 more

This release fixes this issue.

XPLATFORM-1407 - Potential for heartbeat corruption when multiple admin clients connect to a Talon server

This release fixes a bug which can result in heartbeats becoming corrupted when multiple admin clients (such as a Robin controller) connect to a Talon Server. This would be likely to occur if one of the clients flow controller the server sending a heartbeat. This would not affect applications that don't use Robin or other administrative tools to connect to Talon Servers.

XPLATFORM-1418 - Duplicate names aren't correctly checked for fields and semantic types

Fixed Code generation/model XML parsing not reporting error if field or semantic type is defined under same name more than once per model.

(warning) The duplicate check can disabled at runtime by setting the system property -Dnv.adm.suppressduplicatechecks=true. This may be desirable when parsing models at runtime that had duplicates field names but were generated before the duplicate check was enforced. 

XPLATFORM-1421 - Disruptor close can hang when called very soon after processor thread is started

Fixes a race condition which can result in a hang during close of disruptors whose processor threads have just been started.

An example trace for such a hang would like:

Thread [main] (Suspended)    
  waiting for: EventMultiplexerSingleThreaded$ProcessorThread  (id=621) 
  Object.wait(long) line: not available [native method]       
  EventMultiplexerSingleThreaded$ProcessorThread(Thread).join(long) line: 1186 
  EventMultiplexerSingleThreaded$ProcessorThread(Thread).join() line: 1239 [local variables unavailable]       
  EventMultiplexerSingleThreaded.doClose() line: 716         
  EventMultiplexerSingleThreaded(EventMultiplexer).close() line: 555