Release Date: Tuesday, November 01, 2016

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

Release Highlights

  • This release provides substantial performance improvements to handling of primitive and enum array fields with Xbuf Encoding.
  • Bug fixes and improvements.

 

Compatibility Notes

ADM Compatibility Level: 3.3.0 (see ADM Compatibility Matrix) This release has increments the minor version of the Adm Compatibility Level - code generated with this release will not be compatible with older versions of the runtime. The Adm Compatibility level last changed in Core X 3.4.68.

(warning) The following issues have compatibility implications:

Change Log

Story

XPLATFORM-1476 - Add o2p message latency statistic for capturing detached send queuing time for outbound messages

This release adds a new 'o2p' message latency stat that captures queuing time for outbound message sent though an engine that uses detached sends. Prior to this release the following outbound stats were captured:

  • c2o: Time from message creation to when the message is offered to the binding for send
  • o2s: The time from when the message was offered to the binding for send until just before serialization of the message starts.

The above statistics did not allow one to separate out the queue time in a bus binding's disruptor when operating detached. Thus to provide better visibility the additional stat 'o2p' has been added which captures the time from when the message was offered to the binding until just before the message is actually picked up for send. 'o2s' now no longer includes the time capture in 'o2p' and now reflects the time that the binding spends in its send code path prior to serialization – which is important because it covers sync (where most of serialization occurs for Xbuf encoded messsages), and also can include things like message key resolution.
Compatibility Notes:

 

This release adds an additional message latency stat o2p which captures the queuing time for messages send through a bus a bus manager set to do detached sends. The time captured in o2p is subtracted from o2s which used to included queuing time, but now no longer does. Tools that display message stats should be modified to inclde o2p since o2s no longer includes it.

New Feature

XPLATFORM-1389 - Add XRuntime sourced AepEngine config values to engine descriptor and DDL

Prior to this release, the following AEP engine configuration parameters could only be set via X runtime environment variables. This release adds these parameters to the engine descriptor and DDL

  • Perform duplicate checking
  • Perform midstream initialization validation
  • Enable sequence number trace
  • Enable event trace
  • Enable transaction trace
  • Enable schedule trace
  • Enable message trace
  • Set whether message trace should be in JSON or not
  • Set JSON message trace style
  • Set message trace metadata display policy
  • Set whether to filter unset fields in message trace
  • Set the maximum number of environment providers
  • Enable send commit completion sequence alerts
  • Capture message type stats
  • Capture transaction latency stats
  • Capture event latency stats
  • Replicate in parallel

See DDL Application Configuration

XPLATFORM-1470 - Add support for Bulk Repeated Field Buffer Copies in Xbuf

This release allows more efficient transfer of repeated primitive fields for Xbuf encoded messages by introducing support of bulk copying of serialized backing bytes when transferring from an inbound message or to application state.

See: Repeated Field Bulk Copies
Compatibility Notes:

 

This change bumps the ADM Compatibility Level from 3.2.0 to 3.4.0 meaning that code generated with this version cannot be used with prior versions of the platform.

Improvement

XPLATFORM-1461 - Add additional EventMultiplexer stats to server heartbeats

This release adds the following additional stats to server heartbeats for an engine's input event multiplexer:

  • scheduleQueueSize: the number of events scheduled and awaiting dispatch
  • maxConcurrency: the maximum number of feeder queues for the multiplexer
  • lastDecongested: the index of the last feeder queue decongested.

See: ISrvMonAppEventMultiplexerStats

XPLATFORM-1472 - Display X License info at Talon Server Startup

This release changes Talon Server startup to display the X License details at launch:

   [License]
     Issued To: Acme Co
     Type: Production
     Expires  : Never

This can be suppressed by launching the server with -Dnv.license.hide=true.

XPLATFORM-1475 - Allow affinitization and naming of Solace reactor threads.

This release provided the ability to affinitize the solace reactor (receiving I/O thread) on the first message receipt. To affinitize the consumer thread specify "consumer_cpu_affinity_mask=n" on the bus binding descriptor url.

In addition, and regardless of whether or not the thread is affinitized, the name of the thread will be suffixed with X-SMA-BusName to make it easier to correlate to a given message bus. If the binding is not configured to use a single session then the thread suffix will additionally include "-IN" or "-OUT" to distinguish between the two sessions.

Change

XPLATFORM-630 - Set message as read only in AEP engine prior to dispatch for Event Sourced engines

Prior to this release, the AEP engine sets messages as read only after return from the message handler. This means that a message can be modified in the event handler. This, in turn, implies that the message replicated to the backup will be different from the one processed by the primary. This is a serious issue since it can cause divergence. The AEP engine was modified in this release to set a message as read only before dispatching the message to the central and message specific handler. This change is for Event Sourcing and State Replication

Bug

XPLATFORM-1067 - Deadlock with store startup and discovery

This release fixes a deadlock that can occur during store startup:

