This is an automated email from the ASF dual-hosted git repository.

szaszm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit 970ff9ba7d54721d44d233599e1db1e86df88c0b
Author: Gabor Gyimesi <[email protected]>
AuthorDate: Tue May 26 16:39:01 2026 +0200

    MINIFICPP-2813 Upgrade thirdparty libraries part 2
    
    - Remove RTIMULib
    - Upgrade AWS SDK to v1.11.807
    - Upgrade openssl lib to v3.6.2
    - Upgrade gcp library to v2.47.1
    - Upgrade libsodium to v1.0.22
    - Upgrade curl to v8.20.0
    - Upgrade spdlog library to v1.17.0
    - Upgrade lixml2 to v2.15.3
    - Upgrade catch2 library to v3.15.0
    - Upgrade azure sdk and wil library to latest version
    - Upgrade asio library to v1.38.0
    - Upgrade libarchive to v3.8.7
    - Upgrade date library to v3.0.4
    - Upgrade RocksDB to v11.1.1
    
    Closes #2179
    
    Signed-off-by: Marton Szasz <[email protected]>
---
 cmake/Asio.cmake                                   |   6 +-
 cmake/AzureSdkCpp.cmake                            |   8 +-
 cmake/BundledAwsSdkCpp.cmake                       |   2 +-
 cmake/BundledLibArchive.cmake                      |   4 +-
 cmake/BundledLibSodium.cmake                       |   8 +-
 cmake/BundledOpenSSL.cmake                         |   6 +-
 cmake/BundledRTIMULib.cmake                        |  51 --
 cmake/BundledRocksDB.cmake                         |  10 +-
 cmake/Catch2.cmake                                 |   4 +-
 cmake/Date.cmake                                   |   8 +-
 cmake/FetchLibcURL.cmake                           |   4 +-
 cmake/GoogleCloudCpp.cmake                         |   4 +-
 cmake/LibXml2.cmake                                |   4 +-
 cmake/Spdlog.cmake                                 |   4 +-
 .../features/containers/azure_server_container.py  |   1 +
 .../rocksdb-repos/database/RocksDbInstance.cpp     |   4 +-
 extensions/rocksdb-repos/tests/RocksDBTests.cpp    |   4 +-
 .../include-cinttypes-for-uint8_t-gcc15-fix.patch  |  10 +
 thirdparty/curl/module-path.patch                  |  13 +-
 thirdparty/libsodium/libsodium.patch               | 213 ++++---
 thirdparty/rocksdb/all/patches/c++23_fixes.patch   | 641 ---------------------
 .../all/patches/dboptions_equality_operator.patch  |   6 +-
 22 files changed, 185 insertions(+), 830 deletions(-)

diff --git a/cmake/Asio.cmake b/cmake/Asio.cmake
index 4c351dc8b..0d03f6e88 100644
--- a/cmake/Asio.cmake
+++ b/cmake/Asio.cmake
@@ -18,15 +18,15 @@
 include(FetchContent)
 
 FetchContent_Declare(asio
-        URL 
https://github.com/chriskohlhoff/asio/archive/refs/tags/asio-1-34-2.tar.gz
-        URL_HASH 
SHA256=f3bac015305fbb700545bd2959fbc52d75a1ec2e05f9c7f695801273ceb78cf5
+        URL 
https://github.com/chriskohlhoff/asio/archive/refs/tags/asio-1-38-0.tar.gz
+        URL_HASH 
SHA256=5cf78ede456fd13b95fe692711f4f689be26c826f1f5541c7a1df3aa32bd9dbd
         SYSTEM)
 
 FetchContent_GetProperties(asio)
 if(NOT asio_POPULATED)
     FetchContent_Populate(asio)
     add_library(asio INTERFACE)
-    target_include_directories(asio SYSTEM INTERFACE 
${asio_SOURCE_DIR}/asio/include)
+    target_include_directories(asio SYSTEM INTERFACE 
${asio_SOURCE_DIR}/include)
     find_package(Threads)
     target_link_libraries(asio INTERFACE Threads::Threads OpenSSL::SSL 
OpenSSL::Crypto)
 endif()
diff --git a/cmake/AzureSdkCpp.cmake b/cmake/AzureSdkCpp.cmake
index d7d616e88..c91026148 100644
--- a/cmake/AzureSdkCpp.cmake
+++ b/cmake/AzureSdkCpp.cmake
@@ -22,8 +22,8 @@ if (WIN32)
 
     FetchContent_Declare(
             wil
-            URL      
https://github.com/microsoft/wil/archive/refs/tags/v1.0.250325.1.tar.gz
-            URL_HASH 
SHA256=c9e667d5f86ded43d17b5669d243e95ca7b437e3a167c170805ffd4aa8a9a786
+            URL      
https://github.com/microsoft/wil/archive/refs/tags/v1.0.260126.7.tar.gz
+            URL_HASH 
SHA256=de9e03b38ff0ff8d22048f00b111cb631d21c550328f12530ccba71c05c9e361
             SYSTEM
     )
     FetchContent_MakeAvailable(wil)
@@ -54,8 +54,8 @@ set(PC ${Bash_EXECUTABLE}  -c "set -x &&\
         (\\\"${Patch_EXECUTABLE}\\\" -p1 -R -s -f --dry-run -i 
\\\"${PATCH_FILE_4}\\\" || \\\"${Patch_EXECUTABLE}\\\" -p1 -N -i 
\\\"${PATCH_FILE_4}\\\")")
 
 FetchContent_Declare(asdkext
-    URL 
https://github.com/Azure/azure-sdk-for-cpp/archive/refs/tags/azure-identity_1.13.0.tar.gz
-    URL_HASH 
"SHA256=a18ce70f8da11266b6a1aec3c02233ca889ea6137471a9f633131f00dfd386c0"
+    URL 
https://github.com/Azure/azure-sdk-for-cpp/archive/refs/tags/azure-storage-queues_12.7.0.tar.gz
+    URL_HASH 
"SHA256=a2d52cf30a36c1000cd6ee87fa60d5e3aa8d5b01a1716e5bc684dd5a507d76d5"
     PATCH_COMMAND "${PC}"
     SYSTEM
 )
