1.48.0
Noteworthy Changes
-
ExclusivePublication#revoke
.Release publisher and subscriber resources immediately with exclusive publication revoke. Publication will not linger and not allow any trailing loss to be resolved. Subscription will not wait for any data to be received.
NB: Media driver and client code (publisher and subscriber) must run Aeron 1.48.0 or higher.
For more information see Publication#revoke wiki page.
-
Image#reject
.Reject incoming sessions from a publisher. This allows you to quickly stop data flow in scenarios where the data is no longer needed or is invalid.
For more information see Image#reject wiki page.
-
Track connection status in
AeronCluster
.AeronCluster
now contains a state machine to track connection status. The state machine is updated during poll operations (AeronCluster#pollEgress
andAeronCluster#controlledPollEgress
) and while sending data to the Cluster (i.e.AeronCluster#offer
,AeronCluster#tryClaim
,AeronCluster#sendKeepAlive
). If a break in communication is detected and it lasts for more thanAeronCluster.Context#newLeaderTimeoutNs()
thenAeronCluster
will close itself.NB: When
AeronCluster.Context#newLeaderTimeoutNs()
is not set theAeronCluster
will wait for double the leadership timeout from an actual Cluster. If that is not available (i.e. Cluster is running on an older Aeron version) then it will fallback to a 10 seconds default value, i.e. will wait for 20 seconds.If
AeronCluster#ingressPublication
orAeronCluster#egressSubscription
are used directly then it is a user responsibility to call new APIs in order to update the connection tracking state machine, i.e.:- After each invocation of the
offer
/tryClaim
on theAeronCluster#ingressPublication
a call toAeronCluster#trackIngressPublicationResult
must be made. - Every time
AeronCluster#egressSubscription
is polled a call toAeronCluster#pollStateChanges
must be made.
- After each invocation of the
-
Response channels GA.
Response channels have been promoted from experimental to General Availability. Users no longer need to enable experimental features to use this feature.
-
C & C++ wrapper Archive client APIs GA.
The APIs have been promoted from experimental to General Availability, achieving feature-completeness and parity with Java. Old C++ APIs will be decommissioned in 1.50.0.
-
Per-stream NAK counters.
Two new stream-specific NAK counters where added:snd-naks-received
(typeId=19
) - tracks the number of NAKs received by the sender.rcv-naks-sent
(typeId=20
) - tracks the number of NAKs sent by the receiver.
-
Affinity setting
AERON_DRIVER_ASYNC_EXECUTOR_CPU_AFFINITY
for async thread (aeron_executor
) was removed. -
Retransmit Receiver Window Multiple
To avoid overwhelming receivers in the event of retransmissions, Aeron limits the amount of data sent in a single retransmission to a multiple of the receiver window. Previously, this multiple was 16 for unicast, 16 for min and tagged multicast, and 4 for max multicast. It now defaults to 16 for unicast, 4 for all multicast strategies, and can be configured with the properties
aeron.unicast.flow.control.rrwm
andaeron.multicast.flow.control.rrwm
. -
Linger timeout
There is a new option to control how long untethered subscriptions will linger before being removed from flow control. If the new untethered linger timeout is not set, the default timeout is equal to the untethered window limit timeout. Previously, the untethered linger timeout was always equal to the window limit timeout. Now they can be changed independently. The new property name is
aeron.untethered.linger.timeout
. It can also be set viauntethered-linger-timeout
URI parameter.
Changelog
- [Java] Initialize
archiveId
early using CnC file if Aeron instance is not specified. - [Java] Close extension's Archive client.
- [Java] Close snapshot replication before replay and recording are closed.
- [Java] Adjust archive client name based on the configuration.
- [C] Add client name for the implicit Aeron client created by the Archive client.
- [Java] Name implicit Aeron clients based on their usage.
- [C] Use
untethered-linger-timeout
on the receiver side. - [Java] Store
untethered-linger-timeout
in the log buffer metadata. - [Java] Fix a bug where
untethered-linger-timeout
was not added to the resulting URI. - [Java] Use
untethered-linger-timeout
on the receiver side. - [Java] Use
Publication#revoke
andImage#reject
to closeControlSession
resources. - [Java] Use
Publication#revoke
to abort replay session. - [Java] Don't through an exception when failing to copy a file within the data collector. This breaks other parts of the data collection on test failure (e.g. event log capture).
- [C] Flow control retransmit receiver window multiple for C driver. (#1807)
- [C] C version of untethered linger timeout. (#1808)
- [Java] Require
ArchiveThreadingMode.INVOKER
if MediaDriver is running in the invoker mode. - [Java/C] Per stream NAKs. (#1806)
- [Java] Add separate linger timeout for untethered subscriptions. (#1801)
- [Java/C]
Publication#revoke
. (#1781) - [Java] Make cluster publish leader heartbeat timeout to clients. (#1805)
- [Java] Require Aeron client to run in the invoker mode if MediaDriver is running with
ThreadingMode.INVOKER
, i.e.Aeron.Context.useConductorAgentInvoker(true)
must be set whenAeron.Context.driverAgentInvoker()
is set. - [Java] Add event code type for sequencer.
- [Java/C]
Image#reject
. (#1785) - [Java] Fsync
archive.catalog
file to disc when shutting down Archive. - [C] Align flow control receiver timeout with Java, i.e. use
AERON_FLOW_CONTROL_RECEIVER_TIMEOUT
env variable instead ofAERON_MIN_MULTICAST_FLOW_CONTROL_RECEIVER_TIMEOUT
. - [Java] Remove legacy
aeron.MinMulticastFlowControl.receiverTimeout
config option, i.e. useaeron.flow.control.receiver.timeout
directly. - [C] Remove experimental feature flag for response channels.
- [Java] Remove experimental option for response channels for the response channels.
- [C] MDC short send fix. (#1770)
- [Java] Flow control retransmit receiver window multiple (#1800)
- [Java] Prevent potential silent message loss on cluster ingress/egress.
- [Java] Make AeronCluster track connection status.
- [Java] Create new Ping message for archive client keepalive. (#1799)
- [Java] File page aligned mark files. (#1789)
- [Java] Increment snapshot counter after standby snapshots were successfully replicated.
- [Config] Update code style to reduce use of '.*' imports.
- [Java] Improve storage space exception detection.
- [Java] Properly check for EOS flag. (#1795)
- [C] Fix issue for untethered slow consumers impacting whole server. (#1792)
- [C++ Wrapper] Remove 'experimental' indicator for C/C++ wrapper archive APIs. (#1793)
- [Java] Refactor session liveness check.
- [C] Use
async-executor
name for the async thread, i.e. align with the Java impl. - [Java] Use
async-executor
prefix for async threads. - [Bash] Simplify thread affinity listing.
- [Java] Surface method to describe extension snapshot content in ClusterTool. Support printing snapshot entries as hex dumps.
- [C++] Add
#include <cstdint>
. - [C++ Wrapper] Add missing header. (#1786)
- [C] Remove affinity settings for the async thread (
aeron_executor
). - [Java] Add TestIdleStrategy.
- [Java] Synchronize session ids across cluster nodes. (#1774)
- [CI] Add Clang 20 to the build matrix.
- [C] Call close_session in
archive_close()
. (#1778) - [Java] Added close reason to consensus module extension call back on session close.
- [C] Create log buffers sparse by default.
- [Java] Create log buffers sparse by default.
- [Java] Add context to the disconnected control session warning message, i.e. show the response streamId/channel pair to help identify client that was disconnected.
- [Java] Use separate fragment assemblers for IPC and UDP inputs.
- [C++ Wrapper] Sync
addAliasIfAbsent
method to ChannelUri. (#1755) - [C++ Wrapper] Allow setting the recording events channel. (#1768)
- [Java] Use
MarkFile#timestampRelease
. - [C++ Wrapper] fix uri_buffer length in
Subscription.tryResolveChannelEndpointPort()
. (#1767) - [Java] Don't report error if the publication is closed or not connected during replay.
- [Doc] Document the reserved range for Aeron counter typeIds. (#1771)
- [Java] Update
sub-pos
iff the image was not closed. Otherwise, the JVM might crash withSIGSEGV
while accessing closedPosition
. - [CMake] Only link to client for signal test.
- [C] Add TERM signal handling to C media driver and supporting test.
- [C] Add missing header. (#1765)
- [CI] Enable JDK 24 GA.
- [Java] Do not send termination position to services if there aren't any.
- [Java] Assert that a rejected image will reconnect after a liveness timeout.
- [C++] Use method references instead of capturing lambda to avoid warnings on Windows.
- [C] Align counter API with the Java implementation: - Rename
*volatile
methods to*release
. - Rename all*_ordered
methods to*_release
. - Add missing_plain
methods. - [Client] Append block without modifying the underlying buffer, i.e. copy the entire block without the first header and the copy the header to complete write similar to
io.aeron.logbuffer.TermRebuilder.insert
. - [Java] Simple test fixes. (#1760)
- [Java] Fix mock usage on JDK 21+.
- [C++] More
#include <chrono>
fixes for Windows. - [C++ Wrapper] Include
<chrono>
to fix compilation error on Windows. - [C] Return an actual ref count value after increment/decrement operation completes + rename
aeron_image_refcnt_volatile
toaeron_image_refcnt_acquire
. - [Java] Switched to the new Agrona release functions. (#1748)
- [C] Tidy up image list handling in subscription.
- [C] Close an image when it is being removed from a subscription.
- [C] Call
aeron_subscription_is_connected
to force an image list change number update so that image/log buffers can be freed by the conductor thread. - [C] Use
DeviceIoControl
to create sparse files. - [C] Create files with
FILE_FLAG_POSIX_SEMANTICS
on Windows. - [C] Specify
DELETE
access right when creating files on Windows. - [C++ Wrapper] Handle potential exception from
std::make_shared
. - [C] Use
FILE_ATTRIBUTE_SPARSE_FILE
upon file creation instead of usingDeviceIoControl
. - [C] Use
SHFileOperation
to delete file on Windows. - [C] Use
CreateFile
to open for r/w. - [C] Use
CreateFile
on Windows and enableFILE_SHARE_DELETE
sharing mode to allow file to be deleted even if open mappings exist. - [C++ Wrapper] Remove definitions that shadow
aeron_logbuffer_descriptor.h
definitions. - [C++] Configure ARM support in
Platform.h
. - [C++ Wrapper] Use randomized
aeron.dir
inSystemTestParameterized
. - [C] Use
aeron_format_date
function fromaeron_strutil.h
. - [C++ Wrapper] Decrement ref count of an
Image
after it was created, because it was counted twice: once in the C code when looking theaeron_image_t
and the second time by invokingaeron_subscription_image_retain
inside theImage
constructor. - [C++] Await until
image_available
callback is called. - [PowerShell] CMake installation progress report.
- [PowerShell] Tidy up CMake installation.
- [C] Enable
--sanitise-build
on MacOS. - [Java] Use null values when resetting descriptor.
- [Java] Use correlationId as sessionId.
- [Java] Remove Mockito MockMaker setting from aeron-cluster.
- [Java] Await recently added subscription in StreamStatTest. (#1733)
- [C] Make sure aeron_array_fast_unordered_remove is used correctly (fixes #1728).
- [Java] Change log event for NAK received to use NAK length rather than packet length.
- [C] Fix var-args bug in error reporting.
- [Java] Bump
Agrona
to 2.2.1. - [Java] Bump
SBE
to 1.35.1. - [Java] Bump
Checkstyle
to 10.24.0. - [Java] Bump
Gradle
to 8.14.1. - [Java] Bump
ByteBuddy
to 1.17.5. - [Java] Bump
JUnit
to 5.13.0. - [Java] Bump
Mockito
to 5.18.0. - [Java] Bump
ASM
to 9.8. - [C] Bump
CMake
to 4.0.2.