Java stack information for the threads listed above:
===================================================
"X-STEMux-admin-1 (aff=[])":
        at com.neeve.ods.impl.nvx.NvxStoreBinding.onEvent(NvxStoreBinding.java:3662)
        - waiting to lock <0x00000002daddfe60> (a java.lang.Object)
        at com.neeve.discovery.impl.DiscoveryCacheBase.dispatchAddEvent(DiscoveryCacheBase.java:280)
        at com.neeve.discovery.impl.DiscoveryCacheBase.add(DiscoveryCacheBase.java:837)
        - locked <0x00000003205a45c0> (a com.neeve.discovery.impl.mcast.McastDiscoveryCache)
        at com.neeve.server.controller.SrvController.onAppStateChange(SrvController.java:3624)
        at com.neeve.server.controller.SrvController$AppWatcher.onAppActive(SrvController.java:660)
        at com.neeve.server.app.SrvAppLoader$AepEngineWatcher.onEngineActive(SrvAppLoader.java:1071)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at com.neeve.aep.AepEventDispatcher$Handler.dispatch(AepEventDispatcher.java:146)
        at com.neeve.aep.AepEventDispatcher.dispatchToEventHandlers(AepEventDispatcher.java:322)
        at com.neeve.aep.AepEventDispatcher.dispatchToEventHandlers(AepEventDispatcher.java:359)
        at com.neeve.aep.AepEventDispatcher.onEvent(AepEventDispatcher.java:548)
        at com.neeve.aep.AepEngine.dispatchEvent(AepEngine.java:3423)
        at com.neeve.aep.AepEngine.dispatchAndDisposeEvent(AepEngine.java:3435)
        at com.neeve.aep.AepEngine.completeMessagingStartedEventProcessing(AepEngine.java:4523)
        at com.neeve.aep.AepEngine.onMessagingStarted(AepEngine.java:4640)
        - locked <0x00000003271acd88> (a com.neeve.aep.AepEngine$MessagingStartCompletionNotifier)
        at com.neeve.aep.AepEngine.onEvent(AepEngine.java:8546)
        at com.neeve.event.EventMultiplexer.dispatchEvent(EventMultiplexer.java:381)
        at com.neeve.event.EventMultiplexerSingleThreaded.dispatch(EventMultiplexerSingleThreaded.java:675)
        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:745)
        at com.neeve.event.EventMultiplexerSingleThreaded$ProcessorThread.run(EventMultiplexerSingleThreaded.java:280)
"X-Server-ems1-Main":
        at com.neeve.discovery.impl.DiscoveryCacheBase.matches(DiscoveryCacheBase.java:945)
        - waiting to lock <0x00000003205a45c0> (a com.neeve.discovery.impl.mcast.McastDiscoveryCache)
        at com.neeve.ods.impl.nvx.NvxStoreBinding.initMemberTable(NvxStoreBinding.java:424)
        at com.neeve.ods.impl.nvx.NvxStoreBinding.doOpen(NvxStoreBinding.java:2833)
        - locked <0x00000002daddfe60> (a java.lang.Object)
        at com.neeve.ods.impl.nvx.NvxStoreBinding.doOpen(NvxStoreBinding.java:2794)
        at com.neeve.ods.impl.StoreBindingBase.open(StoreBindingBase.java:2956)
        - locked <0x000000036126c9f8> (a java.lang.Object)
        at com.neeve.aep.AepEngine.openStore(AepEngine.java:3748)
        at com.neeve.aep.AepEngine.start(AepEngine.java:6688)
        at com.neeve.server.app.SrvAppLoader$App.start(SrvAppLoader.java:938)
        at com.neeve.server.app.SrvAppLoader.start(SrvAppLoader.java:1639)
        at com.neeve.server.app.SrvAppManager.open(SrvAppManager.java:605)
        at com.neeve.server.controller.SrvController.init(SrvController.java:4476)
        at com.neeve.daemon.controller.DmnController.start(DmnController.java:306)
        at com.neeve.daemon.DmnMain$MainThread.run(DmnMain.java:156)
        at com.neeve.daemon.DmnMain.onStart(DmnMain.java:309)
        at com.neeve.daemon.DmnMain.entryPoint(DmnMain.java:384)
        at com.neeve.server.Main.start(Main.java:54)
        at com.neeve.server.Main.main(Main.java:444)

XPLATFORM-1450 - Protobuf generated messages and entities fail to deserialize when > 64Mb with "Protocol message was too large. May be malicious"

This release fixes the error 'com.google.protobuf.InvalidProtocolBufferException: Protocol message was too large. May be malicious.' when deserializing messages or entities with a serialized length > 64Mb. This fix disables a check in the protoc generated code that is intended to prevent large messages from causing an out of memory errors. This change only affects code generated by ADM with Protobuf encoding and requires code regeneration to pick up the change.
Compatibility Notes:

 

This is a change in the generated code for messages and entities generated with protobuf encoding. To pick up this fix, code must be regenerated.