This version is a minor release and is therefore fully backward-compatible with all 5.x and 4.x versions.
Please refer to the 5.7.0 milestone for details on all issues and PRs that were addressed in this release.
Enhancements
-
This release delivers significant throughput gains across all operations by aligning the client's I/O pipeline with the Java client design. Benchmark results against a 3-node cluster show overall maximum throughput improving from ~40K to ~250K ops/sec: GET throughput up 2.7–4.2× and PUT throughput up 2.9–3.2×, with p99 latency essentially unchanged (a long-standing strength of the C++ client). (#1412)
- Configurable I/O thread count: Network reads and writes were previously serialized through a single I/O thread for all connections. The client now uses a pool of I/O threads, configurable via the new IO_THREAD_COUNT property and defaulting to 3, matching the Java client. (#1410)
- Dedicated response thread pool: Invocation completion is now offloaded from the I/O threads to dedicated ClientResponseHandler threads, configurable via the new RESPONSE_THREAD_COUNT property (default 2), preventing I/O thread stalls. (#1412)
- Lock-free write queue with batch flushing: Per-write dispatch is replaced with a boost::lockfree::queue and scatter-gather async_write, coalescing multiple outbound messages into single system calls. (#1412)
- Global concurrent invocation registry: Correlation ID lookups now use a boost::concurrent_flat_map for O(1) access, replacing the previous per-connection maps. (#1412)
-
Updated the supported Boost versions: the minimum supported version is now 1.83.0, and the client is tested against versions up to 1.91.0. (#1455)
Upgrade note
When upgrading the C++ client, note that this release aligns its compact schema field ordering with the Java client and the server, changing the computed layout for schemas with two or more fixed-size fields of the same size. In a multi-client deployment where such a schema was already registered by an earlier C++ client version, restart the affected processes after upgrading so they pick up the corrected layout. This scenario is extremely rare and no occurrences have been reported.
Fixes
- Fixed compact schema field ordering to match other clients: Resolved an issue where the client ordered same-size fixed-size fields non-deterministically during compact schema creation. This could produce a field layout inconsistent with other clients and the server, breaking cross-language deserialization of the affected compact values. (#1409, #1440)
- Fixed an incorrect cast in the twos_complement logic that could cause an infinite loop. (#1432, #1433)
- Fixed flake_id_generator_impl::new_id() to match Java AutoBatcher semantics, resolving redundant parallel batch fetches, an INT64_MIN leak, wasted batches, and incorrect handling of non-positive batch validity. (#1452, #1454)
- Fixed a std::overflow_error crash in the Flake ID generator on Windows. (#1450, #1451)
- Fixed several Windows build failures with Boost 1.83.0 and OpenSSL 3.x, including a missing NOMINMAX in the Thrift build, an rfc2818_verification failure, and use of the deprecated boost::asio strand::wrap (now replaced with bind_executor). (#1460, #1462, #1464)
- Fixed a build issue by using explicit boost::optional construction for compatibility with Boost 1.91. (#1441)
Installation
See Installing section for installing the library.
Thanks
To community user @miyanyan for contributing Boost 1.91 compatibility fixes.