diff --git a/cmake/BundledAwsSdkCpp.cmake b/cmake/BundledAwsSdkCpp.cmake
index 1b41cee1e..cdcb613d5 100644
--- a/cmake/BundledAwsSdkCpp.cmake
+++ b/cmake/BundledAwsSdkCpp.cmake
@@ -109,7 +109,7 @@ function(use_bundled_libaws SOURCE_DIR BINARY_DIR)
     ExternalProject_Add(
             aws-sdk-cpp-external
             GIT_REPOSITORY "https://github.com/aws/aws-sdk-cpp.git";
-            GIT_TAG "1.11.771"
+            GIT_TAG "1.11.807"
             UPDATE_COMMAND git submodule update --init --recursive
             SOURCE_DIR "${BINARY_DIR}/thirdparty/aws-sdk-cpp-src"
             INSTALL_DIR "${BINARY_DIR}/thirdparty/libaws-install"
diff --git a/cmake/BundledLibArchive.cmake b/cmake/BundledLibArchive.cmake
index ccaeb6041..ac8919d24 100644
--- a/cmake/BundledLibArchive.cmake
+++ b/cmake/BundledLibArchive.cmake
@@ -68,8 +68,8 @@ function(use_bundled_libarchive SOURCE_DIR BINARY_DIR)
 
     ExternalProject_Add(
             libarchive-external
-            URL 
"https://github.com/libarchive/libarchive/releases/download/v3.8.1/libarchive-3.8.1.tar.gz";
-            URL_HASH 
"SHA256=bde832a5e3344dc723cfe9cc37f8e54bde04565bfe6f136bc1bd31ab352e9fab"
+            URL 
"https://github.com/libarchive/libarchive/archive/refs/tags/v3.8.7.tar.gz";
+            URL_HASH 
"SHA256=bc942030fe7cb30e04eed31bd5f63c38cdfd712315b303e91b64e58f05db2346"
             SOURCE_DIR "${BINARY_DIR}/thirdparty/libarchive-src"
             LIST_SEPARATOR % # This is needed for passing semicolon-separated 
lists
             CMAKE_ARGS ${LIBARCHIVE_CMAKE_ARGS}
diff --git a/cmake/BundledLibSodium.cmake b/cmake/BundledLibSodium.cmake
index 001a90dad..b7678aebf 100644
--- a/cmake/BundledLibSodium.cmake
+++ b/cmake/BundledLibSodium.cmake
@@ -40,10 +40,10 @@ function(use_bundled_libsodium SOURCE_DIR BINARY_DIR)
     endif()
 
     # Build project
-    set(LIBSODIUM_OFFICIAL_MIRROR_URL 
https://download.libsodium.org/libsodium/releases/libsodium-1.0.18.tar.gz)
-    set(LIBSODIUM_GITHUB_MIRROR_URL 
https://github.com/jedisct1/libsodium/releases/download/1.0.18-RELEASE/libsodium-1.0.18.tar.gz)
-    set(LIBSODIUM_GENTOO_MIRROR_URL 
https://gentoo.osuosl.org/distfiles/libsodium-1.0.18.tar.gz)
-    set(LIBSODIUM_URL_HASH 
"SHA256=6f504490b342a4f8a4c4a02fc9b866cbef8622d5df4e5452b46be121e46636c1")
+    set(LIBSODIUM_OFFICIAL_MIRROR_URL 
https://download.libsodium.org/libsodium/releases/libsodium-1.0.22.tar.gz)
+    set(LIBSODIUM_GITHUB_MIRROR_URL 
https://github.com/jedisct1/libsodium/releases/download/1.0.22-RELEASE/libsodium-1.0.22.tar.gz)
+    set(LIBSODIUM_GENTOO_MIRROR_URL 
https://gentoo.osuosl.org/distfiles/libsodium-1.0.22.tar.gz)
+    set(LIBSODIUM_URL_HASH 
"SHA256=adbdd8f16149e81ac6078a03aca6fc03b592b89ef7b5ed83841c086191be3349")
 
     if (WIN32)
         ExternalProject_Add(
diff --git a/cmake/BundledOpenSSL.cmake b/cmake/BundledOpenSSL.cmake
index cc83b5c17..fdc1afc61 100644
--- a/cmake/BundledOpenSSL.cmake
+++ b/cmake/BundledOpenSSL.cmake
@@ -84,7 +84,7 @@ function(use_openssl SOURCE_DIR BINARY_DIR)
             "-DCMAKE_VISIBILITY_INLINES_HIDDEN=ON"
             )
 
-    set(OPENSSL_VERSION "3.3.6" CACHE STRING "" FORCE)
+    set(OPENSSL_VERSION "3.6.2" CACHE STRING "" FORCE)
 
     if (WIN32)
         find_program(JOM_EXECUTABLE_PATH
@@ -104,7 +104,7 @@ function(use_openssl SOURCE_DIR BINARY_DIR)
         ExternalProject_Add(
                 openssl-external
                 URL 
"https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz";
-                URL_HASH 
"SHA256=22db04f3c8f9a808c9795dcf7d2713ff40c12c410ea2d1f6435c6c9c8558958b"
+                URL_HASH 
"SHA256=aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f"
                 SOURCE_DIR "${BINARY_DIR}/thirdparty/openssl-src"
                 BUILD_IN_SOURCE true
                 CONFIGURE_COMMAND perl Configure "CC=${CMAKE_C_COMPILER}" 
"CXX=${CMAKE_CXX_COMPILER}" "CFLAGS=${OPENSSL_C_FLAGS} 
${OPENSSL_WINDOWS_COMPILE_FLAGS}" "CXXFLAGS=${PASSTHROUGH_CMAKE_CXX_FLAGS} 
${OPENSSL_WINDOWS_COMPILE_FLAGS}" ${OPENSSL_SHARED_FLAG} ${OPENSSL_EXTRA_FLAGS} 
"--prefix=${OPENSSL_BIN_DIR}" "--openssldir=${OPENSSL_BIN_DIR}"
@@ -119,7 +119,7 @@ function(use_openssl SOURCE_DIR BINARY_DIR)
         ExternalProject_Add(
                 openssl-external
                 URL 
"https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz";
-                URL_HASH 
"SHA256=22db04f3c8f9a808c9795dcf7d2713ff40c12c410ea2d1f6435c6c9c8558958b"
+                URL_HASH 
"SHA256=aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f"
                 SOURCE_DIR "${BINARY_DIR}/thirdparty/openssl-src"
                 BUILD_IN_SOURCE true
                 CONFIGURE_COMMAND ./Configure "CC=${CMAKE_C_COMPILER}" 
"CXX=${CMAKE_CXX_COMPILER}" "CFLAGS=${OPENSSL_C_FLAGS} -fPIC" 
"CXXFLAGS=${PASSTHROUGH_CMAKE_CXX_FLAGS} -fPIC" ${OPENSSL_SHARED_FLAG} 
${OPENSSL_EXTRA_FLAGS} "--prefix=${OPENSSL_BIN_DIR}" 
"--openssldir=${OPENSSL_BIN_DIR}"
diff --git a/cmake/BundledRTIMULib.cmake b/cmake/BundledRTIMULib.cmake
deleted file mode 100644
index 6b0cdd82b..000000000
--- a/cmake/BundledRTIMULib.cmake
+++ /dev/null
@@ -1,51 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-function(use_bundled_rtimulib SOURCE_DIR BINARY_DIR)
-    # Define byproducts
-    if (WIN32)
-        set(BYPRODUCT "RTIMULib.lib")
-    else()
-        set(BYPRODUCT "libRTIMULib.a")
-    endif()
-
-    # Build project
-    ExternalProject_Add(
-            rtimulib-external
-            SOURCE_DIR "${SOURCE_DIR}/thirdparty/RTIMULib/RTIMULib"
-            BINARY_DIR "${BINARY_DIR}/thirdparty/RTIMULib/RTIMULib"
-            CMAKE_ARGS ${PASSTHROUGH_CMAKE_ARGS}
-            INSTALL_COMMAND ""
-            BUILD_BYPRODUCTS 
"${BINARY_DIR}/thirdparty/RTIMULib/RTIMULib/${BYPRODUCT}"
-            EXCLUDE_FROM_ALL TRUE
-            DOWNLOAD_NO_PROGRESS TRUE
-            TLS_VERIFY TRUE
-    )
-
-    # Set variables
-    set(RTIMULib_FOUND "YES" CACHE STRING "" FORCE)
-    set(RTIMULib_INCLUDE_DIRS "${SOURCE_DIR}/thirdparty/RTIMULib/RTIMULib" 
CACHE STRING "" FORCE)
-    set(RTIMULib_LIBRARY 
"${BINARY_DIR}/thirdparty/RTIMULib/RTIMULib/${BYPRODUCT}" CACHE STRING "" FORCE)
-    set(RTIMULib_LIBRARIES ${RTIMULib_LIBRARY} CACHE STRING "" FORCE)
-
-    # Create imported targets
-    add_library(RTIMULib::RTIMULib STATIC IMPORTED)
-    set_target_properties(RTIMULib::RTIMULib PROPERTIES IMPORTED_LOCATION 
"${RTIMULib_LIBRARY}")
-    add_dependencies(RTIMULib::RTIMULib rtimulib-external)
-    set_property(TARGET RTIMULib::RTIMULib APPEND PROPERTY 
INTERFACE_INCLUDE_DIRECTORIES ${RTIMULib_INCLUDE_DIRS})
-    set_property(TARGET RTIMULib::RTIMULib APPEND PROPERTY 
INTERFACE_LINK_LIBRARIES Threads::Threads)
-endfunction(use_bundled_rtimulib)
diff --git a/cmake/BundledRocksDB.cmake b/cmake/BundledRocksDB.cmake
index 9d1f4644c..9e433643c 100644
--- a/cmake/BundledRocksDB.cmake
+++ b/cmake/BundledRocksDB.cmake
@@ -23,12 +23,10 @@ function(use_bundled_rocksdb SOURCE_DIR BINARY_DIR)
         include(LZ4)
     endif()
 
-    set(PATCH_FILE_1 
"${SOURCE_DIR}/thirdparty/rocksdb/all/patches/dboptions_equality_operator.patch")
-    set(PATCH_FILE_2 
"${SOURCE_DIR}/thirdparty/rocksdb/all/patches/c++23_fixes.patch")
+    set(PATCH_FILE 
"${SOURCE_DIR}/thirdparty/rocksdb/all/patches/dboptions_equality_operator.patch")
 
     set(PC ${Bash_EXECUTABLE} -c "set -x &&\
-            (\"${Patch_EXECUTABLE}\" -p1 -R -s -f --dry-run -i 
\"${PATCH_FILE_1}\" || \"${Patch_EXECUTABLE}\" -p1 -N -i \"${PATCH_FILE_1}\") 
&&\
-            (\"${Patch_EXECUTABLE}\" -p1 -R -s -f --dry-run -i 
\"${PATCH_FILE_2}\" || \"${Patch_EXECUTABLE}\" -p1 -N -i \"${PATCH_FILE_2}\") ")
+            (\"${Patch_EXECUTABLE}\" -p1 -R -s -f --dry-run -i 
\"${PATCH_FILE}\" || \"${Patch_EXECUTABLE}\" -p1 -N -i \"${PATCH_FILE}\") ")
 
 
 # Define byproducts
@@ -71,8 +69,8 @@ function(use_bundled_rocksdb SOURCE_DIR BINARY_DIR)
     # Build project
     ExternalProject_Add(
             rocksdb-external
-            URL 
"https://github.com/facebook/rocksdb/archive/refs/tags/v10.2.1.tar.gz";
-            URL_HASH 
"SHA256=d1ddfd3551e649f7e2d180d5a6a006d90cfde56dcfe1e548c58d95b7f1c87049"
+            URL 
"https://github.com/facebook/rocksdb/archive/refs/tags/v11.1.1.tar.gz";
+            URL_HASH 
"SHA256=63f11183fe40725a0e89a9e392f2c86c94b90064f1d95f5173a02cfe40de13f7"
             SOURCE_DIR "${BINARY_DIR}/thirdparty/rocksdb-src"
             CMAKE_ARGS ${ROCKSDB_CMAKE_ARGS}
             PATCH_COMMAND ${PC}
diff --git a/cmake/Catch2.cmake b/cmake/Catch2.cmake
index 0ff92766f..9f6f242cf 100644
--- a/cmake/Catch2.cmake
+++ b/cmake/Catch2.cmake
@@ -20,8 +20,8 @@ include(FetchContent)
 
 FetchContent_Declare(
         Catch2
-        URL      
https://github.com/catchorg/Catch2/archive/refs/tags/v3.9.1.tar.gz
-        URL_HASH 
SHA256=a215c2a723bd7483efd236dc86066842a389cb4e344c61119c978acdf24d39be
+        URL      
https://github.com/catchorg/Catch2/archive/refs/tags/v3.15.0.tar.gz
+        URL_HASH 
SHA256=9650c55e497759cc39b977e45524bc8acb15256061c112080916ab6cb0b1ea66
         SYSTEM
 )
 FetchContent_MakeAvailable(Catch2)
diff --git a/cmake/Date.cmake b/cmake/Date.cmake
index a3d690e9c..ad0ae665e 100644
--- a/cmake/Date.cmake
+++ b/cmake/Date.cmake
@@ -20,8 +20,8 @@ include(FetchContent)
 if (WIN32)
     # tzdata and windowsZones.xml from unicode cldr-common are required to be 
installed for date-tz operation on Windows
     FetchContent_Declare(tzdata
-        URL         
https://data.iana.org/time-zones/releases/tzdata2020e.tar.gz
-        URL_HASH    
SHA256=0be1ba329eae29ae1b54057c3547b3e672f73b3ae7643aa87dac85122bec037e
+        URL         
https://data.iana.org/time-zones/releases/tzdata2026b.tar.gz
+        URL_HASH    
SHA256=114543d9f19a6bfeb5bca43686aea173d38755a3db1f2eec112647ae92c6f544
         SYSTEM
     )
     FetchContent_GetProperties(tzdata)
@@ -47,8 +47,8 @@ if (WIN32)
 endif()
 
 FetchContent_Declare(date_src
-    URL         
https://github.com/HowardHinnant/date/archive/1ead6715dec030d340a316c927c877a3c4e5a00c.tar.gz
  # master as of 2024-06-28
-    URL_HASH    
SHA256=8b4096b7b49e06d756f4aa0949151863ab7b812679a1646039fab6e821d3c049
+    URL         
https://github.com/HowardHinnant/date/archive/refs/tags/v3.0.4.tar.gz
+    URL_HASH    
SHA256=56e05531ee8994124eeb498d0e6a5e1c3b9d4fccbecdf555fe266631368fb55f
     SYSTEM
 )
 FetchContent_GetProperties(date_src)
diff --git a/cmake/FetchLibcURL.cmake b/cmake/FetchLibcURL.cmake
index 3b3637f3d..0ee08ba79 100644
--- a/cmake/FetchLibcURL.cmake
+++ b/cmake/FetchLibcURL.cmake
@@ -26,8 +26,8 @@ set(PC "${Patch_EXECUTABLE}" -p1 -i "${PATCH_FILE}")
 
 FetchContent_Declare(
         curl
-        URL 
"https://github.com/curl/curl/releases/download/curl-8_19_0/curl-8.19.0.tar.gz";
-        URL_HASH 
"SHA256=2a2c11db4c122691aa23b4363befda1bfd801770bfebf41e1d21cee4f2ab0f71"
+        URL "https://github.com/curl/curl/archive/refs/tags/curl-8_20_0.tar.gz";
+        URL_HASH 
"SHA256=738fe8ae973a6f171b4e7cf7146edd19894e19f09cd45a3b673ebdba3549a435"
         PATCH_COMMAND ${PC}
         SYSTEM
         OVERRIDE_FIND_PACKAGE
diff --git a/cmake/GoogleCloudCpp.cmake b/cmake/GoogleCloudCpp.cmake
index 0d34e7856..4042cb0ae 100644
--- a/cmake/GoogleCloudCpp.cmake
+++ b/cmake/GoogleCloudCpp.cmake
@@ -49,8 +49,8 @@ set(GOOGLE_CLOUD_CPP_ENABLE_MACOS_OPENSSL_CHECK OFF CACHE 
INTERNAL macos-openssl
 set(BUILD_TESTING OFF CACHE INTERNAL testing-off)
 set(GOOGLE_CLOUD_CPP_ENABLE_WERROR OFF CACHE INTERNAL warnings-off)
 FetchContent_Declare(google-cloud-cpp
-        URL      
https://github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.45.0.tar.gz
-        URL_HASH 
SHA256=3d1b5eb696832f9071bf7ef0b3f0c9fd27c1a39d5edcb8a9976c65193319fd01
+        URL      
https://github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.47.1.tar.gz
+        URL_HASH 
SHA256=8863056af88460e449264a976f64a0c9f4f3d98477cdad7770c2dca353fea68c
         PATCH_COMMAND "${PC}"
         SYSTEM)
 if (WIN32)
diff --git a/cmake/LibXml2.cmake b/cmake/LibXml2.cmake
index 0e3f5d017..285f9ca47 100644
--- a/cmake/LibXml2.cmake
+++ b/cmake/LibXml2.cmake
@@ -26,8 +26,8 @@ set(LIBXML2_WITH_ICU OFF CACHE BOOL "" FORCE)
 include(FetchContent)
 FetchContent_Declare(
     libxml2
-    URL https://github.com/GNOME/libxml2/archive/refs/tags/v2.15.0.tar.gz
-    URL_HASH 
SHA256=e24bd5209afefe390e704ebc55649c7ae240e1f157cefd433ccc86c610d20aac
+    URL https://github.com/GNOME/libxml2/archive/refs/tags/v2.15.3.tar.gz
+    URL_HASH 
SHA256=5c6060277173270356c3f1c321a640ab629bdabc5e5ba9095b99e00759ba0c39
     SYSTEM
 )
 FetchContent_MakeAvailable(libxml2)
diff --git a/cmake/Spdlog.cmake b/cmake/Spdlog.cmake
index 6fa371674..f70d47a27 100644
--- a/cmake/Spdlog.cmake
+++ b/cmake/Spdlog.cmake
@@ -22,8 +22,8 @@ set(SPDLOG_FMT_EXTERNAL ON CACHE STRING "" FORCE)
 set(SPDLOG_SYSTEM_INCLUDES ON CACHE STRING "" FORCE)
 
 FetchContent_Declare(Spdlog
-        URL  https://github.com/gabime/spdlog/archive/refs/tags/v1.15.3.tar.gz
-        URL_HASH 
SHA256=15a04e69c222eb6c01094b5c7ff8a249b36bb22788d72519646fb85feb267e67
+        URL  https://github.com/gabime/spdlog/archive/refs/tags/v1.17.0.tar.gz
+        URL_HASH 
SHA256=d8862955c6d74e5846b3f580b1605d2428b11d97a410d86e2fb13e857cd3a744
         OVERRIDE_FIND_PACKAGE
         SYSTEM
         )
diff --git 
a/extensions/azure/tests/features/containers/azure_server_container.py 
b/extensions/azure/tests/features/containers/azure_server_container.py
index 72d7d686b..7d99ae912 100644
--- a/extensions/azure/tests/features/containers/azure_server_container.py
+++ b/extensions/azure/tests/features/containers/azure_server_container.py
@@ -34,6 +34,7 @@ class AzureServerContainer(LinuxContainer):
         azure_storage_hostname = 
f"azure-storage-server-{test_context.scenario_id}"
         self.azure_connection_string = 
"DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;"
 \
                                        
f"BlobEndpoint=http://{azure_storage_hostname}:10000/devstoreaccount1;QueueEndpoint=http://{azure_storage_hostname}:10001/devstoreaccount1;";
+        self.command = ["azurite", "-l", "/data", "--blobHost", "0.0.0.0", 
"--queueHost", "0.0.0.0", "--tableHost", "0.0.0.0", "--skipApiVersionCheck"]
 
     def deploy(self, context: MinifiTestContext | None) -> bool:
         super().deploy(context)
diff --git a/extensions/rocksdb-repos/database/RocksDbInstance.cpp 
b/extensions/rocksdb-repos/database/RocksDbInstance.cpp
index 9601bd46f..3c6de0c03 100644
--- a/extensions/rocksdb-repos/database/RocksDbInstance.cpp
+++ b/extensions/rocksdb-repos/database/RocksDbInstance.cpp
@@ -102,7 +102,7 @@ std::optional<OpenRocksDb> RocksDbInstance::open(const 
std::string& column) {
   if (!impl_) {
     gsl_Expects(columns_.empty());
     // database needs to be (re)opened
-    rocksdb::DB* db_instance = nullptr;
+    std::unique_ptr<rocksdb::DB> db_instance;
     rocksdb::Status result;
 
     std::vector<DBOptionsPatch> dbo_patches;
@@ -202,7 +202,7 @@ std::optional<OpenRocksDb> RocksDbInstance::open(const 
std::string& column) {
     gsl_Expects(db_instance);
     // the patches could have internal resources that we need to keep alive
     // as long as the database is open (e.g. custom environment)
-    impl_ = 
std::make_shared<DbHandle>(std::unique_ptr<rocksdb::DB>(db_instance), 
std::move(dbo_patches));
+    impl_ = std::make_shared<DbHandle>(std::move(db_instance), 
std::move(dbo_patches));
     for (size_t cf_idx{0}; cf_idx < column_handles.size(); ++cf_idx) {
       ColumnFamilyOptionsPatch cfo_patch;
       if (auto it = column_configs_.find(column_handles[cf_idx]->GetName()); 
it != column_configs_.end()) {
diff --git a/extensions/rocksdb-repos/tests/RocksDBTests.cpp 
b/extensions/rocksdb-repos/tests/RocksDBTests.cpp
index 7991e1eef..750bf099f 100644
--- a/extensions/rocksdb-repos/tests/RocksDBTests.cpp
+++ b/extensions/rocksdb-repos/tests/RocksDBTests.cpp
@@ -44,7 +44,7 @@ struct RocksDBTest : TestController {
   }
 
   [[nodiscard]] OpenDatabase openDB(const std::vector<std::string>& cf_names) 
const {
-    rocksdb::DB* db_ptr = nullptr;
+    std::unique_ptr<rocksdb::DB> db_ptr;
     std::vector<rocksdb::ColumnFamilyHandle*> cf_handle_ptrs;
     std::vector<rocksdb::ColumnFamilyDescriptor> cf_descs;
     cf_descs.reserve(cf_names.size());
@@ -57,7 +57,7 @@ struct RocksDBTest : TestController {
     for (auto cf_ptr : cf_handle_ptrs) {
       cf_handles[cf_ptr->GetName()].reset(cf_ptr);
     }
-    return {std::unique_ptr<rocksdb::DB>(db_ptr), std::move(cf_handles)};
+    return {std::move(db_ptr), std::move(cf_handles)};
   }
 
   std::string db_dir;
diff --git 
a/thirdparty/azure-sdk-cpp/include-cinttypes-for-uint8_t-gcc15-fix.patch 
b/thirdparty/azure-sdk-cpp/include-cinttypes-for-uint8_t-gcc15-fix.patch
index a8ec23c1f..851026db6 100644
--- a/thirdparty/azure-sdk-cpp/include-cinttypes-for-uint8_t-gcc15-fix.patch
+++ b/thirdparty/azure-sdk-cpp/include-cinttypes-for-uint8_t-gcc15-fix.patch
@@ -22,3 +22,13 @@ index 9a98f204e..95260d243 100644
 -- 
 2.50.1
 
+--- 
a/sdk/storage/azure-storage-common/inc/azure/storage/common/internal/structured_message_helper.hpp
 2026-05-12 12:38:20.000000000 +0200
++++ 
b/sdk/storage/azure-storage-common/inc/azure/storage/common/internal/structured_message_helper.hpp
 2026-05-19 12:56:55.877826558 +0200
+@@ -7,6 +7,7 @@
+ #include <functional>
+ #include <memory>
+ #include <vector>
++#include <cinttypes>
+
+ namespace Azure { namespace Storage { namespace _internal {
+
diff --git a/thirdparty/curl/module-path.patch 
b/thirdparty/curl/module-path.patch
index f141cc38f..16c6775de 100644
--- a/thirdparty/curl/module-path.patch
+++ b/thirdparty/curl/module-path.patch
@@ -1,11 +1,12 @@
-diff -rupN a/CMakeLists.txt b/CMakeLists.txt
---- a/CMakeLists.txt    2026-01-07 07:57:50.000000000 +0100
-+++ b/CMakeLists.txt    2026-02-06 16:52:59.927109936 +0100
-@@ -45,7 +45,7 @@ if(NOT "$ENV{CURL_BUILDINFO}$ENV{CURL_CI
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 5dd9c7aa70..d92ca3ae78 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -45,7 +45,7 @@ if(NOT "$ENV{CURL_BUILDINFO}$ENV{CURL_CI}$ENV{CI}" STREQUAL 
"")
    endforeach()
  endif()
-
--set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" 
${CMAKE_MODULE_PATH})
+ 
+-list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake")
 +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake")
  include(Utilities)
  include(Macros)
diff --git a/thirdparty/libsodium/libsodium.patch 
b/thirdparty/libsodium/libsodium.patch
index 5ac1b7cac..f0ac78964 100644
--- a/thirdparty/libsodium/libsodium.patch
+++ b/thirdparty/libsodium/libsodium.patch
@@ -2,120 +2,157 @@ We can't run the configure script on Windows, and the only 
thing libsodium provi
 for Windows are msbuild files which do not integrate well into our CMake build 
system,
 so we create a Windows-specific CMakeLists.txt for the project.
 
-diff -rupN original/CMakeLists.txt patched/CMakeLists.txt
---- original/CMakeLists.txt    1970-01-01 01:00:00.000000000 +0100
-+++ patched/CMakeLists.txt     2020-09-24 13:32:12.368714100 +0200
-@@ -0,0 +1,146 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+new file mode 100644
+index 00000000..a59da828
+--- /dev/null
++++ b/CMakeLists.txt
+@@ -0,0 +1,181 @@
 +cmake_minimum_required(VERSION 3.7)
 +
 +project(libsodium)
 +
-+set(SOURCES src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c
-+            
src/libsodium/crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c
-+            
src/libsodium/crypto_aead/xchacha20poly1305/sodium/aead_xchacha20poly1305.c
-+            src/libsodium/crypto_auth/crypto_auth.c
-+            src/libsodium/crypto_auth/hmacsha256/auth_hmacsha256.c
-+            src/libsodium/crypto_auth/hmacsha512/auth_hmacsha512.c
-+            src/libsodium/crypto_auth/hmacsha512256/auth_hmacsha512256.c
++set(SOURCES 
src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-sse41.c
++            src/libsodium/crypto_generichash/blake2b/ref/blake2b-ref.c
++            
src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ssse3.c
++            
src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-avx2.c
++            
src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ref.c
++            src/libsodium/crypto_generichash/blake2b/ref/generichash_blake2b.c
++            src/libsodium/crypto_generichash/blake2b/generichash_blake2.c
++            src/libsodium/crypto_generichash/crypto_generichash.c
++            
src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphashx24_ref.c
++            
src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphash24_ref.c
++            src/libsodium/crypto_shorthash/siphash24/shorthash_siphash24.c
++            src/libsodium/crypto_shorthash/siphash24/shorthash_siphashx24.c
++            src/libsodium/crypto_shorthash/crypto_shorthash.c
++            
src/libsodium/crypto_secretstream/xchacha20poly1305/secretstream_xchacha20poly1305.c
++            src/libsodium/crypto_core/hchacha20/core_hchacha20.c
++            src/libsodium/crypto_core/softaes/softaes.c
++            src/libsodium/crypto_core/hsalsa20/ref2/core_hsalsa20_ref2.c
++            src/libsodium/crypto_core/hsalsa20/core_hsalsa20.c
++            src/libsodium/crypto_core/keccak1600/keccak1600.c
++            src/libsodium/crypto_core/keccak1600/ref/keccak1600_ref.c
++            src/libsodium/crypto_core/keccak1600/armsha3/keccak1600_armsha3.c
++            src/libsodium/crypto_core/salsa/ref/core_salsa_ref.c
++            src/libsodium/crypto_core/ed25519/core_ed25519.c
++            src/libsodium/crypto_core/ed25519/core_ristretto255.c
++            src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c
++            src/libsodium/crypto_aead/chacha20poly1305/aead_chacha20poly1305.c
++            src/libsodium/crypto_aead/aegis128l/aegis128l_aesni.c
++            src/libsodium/crypto_aead/aegis128l/aegis128l_armcrypto.c
++            src/libsodium/crypto_aead/aegis128l/aegis128l_soft.c
++            src/libsodium/crypto_aead/aegis128l/aead_aegis128l.c
++            
src/libsodium/crypto_aead/xchacha20poly1305/aead_xchacha20poly1305.c
++            src/libsodium/crypto_aead/aes256gcm/aead_aes256gcm.c
++            src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c
++            
src/libsodium/crypto_aead/aes256gcm/armcrypto/aead_aes256gcm_armcrypto.c
++            src/libsodium/crypto_aead/aegis256/aead_aegis256.c
++            src/libsodium/crypto_aead/aegis256/aegis256_armcrypto.c
++            src/libsodium/crypto_aead/aegis256/aegis256_aesni.c
++            src/libsodium/crypto_aead/aegis256/aegis256_soft.c
++            src/libsodium/crypto_box/crypto_box_seal.c
 +            src/libsodium/crypto_box/crypto_box.c
 +            src/libsodium/crypto_box/crypto_box_easy.c
-+            src/libsodium/crypto_box/crypto_box_seal.c
 +            
src/libsodium/crypto_box/curve25519xchacha20poly1305/box_curve25519xchacha20poly1305.c
 +            
src/libsodium/crypto_box/curve25519xchacha20poly1305/box_seal_curve25519xchacha20poly1305.c
 +            
src/libsodium/crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305.c
-+            src/libsodium/crypto_core/ed25519/core_ed25519.c
-+            src/libsodium/crypto_core/ed25519/core_ristretto255.c
-+            src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c
-+            src/libsodium/crypto_core/hchacha20/core_hchacha20.c
-+            src/libsodium/crypto_core/hsalsa20/core_hsalsa20.c
-+            src/libsodium/crypto_core/hsalsa20/ref2/core_hsalsa20_ref2.c
-+            src/libsodium/crypto_core/salsa/ref/core_salsa_ref.c
-+            src/libsodium/crypto_generichash/blake2b/generichash_blake2.c
-+            
src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-avx2.c
-+            
src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ref.c
-+            
src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-sse41.c
-+            
src/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ssse3.c
-+            src/libsodium/crypto_generichash/blake2b/ref/blake2b-ref.c
-+            src/libsodium/crypto_generichash/blake2b/ref/generichash_blake2b.c
-+            src/libsodium/crypto_generichash/crypto_generichash.c
-+            src/libsodium/crypto_hash/crypto_hash.c
-+            src/libsodium/crypto_hash/sha256/cp/hash_sha256_cp.c
-+            src/libsodium/crypto_hash/sha256/hash_sha256.c
 +            src/libsodium/crypto_hash/sha512/cp/hash_sha512_cp.c
 +            src/libsodium/crypto_hash/sha512/hash_sha512.c
++            src/libsodium/crypto_hash/crypto_hash.c
++            src/libsodium/crypto_hash/sha256/hash_sha256.c
++            src/libsodium/crypto_hash/sha256/cp/hash_sha256_cp.c
++            src/libsodium/crypto_hash/sha3/hash_sha3.c
++            src/libsodium/crypto_sign/ed25519/ref10/open.c
++            src/libsodium/crypto_sign/ed25519/ref10/sign.c
++            src/libsodium/crypto_sign/ed25519/ref10/obsolete.c
++            src/libsodium/crypto_sign/ed25519/ref10/keypair.c
++            src/libsodium/crypto_sign/ed25519/sign_ed25519.c
++            src/libsodium/crypto_sign/crypto_sign.c
++            src/libsodium/crypto_secretbox/crypto_secretbox_easy.c
++            
src/libsodium/crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305.c
++            
src/libsodium/crypto_secretbox/xchacha20poly1305/secretbox_xchacha20poly1305.c
++            src/libsodium/crypto_secretbox/crypto_secretbox.c
++            src/libsodium/crypto_auth/hmacsha256/auth_hmacsha256.c
++            src/libsodium/crypto_auth/crypto_auth.c
++            src/libsodium/crypto_auth/hmacsha512/auth_hmacsha512.c
++            src/libsodium/crypto_auth/hmacsha512256/auth_hmacsha512256.c
++            src/libsodium/crypto_ipcrypt/crypto_ipcrypt.c
++            src/libsodium/crypto_ipcrypt/ipcrypt_armcrypto.c
++            src/libsodium/crypto_ipcrypt/ipcrypt_aesni.c
++            src/libsodium/crypto_ipcrypt/ipcrypt_soft.c
++            src/libsodium/sodium/version.c
++            src/libsodium/sodium/codecs.c
++            src/libsodium/sodium/core.c
++            src/libsodium/sodium/utils.c
++            src/libsodium/sodium/runtime.c
++            src/libsodium/crypto_kx/crypto_kx.c
++            src/libsodium/crypto_kem/mlkem768/ref/kem_mlkem768_ref.c
++            src/libsodium/crypto_kem/mlkem768/kem_mlkem768.c
++            src/libsodium/crypto_kem/xwing/kem_xwing.c
++            src/libsodium/crypto_kem/crypto_kem.c
 +            src/libsodium/crypto_kdf/blake2b/kdf_blake2b.c
 +            src/libsodium/crypto_kdf/crypto_kdf.c
-+            src/libsodium/crypto_kx/crypto_kx.c
++            src/libsodium/crypto_kdf/hkdf/kdf_hkdf_sha256.c
++            src/libsodium/crypto_kdf/hkdf/kdf_hkdf_sha512.c
++            src/libsodium/crypto_stream/salsa20/ref/salsa20_ref.c
++            src/libsodium/crypto_stream/salsa20/stream_salsa20.c
++            src/libsodium/crypto_stream/salsa20/xmm6/salsa20_xmm6.c
++            src/libsodium/crypto_stream/salsa20/xmm6int/salsa20_xmm6int-avx2.c
++            src/libsodium/crypto_stream/salsa20/xmm6int/salsa20_xmm6int-sse2.c
++            src/libsodium/crypto_stream/salsa208/ref/stream_salsa208_ref.c
++            src/libsodium/crypto_stream/salsa208/stream_salsa208.c
++            src/libsodium/crypto_stream/xchacha20/stream_xchacha20.c
++            src/libsodium/crypto_stream/xsalsa20/stream_xsalsa20.c
++            src/libsodium/crypto_stream/salsa2012/ref/stream_salsa2012_ref.c
++            src/libsodium/crypto_stream/salsa2012/stream_salsa2012.c
++            src/libsodium/crypto_stream/crypto_stream.c
++            
src/libsodium/crypto_stream/chacha20/dolbeau/chacha20_dolbeau-avx2.c
++            
src/libsodium/crypto_stream/chacha20/dolbeau/chacha20_dolbeau-ssse3.c
++            src/libsodium/crypto_stream/chacha20/ref/chacha20_ref.c
++            src/libsodium/crypto_stream/chacha20/stream_chacha20.c
++            src/libsodium/crypto_verify/verify.c
 +            src/libsodium/crypto_onetimeauth/crypto_onetimeauth.c
-+            src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.c
-+            src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.c
 +            src/libsodium/crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c
-+            src/libsodium/crypto_pwhash/argon2/argon2-core.c
-+            src/libsodium/crypto_pwhash/argon2/argon2-encoding.c
++            src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.c
++            src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.c
++            src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c
++            src/libsodium/crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c
++            
src/libsodium/crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c
++            
src/libsodium/crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c
++            
src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c
++            
src/libsodium/crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c
++            src/libsodium/crypto_pwhash/argon2/argon2-fill-block-wasm32.c
 +            src/libsodium/crypto_pwhash/argon2/argon2-fill-block-avx2.c
-+            src/libsodium/crypto_pwhash/argon2/argon2-fill-block-avx512f.c
 +            src/libsodium/crypto_pwhash/argon2/argon2-fill-block-ref.c
-+            src/libsodium/crypto_pwhash/argon2/argon2-fill-block-ssse3.c
++            src/libsodium/crypto_pwhash/argon2/argon2-core.c
++            src/libsodium/crypto_pwhash/argon2/argon2-fill-block-neon.c
 +            src/libsodium/crypto_pwhash/argon2/argon2.c
-+            src/libsodium/crypto_pwhash/argon2/blake2b-long.c
++            src/libsodium/crypto_pwhash/argon2/argon2-fill-block-ssse3.c
++            src/libsodium/crypto_pwhash/argon2/argon2-fill-block-avx512f.c
 +            src/libsodium/crypto_pwhash/argon2/pwhash_argon2i.c
 +            src/libsodium/crypto_pwhash/argon2/pwhash_argon2id.c
++            src/libsodium/crypto_pwhash/argon2/argon2-encoding.c
++            src/libsodium/crypto_pwhash/argon2/blake2b-long.c
 +            src/libsodium/crypto_pwhash/crypto_pwhash.c
-+            
src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c
-+            
src/libsodium/crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c
-+            src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c
-+            
src/libsodium/crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c
-+            src/libsodium/crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c
-+            
src/libsodium/crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c
-+            src/libsodium/crypto_scalarmult/crypto_scalarmult.c
-+            src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.c
++            src/libsodium/crypto_xof/shake256/ref/shake256_ref.c
++            src/libsodium/crypto_xof/shake256/xof_shake256.c
++            src/libsodium/crypto_xof/turboshake256/ref/turboshake256_ref.c
++            src/libsodium/crypto_xof/turboshake256/xof_turboshake256.c
++            src/libsodium/crypto_xof/shake128/ref/shake128_ref.c
++            src/libsodium/crypto_xof/shake128/xof_shake128.c
++            src/libsodium/crypto_xof/turboshake128/ref/turboshake128_ref.c
++            src/libsodium/crypto_xof/turboshake128/xof_turboshake128.c
++            
src/libsodium/crypto_scalarmult/ristretto255/ref10/scalarmult_ristretto255_ref10.c
++            src/libsodium/crypto_scalarmult/curve25519/scalarmult_curve25519.c
 +            
src/libsodium/crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c
-+            src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_invert.c
 +            
src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c
-+            src/libsodium/crypto_scalarmult/curve25519/scalarmult_curve25519.c
++            src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_invert.c
++            src/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.c
 +            
src/libsodium/crypto_scalarmult/ed25519/ref10/scalarmult_ed25519_ref10.c
-+            
src/libsodium/crypto_scalarmult/ristretto255/ref10/scalarmult_ristretto255_ref10.c
-+            src/libsodium/crypto_secretbox/crypto_secretbox.c
-+            src/libsodium/crypto_secretbox/crypto_secretbox_easy.c
-+            
src/libsodium/crypto_secretbox/xchacha20poly1305/secretbox_xchacha20poly1305.c
-+            
src/libsodium/crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305.c
-+            
src/libsodium/crypto_secretstream/xchacha20poly1305/secretstream_xchacha20poly1305.c
-+            src/libsodium/crypto_shorthash/crypto_shorthash.c
-+            
src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphash24_ref.c
-+            
src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphashx24_ref.c
-+            src/libsodium/crypto_shorthash/siphash24/shorthash_siphash24.c
-+            src/libsodium/crypto_shorthash/siphash24/shorthash_siphashx24.c
-+            src/libsodium/crypto_sign/crypto_sign.c
-+            src/libsodium/crypto_sign/ed25519/ref10/keypair.c
-+            src/libsodium/crypto_sign/ed25519/ref10/obsolete.c
-+            src/libsodium/crypto_sign/ed25519/ref10/open.c
-+            src/libsodium/crypto_sign/ed25519/ref10/sign.c
-+            src/libsodium/crypto_sign/ed25519/sign_ed25519.c
-+            
src/libsodium/crypto_stream/chacha20/dolbeau/chacha20_dolbeau-avx2.c
-+            
src/libsodium/crypto_stream/chacha20/dolbeau/chacha20_dolbeau-ssse3.c
-+            src/libsodium/crypto_stream/chacha20/ref/chacha20_ref.c
-+            src/libsodium/crypto_stream/chacha20/stream_chacha20.c
-+            src/libsodium/crypto_stream/crypto_stream.c
-+            src/libsodium/crypto_stream/salsa20/ref/salsa20_ref.c
-+            src/libsodium/crypto_stream/salsa20/stream_salsa20.c
-+            src/libsodium/crypto_stream/salsa20/xmm6/salsa20_xmm6.c
-+            src/libsodium/crypto_stream/salsa20/xmm6int/salsa20_xmm6int-avx2.c
-+            src/libsodium/crypto_stream/salsa20/xmm6int/salsa20_xmm6int-sse2.c
-+            src/libsodium/crypto_stream/salsa2012/ref/stream_salsa2012_ref.c
-+            src/libsodium/crypto_stream/salsa2012/stream_salsa2012.c
-+            src/libsodium/crypto_stream/salsa208/ref/stream_salsa208_ref.c
-+            src/libsodium/crypto_stream/salsa208/stream_salsa208.c
-+            src/libsodium/crypto_stream/xchacha20/stream_xchacha20.c
-+            src/libsodium/crypto_stream/xsalsa20/stream_xsalsa20.c
-+            src/libsodium/crypto_verify/sodium/verify.c
-+            src/libsodium/randombytes/internal/randombytes_internal_random.c
++            src/libsodium/crypto_scalarmult/crypto_scalarmult.c
 +            src/libsodium/randombytes/randombytes.c
 +            src/libsodium/randombytes/sysrandom/randombytes_sysrandom.c
-+            src/libsodium/sodium/codecs.c
-+            src/libsodium/sodium/core.c
-+            src/libsodium/sodium/runtime.c
-+            src/libsodium/sodium/utils.c
-+            src/libsodium/sodium/version.c)
++            src/libsodium/randombytes/internal/randombytes_internal_random.c)
 +
 +if(WIN32)
 +  configure_file(builds/msvc/version.h version.h COPYONLY)
diff --git a/thirdparty/rocksdb/all/patches/c++23_fixes.patch 
b/thirdparty/rocksdb/all/patches/c++23_fixes.patch
deleted file mode 100644
index a3349c8fc..000000000
--- a/thirdparty/rocksdb/all/patches/c++23_fixes.patch
+++ /dev/null
@@ -1,641 +0,0 @@
-Subject: [PATCH] C++23 fixes
----
-Index: table/block_based/block_based_table_builder.cc
-IDEA additional info:
-Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
-<+>UTF-8
-===================================================================
-diff --git a/table/block_based/block_based_table_builder.cc 
b/table/block_based/block_based_table_builder.cc
---- a/table/block_based/block_based_table_builder.cc   (revision 
4b2122578e475cb88aef4dcf152cccd5dbf51060)
-+++ b/table/block_based/block_based_table_builder.cc   (date 1747822597282)
-@@ -268,6 +268,315 @@
-   bool decoupled_partitioned_filters_;
- };
- 
-+struct BlockBasedTableBuilder::ParallelCompressionRep {
-+  // TODO: consider replacing with autovector or similar
-+  // Keys is a wrapper of vector of strings avoiding
-+  // releasing string memories during vector clear()
-+  // in order to save memory allocation overhead
-+  class Keys {
-+   public:
-+    Keys() : keys_(kKeysInitSize), size_(0) {}
-+    void PushBack(const Slice& key) {
-+      if (size_ == keys_.size()) {
-+        keys_.emplace_back(key.data(), key.size());
-+      } else {
-+        keys_[size_].assign(key.data(), key.size());
-+      }
-+      size_++;
-+    }
-+    void SwapAssign(std::vector<std::string>& keys) {
-+      size_ = keys.size();
-+      std::swap(keys_, keys);
-+    }
-+    void Clear() { size_ = 0; }
-+    size_t Size() { return size_; }
-+    std::string& Back() { return keys_[size_ - 1]; }
-+    std::string& operator[](size_t idx) {
-+      assert(idx < size_);
-+      return keys_[idx];
-+    }
-+
-+   private:
-+    const size_t kKeysInitSize = 32;
-+    std::vector<std::string> keys_;
-+    size_t size_;
-+  };
-+  std::unique_ptr<Keys> curr_block_keys;
-+
-+  class BlockRepSlot;
-+
-+  // BlockRep instances are fetched from and recycled to
-+  // block_rep_pool during parallel compression.
-+  struct BlockRep {
-+    Slice contents;
-+    Slice compressed_contents;
-+    std::unique_ptr<std::string> data;
-+    std::unique_ptr<std::string> compressed_data;
-+    CompressionType compression_type;
-+    std::unique_ptr<std::string> first_key_in_next_block;
-+    std::unique_ptr<Keys> keys;
-+    std::unique_ptr<BlockRepSlot> slot;
-+    Status status;
-+  };
-+  // Use a vector of BlockRep as a buffer for a determined number
-+  // of BlockRep structures. All data referenced by pointers in
-+  // BlockRep will be freed when this vector is destructed.
-+  using BlockRepBuffer = std::vector<BlockRep>;
-+  BlockRepBuffer block_rep_buf;
-+  // Use a thread-safe queue for concurrent access from block
-+  // building thread and writer thread.
-+  using BlockRepPool = WorkQueue<BlockRep*>;
-+  BlockRepPool block_rep_pool;
-+
-+  // Use BlockRepSlot to keep block order in write thread.
-+  // slot_ will pass references to BlockRep
-+  class BlockRepSlot {
-+   public:
-+    BlockRepSlot() : slot_(1) {}
-+    template <typename T>
-+    void Fill(T&& rep) {
-+      slot_.push(std::forward<T>(rep));
-+    }
-+    void Take(BlockRep*& rep) { slot_.pop(rep); }
-+
-+   private:
-+    // slot_ will pass references to BlockRep in block_rep_buf,
-+    // and those references are always valid before the destruction of
-+    // block_rep_buf.
-+    WorkQueue<BlockRep*> slot_;
-+  };
-+
-+  // Compression queue will pass references to BlockRep in block_rep_buf,
-+  // and those references are always valid before the destruction of
-+  // block_rep_buf.
-+  using CompressQueue = WorkQueue<BlockRep*>;
-+  CompressQueue compress_queue;
-+  std::vector<port::Thread> compress_thread_pool;
-+
-+  // Write queue will pass references to BlockRep::slot in block_rep_buf,
-+  // and those references are always valid before the corresponding
-+  // BlockRep::slot is destructed, which is before the destruction of
-+  // block_rep_buf.
-+  using WriteQueue = WorkQueue<BlockRepSlot*>;
-+  WriteQueue write_queue;
-+  std::unique_ptr<port::Thread> write_thread;
-+
-+  // Estimate output file size when parallel compression is enabled. This is
-+  // necessary because compression & flush are no longer synchronized,
-+  // and BlockBasedTableBuilder::FileSize() is no longer accurate.
-+  // memory_order_relaxed suffices because accurate statistics is not 
required.
-+  class FileSizeEstimator {
-+   public:
-+    explicit FileSizeEstimator()
-+        : uncomp_bytes_compressed(0),
-+          uncomp_bytes_curr_block(0),
-+          uncomp_bytes_curr_block_set(false),
-+          uncomp_bytes_inflight(0),
-+          blocks_inflight(0),
-+          curr_compression_ratio(0),
-+          estimated_file_size(0) {}
-+
-+    // Estimate file size when a block is about to be emitted to
-+    // compression thread
-+    void EmitBlock(uint64_t uncomp_block_size, uint64_t curr_file_size) {
-+      uint64_t new_uncomp_bytes_inflight =
-+          uncomp_bytes_inflight.fetch_add(uncomp_block_size,
-+                                          std::memory_order_relaxed) +
-+          uncomp_block_size;
-+
-+      uint64_t new_blocks_inflight =
-+          blocks_inflight.fetch_add(1, std::memory_order_relaxed) + 1;
-+
-+      estimated_file_size.store(
-+          curr_file_size +
-+              static_cast<uint64_t>(
-+                  static_cast<double>(new_uncomp_bytes_inflight) *
-+                  curr_compression_ratio.load(std::memory_order_relaxed)) +
-+              new_blocks_inflight * kBlockTrailerSize,
-+          std::memory_order_relaxed);
-+    }
-+
-+    // Estimate file size when a block is already reaped from
-+    // compression thread
-+    void ReapBlock(uint64_t compressed_block_size, uint64_t curr_file_size) {
-+      assert(uncomp_bytes_curr_block_set);
-+
-+      uint64_t new_uncomp_bytes_compressed =
-+          uncomp_bytes_compressed + uncomp_bytes_curr_block;
-+      assert(new_uncomp_bytes_compressed > 0);
-+
-+      curr_compression_ratio.store(
-+          (curr_compression_ratio.load(std::memory_order_relaxed) *
-+               uncomp_bytes_compressed +
-+           compressed_block_size) /
-+              static_cast<double>(new_uncomp_bytes_compressed),
-+          std::memory_order_relaxed);
-+      uncomp_bytes_compressed = new_uncomp_bytes_compressed;
-+
-+      uint64_t new_uncomp_bytes_inflight =
-+          uncomp_bytes_inflight.fetch_sub(uncomp_bytes_curr_block,
-+                                          std::memory_order_relaxed) -
-+          uncomp_bytes_curr_block;
-+
-+      uint64_t new_blocks_inflight =
-+          blocks_inflight.fetch_sub(1, std::memory_order_relaxed) - 1;
-+
-+      estimated_file_size.store(
-+          curr_file_size +
-+              static_cast<uint64_t>(
-+                  static_cast<double>(new_uncomp_bytes_inflight) *
-+                  curr_compression_ratio.load(std::memory_order_relaxed)) +
-+              new_blocks_inflight * kBlockTrailerSize,
-+          std::memory_order_relaxed);
-+
-+      uncomp_bytes_curr_block_set = false;
-+    }
-+
-+    void SetEstimatedFileSize(uint64_t size) {
-+      estimated_file_size.store(size, std::memory_order_relaxed);
-+    }
-+
-+    uint64_t GetEstimatedFileSize() {
-+      return estimated_file_size.load(std::memory_order_relaxed);
-+    }
-+
-+    void SetCurrBlockUncompSize(uint64_t size) {
-+      uncomp_bytes_curr_block = size;
-+      uncomp_bytes_curr_block_set = true;
-+    }
-+
-+   private:
-+    // Input bytes compressed so far.
-+    uint64_t uncomp_bytes_compressed;
-+    // Size of current block being appended.
-+    uint64_t uncomp_bytes_curr_block;
-+    // Whether uncomp_bytes_curr_block has been set for next
-+    // ReapBlock call.
-+    bool uncomp_bytes_curr_block_set;
-+    // Input bytes under compression and not appended yet.
-+    std::atomic<uint64_t> uncomp_bytes_inflight;
-+    // Number of blocks under compression and not appended yet.
-+    std::atomic<uint64_t> blocks_inflight;
-+    // Current compression ratio, maintained by 
BGWorkWriteMaybeCompressedBlock.
-+    std::atomic<double> curr_compression_ratio;
-+    // Estimated SST file size.
-+    std::atomic<uint64_t> estimated_file_size;
-+  };
-+  FileSizeEstimator file_size_estimator;
-+
-+  // Facilities used for waiting first block completion. Need to Wait for
-+  // the completion of first block compression and flush to get a non-zero
-+  // compression ratio.
-+  std::atomic<bool> first_block_processed;
-+  std::condition_variable first_block_cond;
-+  std::mutex first_block_mutex;
-+
-+  explicit ParallelCompressionRep(uint32_t parallel_threads)
-+      : curr_block_keys(new Keys()),
-+        block_rep_buf(parallel_threads),
-+        block_rep_pool(parallel_threads),
-+        compress_queue(parallel_threads),
-+        write_queue(parallel_threads),
-+        first_block_processed(false) {
-+    for (uint32_t i = 0; i < parallel_threads; i++) {
-+      block_rep_buf[i].contents = Slice();
-+      block_rep_buf[i].compressed_contents = Slice();
-+      block_rep_buf[i].data.reset(new std::string());
-+      block_rep_buf[i].compressed_data.reset(new std::string());
-+      block_rep_buf[i].compression_type = CompressionType();
-+      block_rep_buf[i].first_key_in_next_block.reset(new std::string());
-+      block_rep_buf[i].keys.reset(new Keys());
-+      block_rep_buf[i].slot.reset(new BlockRepSlot());
-+      block_rep_buf[i].status = Status::OK();
-+      block_rep_pool.push(&block_rep_buf[i]);
-+    }
-+  }
-+
-+  ~ParallelCompressionRep() { block_rep_pool.finish(); }
-+
-+  // Make a block prepared to be emitted to compression thread
-+  // Used in non-buffered mode
-+  BlockRep* PrepareBlock(CompressionType compression_type,
-+                         const Slice* first_key_in_next_block,
-+                         BlockBuilder* data_block) {
-+    BlockRep* block_rep =
-+        PrepareBlockInternal(compression_type, first_key_in_next_block);
-+    assert(block_rep != nullptr);
-+    data_block->SwapAndReset(*(block_rep->data));
-+    block_rep->contents = *(block_rep->data);
-+    std::swap(block_rep->keys, curr_block_keys);
-+    curr_block_keys->Clear();
-+    return block_rep;
-+  }
-+
-+  // Used in EnterUnbuffered
-+  BlockRep* PrepareBlock(CompressionType compression_type,
-+                         const Slice* first_key_in_next_block,
-+                         std::string* data_block,
-+                         std::vector<std::string>* keys) {
-+    BlockRep* block_rep =
-+        PrepareBlockInternal(compression_type, first_key_in_next_block);
-+    assert(block_rep != nullptr);
-+    std::swap(*(block_rep->data), *data_block);
-+    block_rep->contents = *(block_rep->data);
-+    block_rep->keys->SwapAssign(*keys);
-+    return block_rep;
-+  }
-+
-+  // Emit a block to compression thread
-+  void EmitBlock(BlockRep* block_rep) {
-+    assert(block_rep != nullptr);
-+    assert(block_rep->status.ok());
-+    if (!write_queue.push(block_rep->slot.get())) {
-+      return;
-+    }
-+    if (!compress_queue.push(block_rep)) {
-+      return;
-+    }
-+
-+    if (!first_block_processed.load(std::memory_order_relaxed)) {
-+      std::unique_lock<std::mutex> lock(first_block_mutex);
-+      first_block_cond.wait(lock, [this] {
-+        return first_block_processed.load(std::memory_order_relaxed);
-+      });
-+    }
-+  }
-+
-+  // Reap a block from compression thread
-+  void ReapBlock(BlockRep* block_rep) {
-+    assert(block_rep != nullptr);
-+    block_rep->compressed_data->clear();
-+    block_rep_pool.push(block_rep);
-+
-+    if (!first_block_processed.load(std::memory_order_relaxed)) {
-+      std::lock_guard<std::mutex> lock(first_block_mutex);
-+      first_block_processed.store(true, std::memory_order_relaxed);
-+      first_block_cond.notify_one();
-+    }
-+  }
-+
-+ private:
-+  BlockRep* PrepareBlockInternal(CompressionType compression_type,
-+                                 const Slice* first_key_in_next_block) {
-+    BlockRep* block_rep = nullptr;
-+    block_rep_pool.pop(block_rep);
-+    assert(block_rep != nullptr);
-+
-+    assert(block_rep->data);
-+
-+    block_rep->compression_type = compression_type;
-+
-+    if (first_key_in_next_block == nullptr) {
-+      block_rep->first_key_in_next_block.reset(nullptr);
-+    } else {
-+      block_rep->first_key_in_next_block->assign(
-+          first_key_in_next_block->data(), first_key_in_next_block->size());
-+    }
-+
-+    return block_rep;
-+  }
-+};
-+
- struct BlockBasedTableBuilder::Rep {
-   const ImmutableOptions ioptions;
-   // BEGIN from MutableCFOptions
-@@ -667,314 +976,6 @@
-   IOStatus io_status;
- };
- 
--struct BlockBasedTableBuilder::ParallelCompressionRep {
--  // TODO: consider replacing with autovector or similar
--  // Keys is a wrapper of vector of strings avoiding
--  // releasing string memories during vector clear()
--  // in order to save memory allocation overhead
--  class Keys {
--   public:
--    Keys() : keys_(kKeysInitSize), size_(0) {}
--    void PushBack(const Slice& key) {
--      if (size_ == keys_.size()) {
--        keys_.emplace_back(key.data(), key.size());
--      } else {
--        keys_[size_].assign(key.data(), key.size());
--      }
--      size_++;
--    }
--    void SwapAssign(std::vector<std::string>& keys) {
--      size_ = keys.size();
--      std::swap(keys_, keys);
--    }
--    void Clear() { size_ = 0; }
--    size_t Size() { return size_; }
--    std::string& Back() { return keys_[size_ - 1]; }
--    std::string& operator[](size_t idx) {
--      assert(idx < size_);
--      return keys_[idx];
--    }
--
--   private:
--    const size_t kKeysInitSize = 32;
--    std::vector<std::string> keys_;
--    size_t size_;
--  };
--  std::unique_ptr<Keys> curr_block_keys;
--
--  class BlockRepSlot;
--
--  // BlockRep instances are fetched from and recycled to
--  // block_rep_pool during parallel compression.
--  struct BlockRep {
--    Slice contents;
--    Slice compressed_contents;
--    std::unique_ptr<std::string> data;
--    std::unique_ptr<std::string> compressed_data;
--    CompressionType compression_type;
--    std::unique_ptr<std::string> first_key_in_next_block;
--    std::unique_ptr<Keys> keys;
--    std::unique_ptr<BlockRepSlot> slot;
--    Status status;
--  };
--  // Use a vector of BlockRep as a buffer for a determined number
--  // of BlockRep structures. All data referenced by pointers in
--  // BlockRep will be freed when this vector is destructed.
--  using BlockRepBuffer = std::vector<BlockRep>;
--  BlockRepBuffer block_rep_buf;
--  // Use a thread-safe queue for concurrent access from block
--  // building thread and writer thread.
--  using BlockRepPool = WorkQueue<BlockRep*>;
--  BlockRepPool block_rep_pool;
--
--  // Use BlockRepSlot to keep block order in write thread.
--  // slot_ will pass references to BlockRep
--  class BlockRepSlot {
--   public:
--    BlockRepSlot() : slot_(1) {}
--    template <typename T>
--    void Fill(T&& rep) {
--      slot_.push(std::forward<T>(rep));
--    }
--    void Take(BlockRep*& rep) { slot_.pop(rep); }
--
--   private:
--    // slot_ will pass references to BlockRep in block_rep_buf,
--    // and those references are always valid before the destruction of
--    // block_rep_buf.
--    WorkQueue<BlockRep*> slot_;
--  };
--
--  // Compression queue will pass references to BlockRep in block_rep_buf,
--  // and those references are always valid before the destruction of
--  // block_rep_buf.
--  using CompressQueue = WorkQueue<BlockRep*>;
--  CompressQueue compress_queue;
--  std::vector<port::Thread> compress_thread_pool;
--
--  // Write queue will pass references to BlockRep::slot in block_rep_buf,
--  // and those references are always valid before the corresponding
--  // BlockRep::slot is destructed, which is before the destruction of
--  // block_rep_buf.
--  using WriteQueue = WorkQueue<BlockRepSlot*>;
--  WriteQueue write_queue;
--  std::unique_ptr<port::Thread> write_thread;
--
--  // Estimate output file size when parallel compression is enabled. This is
--  // necessary because compression & flush are no longer synchronized,
--  // and BlockBasedTableBuilder::FileSize() is no longer accurate.
--  // memory_order_relaxed suffices because accurate statistics is not 
required.
--  class FileSizeEstimator {
--   public:
--    explicit FileSizeEstimator()
--        : uncomp_bytes_compressed(0),
--          uncomp_bytes_curr_block(0),
--          uncomp_bytes_curr_block_set(false),
--          uncomp_bytes_inflight(0),
--          blocks_inflight(0),
--          curr_compression_ratio(0),
--          estimated_file_size(0) {}
--
--    // Estimate file size when a block is about to be emitted to
--    // compression thread
--    void EmitBlock(uint64_t uncomp_block_size, uint64_t curr_file_size) {
--      uint64_t new_uncomp_bytes_inflight =
--          uncomp_bytes_inflight.fetch_add(uncomp_block_size,
--                                          std::memory_order_relaxed) +
--          uncomp_block_size;
--
--      uint64_t new_blocks_inflight =
--          blocks_inflight.fetch_add(1, std::memory_order_relaxed) + 1;
--
--      estimated_file_size.store(
--          curr_file_size +
--              static_cast<uint64_t>(
--                  static_cast<double>(new_uncomp_bytes_inflight) *
--                  curr_compression_ratio.load(std::memory_order_relaxed)) +
--              new_blocks_inflight * kBlockTrailerSize,
--          std::memory_order_relaxed);
--    }
--
--    // Estimate file size when a block is already reaped from
--    // compression thread
--    void ReapBlock(uint64_t compressed_block_size, uint64_t curr_file_size) {
--      assert(uncomp_bytes_curr_block_set);
--
--      uint64_t new_uncomp_bytes_compressed =
--          uncomp_bytes_compressed + uncomp_bytes_curr_block;
--      assert(new_uncomp_bytes_compressed > 0);
--
--      curr_compression_ratio.store(
--          (curr_compression_ratio.load(std::memory_order_relaxed) *
--               uncomp_bytes_compressed +
--           compressed_block_size) /
--              static_cast<double>(new_uncomp_bytes_compressed),
--          std::memory_order_relaxed);
--      uncomp_bytes_compressed = new_uncomp_bytes_compressed;
--
--      uint64_t new_uncomp_bytes_inflight =
--          uncomp_bytes_inflight.fetch_sub(uncomp_bytes_curr_block,
--                                          std::memory_order_relaxed) -
--          uncomp_bytes_curr_block;
--
--      uint64_t new_blocks_inflight =
--          blocks_inflight.fetch_sub(1, std::memory_order_relaxed) - 1;
--
--      estimated_file_size.store(
--          curr_file_size +
--              static_cast<uint64_t>(
--                  static_cast<double>(new_uncomp_bytes_inflight) *
--                  curr_compression_ratio.load(std::memory_order_relaxed)) +
--              new_blocks_inflight * kBlockTrailerSize,
--          std::memory_order_relaxed);
--
--      uncomp_bytes_curr_block_set = false;
--    }
--
--    void SetEstimatedFileSize(uint64_t size) {
--      estimated_file_size.store(size, std::memory_order_relaxed);
--    }
--
--    uint64_t GetEstimatedFileSize() {
--      return estimated_file_size.load(std::memory_order_relaxed);
--    }
--
--    void SetCurrBlockUncompSize(uint64_t size) {
--      uncomp_bytes_curr_block = size;
--      uncomp_bytes_curr_block_set = true;
--    }
--
--   private:
--    // Input bytes compressed so far.
--    uint64_t uncomp_bytes_compressed;
--    // Size of current block being appended.
--    uint64_t uncomp_bytes_curr_block;
--    // Whether uncomp_bytes_curr_block has been set for next
--    // ReapBlock call.
--    bool uncomp_bytes_curr_block_set;
--    // Input bytes under compression and not appended yet.
--    std::atomic<uint64_t> uncomp_bytes_inflight;
--    // Number of blocks under compression and not appended yet.
--    std::atomic<uint64_t> blocks_inflight;
--    // Current compression ratio, maintained by 
BGWorkWriteMaybeCompressedBlock.
--    std::atomic<double> curr_compression_ratio;
--    // Estimated SST file size.
--    std::atomic<uint64_t> estimated_file_size;
--  };
--  FileSizeEstimator file_size_estimator;
--
--  // Facilities used for waiting first block completion. Need to Wait for
--  // the completion of first block compression and flush to get a non-zero
--  // compression ratio.
--  std::atomic<bool> first_block_processed;
--  std::condition_variable first_block_cond;
--  std::mutex first_block_mutex;
--
--  explicit ParallelCompressionRep(uint32_t parallel_threads)
--      : curr_block_keys(new Keys()),
--        block_rep_buf(parallel_threads),
--        block_rep_pool(parallel_threads),
--        compress_queue(parallel_threads),
--        write_queue(parallel_threads),
--        first_block_processed(false) {
--    for (uint32_t i = 0; i < parallel_threads; i++) {
--      block_rep_buf[i].contents = Slice();
--      block_rep_buf[i].compressed_contents = Slice();
--      block_rep_buf[i].data.reset(new std::string());
--      block_rep_buf[i].compressed_data.reset(new std::string());
--      block_rep_buf[i].compression_type = CompressionType();
--      block_rep_buf[i].first_key_in_next_block.reset(new std::string());
--      block_rep_buf[i].keys.reset(new Keys());
--      block_rep_buf[i].slot.reset(new BlockRepSlot());
--      block_rep_buf[i].status = Status::OK();
--      block_rep_pool.push(&block_rep_buf[i]);
--    }
--  }
--
--  ~ParallelCompressionRep() { block_rep_pool.finish(); }
--
--  // Make a block prepared to be emitted to compression thread
--  // Used in non-buffered mode
--  BlockRep* PrepareBlock(CompressionType compression_type,
--                         const Slice* first_key_in_next_block,
--                         BlockBuilder* data_block) {
--    BlockRep* block_rep =
--        PrepareBlockInternal(compression_type, first_key_in_next_block);
--    assert(block_rep != nullptr);
--    data_block->SwapAndReset(*(block_rep->data));
--    block_rep->contents = *(block_rep->data);
--    std::swap(block_rep->keys, curr_block_keys);
--    curr_block_keys->Clear();
--    return block_rep;
--  }
--
--  // Used in EnterUnbuffered
--  BlockRep* PrepareBlock(CompressionType compression_type,
--                         const Slice* first_key_in_next_block,
--                         std::string* data_block,
--                         std::vector<std::string>* keys) {
--    BlockRep* block_rep =
--        PrepareBlockInternal(compression_type, first_key_in_next_block);
--    assert(block_rep != nullptr);
--    std::swap(*(block_rep->data), *data_block);
--    block_rep->contents = *(block_rep->data);
--    block_rep->keys->SwapAssign(*keys);
--    return block_rep;
--  }
--
--  // Emit a block to compression thread
--  void EmitBlock(BlockRep* block_rep) {
--    assert(block_rep != nullptr);
--    assert(block_rep->status.ok());
--    if (!write_queue.push(block_rep->slot.get())) {
--      return;
--    }
--    if (!compress_queue.push(block_rep)) {
--      return;
--    }
--
--    if (!first_block_processed.load(std::memory_order_relaxed)) {
--      std::unique_lock<std::mutex> lock(first_block_mutex);
--      first_block_cond.wait(lock, [this] {
--        return first_block_processed.load(std::memory_order_relaxed);
--      });
--    }
--  }
--
--  // Reap a block from compression thread
--  void ReapBlock(BlockRep* block_rep) {
--    assert(block_rep != nullptr);
--    block_rep->compressed_data->clear();
--    block_rep_pool.push(block_rep);
--
--    if (!first_block_processed.load(std::memory_order_relaxed)) {
--      std::lock_guard<std::mutex> lock(first_block_mutex);
--      first_block_processed.store(true, std::memory_order_relaxed);
--      first_block_cond.notify_one();
--    }
--  }
--
-- private:
--  BlockRep* PrepareBlockInternal(CompressionType compression_type,
--                                 const Slice* first_key_in_next_block) {
--    BlockRep* block_rep = nullptr;
--    block_rep_pool.pop(block_rep);
--    assert(block_rep != nullptr);
--
--    assert(block_rep->data);
--
--    block_rep->compression_type = compression_type;
--
--    if (first_key_in_next_block == nullptr) {
--      block_rep->first_key_in_next_block.reset(nullptr);
--    } else {
--      block_rep->first_key_in_next_block->assign(
--          first_key_in_next_block->data(), first_key_in_next_block->size());
--    }
--
--    return block_rep;
--  }
--};
- 
- BlockBasedTableBuilder::BlockBasedTableBuilder(
-     const BlockBasedTableOptions& table_options, const TableBuilderOptions& 
tbo,
diff --git a/thirdparty/rocksdb/all/patches/dboptions_equality_operator.patch 
b/thirdparty/rocksdb/all/patches/dboptions_equality_operator.patch
index 2efb91ea0..f3dd48bdd 100644
--- a/thirdparty/rocksdb/all/patches/dboptions_equality_operator.patch
+++ b/thirdparty/rocksdb/all/patches/dboptions_equality_operator.patch
@@ -1,8 +1,8 @@
 diff --git a/include/rocksdb/options.h b/include/rocksdb/options.h
-index ae5ed2c26..0038c6bff 100644
+index e99e85c77..e31b374da 100644
 --- a/include/rocksdb/options.h
 +++ b/include/rocksdb/options.h
-@@ -397,6 +397,7 @@ struct DbPath {
+@@ -456,6 +456,7 @@ struct DbPath {
  
    DbPath() : target_size(0) {}
    DbPath(const std::string& p, uint64_t t) : path(p), target_size(t) {}
@@ -10,7 +10,7 @@ index ae5ed2c26..0038c6bff 100644
  };
  
  extern const char* kHostnameForDbHostId;
-@@ -1008,6 +1009,8 @@ struct DBOptions {
+@@ -1214,6 +1215,8 @@ struct DBOptions {
    // Create DBOptions from Options
    explicit DBOptions(const Options& options);
  

Reply via email to