public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/ceph] rawhide: rebuild for libarrow (Apache Arrow) 25.0.1
@ 2026-09-11 22:53 Kaleb S. KEITHLEY
0 siblings, 0 replies; only message in thread
From: Kaleb S. KEITHLEY @ 2026-09-11 22:53 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/ceph
Branch : rawhide
Commit : 3daa3e61651ae958b3f095a65c00546270df5d2f
Author : Kaleb S. KEITHLEY <kkeithle@redhat.com>
Date : 2026-09-11T18:52:40-04:00
Stats : +296/-840 in 3 file(s)
URL : https://src.fedoraproject.org/rpms/ceph/c/3daa3e61651ae958b3f095a65c00546270df5d2f?branch=rawhide
Log:
rebuild for libarrow (Apache Arrow) 25.0.1
side tag: f46-build-side-151287
---
diff --git a/0056-libarrow-20.0.0.patch b/0056-libarrow-20.0.0.patch
deleted file mode 100644
index 12cb9cf..0000000
--- a/0056-libarrow-20.0.0.patch
+++ /dev/null
@@ -1,838 +0,0 @@
---- ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/encryption_internal_19.h.orig 2025-07-08 07:40:29.811814549 -0400
-+++ ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/encryption_internal_19.h 2025-07-08 07:40:29.811739290 -0400
-@@ -0,0 +1,114 @@
-+// 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.
-+
-+#pragma once
-+
-+#include <memory>
-+#include <string>
-+#include <vector>
-+
-+#include "parquet/properties.h"
-+#include "parquet/types.h"
-+
-+using parquet::ParquetCipher;
-+
-+namespace parquet {
-+namespace encryption {
-+
-+constexpr int kGcmTagLength = 16;
-+constexpr int kNonceLength = 12;
-+
-+// Module types
-+constexpr int8_t kFooter = 0;
-+constexpr int8_t kColumnMetaData = 1;
-+constexpr int8_t kDataPage = 2;
-+constexpr int8_t kDictionaryPage = 3;
-+constexpr int8_t kDataPageHeader = 4;
-+constexpr int8_t kDictionaryPageHeader = 5;
-+constexpr int8_t kColumnIndex = 6;
-+constexpr int8_t kOffsetIndex = 7;
-+
-+/// Performs AES encryption operations with GCM or CTR ciphers.
-+class AesEncryptor {
-+ public:
-+ static AesEncryptor* Make(ParquetCipher::type alg_id, int key_len, bool metadata,
-+ std::vector<AesEncryptor*>* all_encryptors);
-+
-+ ~AesEncryptor();
-+
-+ /// Size difference between plaintext and ciphertext, for this cipher.
-+ int CiphertextSizeDelta();
-+
-+ /// Encrypts plaintext with the key and aad. Key length is passed only for validation.
-+ /// If different from value in constructor, exception will be thrown.
-+ int Encrypt(const uint8_t* plaintext, int plaintext_len, const uint8_t* key,
-+ int key_len, const uint8_t* aad, int aad_len, uint8_t* ciphertext);
-+
-+ /// Encrypts plaintext footer, in order to compute footer signature (tag).
-+ int SignedFooterEncrypt(const uint8_t* footer, int footer_len, const uint8_t* key,
-+ int key_len, const uint8_t* aad, int aad_len,
-+ const uint8_t* nonce, uint8_t* encrypted_footer);
-+
-+ void WipeOut();
-+
-+ private:
-+ /// Can serve one key length only. Possible values: 16, 24, 32 bytes.
-+ explicit AesEncryptor(ParquetCipher::type alg_id, int key_len, bool metadata);
-+ // PIMPL Idiom
-+ class AesEncryptorImpl;
-+ std::unique_ptr<AesEncryptorImpl> impl_;
-+};
-+
-+/// Performs AES decryption operations with GCM or CTR ciphers.
-+class AesDecryptor {
-+ public:
-+ static AesDecryptor* Make(ParquetCipher::type alg_id, int key_len, bool metadata,
-+ std::vector<AesDecryptor*>* all_decryptors);
-+
-+ ~AesDecryptor();
-+ void WipeOut();
-+
-+ /// Size difference between plaintext and ciphertext, for this cipher.
-+ int CiphertextSizeDelta();
-+
-+ /// Decrypts ciphertext with the key and aad. Key length is passed only for
-+ /// validation. If different from value in constructor, exception will be thrown.
-+ int Decrypt(const uint8_t* ciphertext, int ciphertext_len, const uint8_t* key,
-+ int key_len, const uint8_t* aad, int aad_len, uint8_t* plaintext);
-+
-+ private:
-+ /// Can serve one key length only. Possible values: 16, 24, 32 bytes.
-+ explicit AesDecryptor(ParquetCipher::type alg_id, int key_len, bool metadata);
-+ // PIMPL Idiom
-+ class AesDecryptorImpl;
-+ std::unique_ptr<AesDecryptorImpl> impl_;
-+};
-+
-+std::string CreateModuleAad(const std::string& file_aad, int8_t module_type,
-+ int16_t row_group_ordinal, int16_t column_ordinal,
-+ int16_t page_ordinal);
-+
-+std::string CreateFooterAad(const std::string& aad_prefix_bytes);
-+
-+// Update last two bytes of page (or page header) module AAD
-+void QuickUpdatePageAad(const std::string& AAD, int16_t new_page_ordinal);
-+
-+// Wraps OpenSSL RAND_bytes function
-+void RandBytes(unsigned char* buf, int num);
-+
-+} // namespace encryption
-+} // namespace parquet
---- ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/encryption_internal_20.h.orig 2025-07-08 07:40:29.812759948 -0400
-+++ ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/encryption_internal_20.h 2025-07-08 07:40:29.812687536 -0400
-@@ -0,0 +1,141 @@
-+// 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.
-+
-+#pragma once
-+
-+#include <memory>
-+#include <string>
-+#include <vector>
-+
-+#include "arrow/util/span.h"
-+#include "parquet/properties.h"
-+#include "parquet/types.h"
-+
-+using parquet::ParquetCipher;
-+
-+namespace parquet::encryption {
-+
-+constexpr int32_t kGcmTagLength = 16;
-+constexpr int32_t kNonceLength = 12;
-+
-+// Module types
-+constexpr int8_t kFooter = 0;
-+constexpr int8_t kColumnMetaData = 1;
-+constexpr int8_t kDataPage = 2;
-+constexpr int8_t kDictionaryPage = 3;
-+constexpr int8_t kDataPageHeader = 4;
-+constexpr int8_t kDictionaryPageHeader = 5;
-+constexpr int8_t kColumnIndex = 6;
-+constexpr int8_t kOffsetIndex = 7;
-+constexpr int8_t kBloomFilterHeader = 8;
-+constexpr int8_t kBloomFilterBitset = 9;
-+
-+/// Performs AES encryption operations with GCM or CTR ciphers.
-+class PARQUET_EXPORT AesEncryptor {
-+ public:
-+ /// Can serve one key length only. Possible values: 16, 24, 32 bytes.
-+ /// If write_length is true, prepend ciphertext length to the ciphertext
-+ explicit AesEncryptor(ParquetCipher::type alg_id, int32_t key_len, bool metadata,
-+ bool write_length = true);
-+
-+ static std::unique_ptr<AesEncryptor> Make(ParquetCipher::type alg_id, int32_t key_len,
-+ bool metadata, bool write_length = true);
-+
-+ ~AesEncryptor();
-+
-+ /// The size of the ciphertext, for this cipher and the specified plaintext length.
-+ [[nodiscard]] int32_t CiphertextLength(int64_t plaintext_len) const;
-+
-+ /// Encrypts plaintext with the key and aad. Key length is passed only for validation.
-+ /// If different from value in constructor, exception will be thrown.
-+ int32_t Encrypt(::arrow::util::span<const uint8_t> plaintext,
-+ ::arrow::util::span<const uint8_t> key,
-+ ::arrow::util::span<const uint8_t> aad,
-+ ::arrow::util::span<uint8_t> ciphertext);
-+
-+ /// Encrypts plaintext footer, in order to compute footer signature (tag).
-+ int32_t SignedFooterEncrypt(::arrow::util::span<const uint8_t> footer,
-+ ::arrow::util::span<const uint8_t> key,
-+ ::arrow::util::span<const uint8_t> aad,
-+ ::arrow::util::span<const uint8_t> nonce,
-+ ::arrow::util::span<uint8_t> encrypted_footer);
-+
-+ private:
-+ // PIMPL Idiom
-+ class AesEncryptorImpl;
-+ std::unique_ptr<AesEncryptorImpl> impl_;
-+};
-+
-+/// Performs AES decryption operations with GCM or CTR ciphers.
-+class PARQUET_EXPORT AesDecryptor {
-+ public:
-+ /// \brief Construct an AesDecryptor
-+ ///
-+ /// \param alg_id the encryption algorithm to use
-+ /// \param key_len key length. Possible values: 16, 24, 32 bytes.
-+ /// \param metadata if true then this is a metadata decryptor
-+ /// \param contains_length if true, expect ciphertext length prepended to the ciphertext
-+ explicit AesDecryptor(ParquetCipher::type alg_id, int32_t key_len, bool metadata,
-+ bool contains_length = true);
-+
-+ static std::unique_ptr<AesDecryptor> Make(ParquetCipher::type alg_id, int32_t key_len,
-+ bool metadata);
-+
-+ ~AesDecryptor();
-+
-+ /// The size of the plaintext, for this cipher and the specified ciphertext length.
-+ [[nodiscard]] int32_t PlaintextLength(int32_t ciphertext_len) const;
-+
-+ /// The size of the ciphertext, for this cipher and the specified plaintext length.
-+ [[nodiscard]] int32_t CiphertextLength(int32_t plaintext_len) const;
-+
-+ /// Decrypts ciphertext with the key and aad. Key length is passed only for
-+ /// validation. If different from value in constructor, exception will be thrown.
-+ /// The caller is responsible for ensuring that the plaintext buffer is at least as
-+ /// large as PlaintextLength(ciphertext_len).
-+ int32_t Decrypt(::arrow::util::span<const uint8_t> ciphertext,
-+ ::arrow::util::span<const uint8_t> key,
-+ ::arrow::util::span<const uint8_t> aad,
-+ ::arrow::util::span<uint8_t> plaintext);
-+
-+ private:
-+ // PIMPL Idiom
-+ class AesDecryptorImpl;
-+ std::unique_ptr<AesDecryptorImpl> impl_;
-+};
-+
-+std::string CreateModuleAad(const std::string& file_aad, int8_t module_type,
-+ int16_t row_group_ordinal, int16_t column_ordinal,
-+ int32_t page_ordinal);
-+
-+std::string CreateFooterAad(const std::string& aad_prefix_bytes);
-+
-+// Update last two bytes of page (or page header) module AAD
-+void QuickUpdatePageAad(int32_t new_page_ordinal, std::string* AAD);
-+
-+// Wraps OpenSSL RAND_bytes function
-+void RandBytes(unsigned char* buf, size_t num);
-+
-+// Ensure OpenSSL is initialized.
-+//
-+// This is only necessary in specific situations since OpenSSL otherwise
-+// initializes itself automatically. For example, under Valgrind, a memory
-+// leak will be reported if OpenSSL is initialized for the first time from
-+// a worker thread; calling this function from the main thread prevents this.
-+void EnsureBackendInitialized();
-+
-+} // namespace parquet::encryption
---- ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/encryption_internal.h.orig 2024-10-06 07:18:41.000000000 -0400
-+++ ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/encryption_internal.h 2025-07-08 07:40:29.809908891 -0400
-@@ -17,98 +17,8 @@
-
- #pragma once
-
--#include <memory>
--#include <string>
--#include <vector>
--
--#include "parquet/properties.h"
--#include "parquet/types.h"
--
--using parquet::ParquetCipher;
--
--namespace parquet {
--namespace encryption {
--
--constexpr int kGcmTagLength = 16;
--constexpr int kNonceLength = 12;
--
--// Module types
--constexpr int8_t kFooter = 0;
--constexpr int8_t kColumnMetaData = 1;
--constexpr int8_t kDataPage = 2;
--constexpr int8_t kDictionaryPage = 3;
--constexpr int8_t kDataPageHeader = 4;
--constexpr int8_t kDictionaryPageHeader = 5;
--constexpr int8_t kColumnIndex = 6;
--constexpr int8_t kOffsetIndex = 7;
--
--/// Performs AES encryption operations with GCM or CTR ciphers.
--class AesEncryptor {
-- public:
-- static AesEncryptor* Make(ParquetCipher::type alg_id, int key_len, bool metadata,
-- std::vector<AesEncryptor*>* all_encryptors);
--
-- ~AesEncryptor();
--
-- /// Size difference between plaintext and ciphertext, for this cipher.
-- int CiphertextSizeDelta();
--
-- /// Encrypts plaintext with the key and aad. Key length is passed only for validation.
-- /// If different from value in constructor, exception will be thrown.
-- int Encrypt(const uint8_t* plaintext, int plaintext_len, const uint8_t* key,
-- int key_len, const uint8_t* aad, int aad_len, uint8_t* ciphertext);
--
-- /// Encrypts plaintext footer, in order to compute footer signature (tag).
-- int SignedFooterEncrypt(const uint8_t* footer, int footer_len, const uint8_t* key,
-- int key_len, const uint8_t* aad, int aad_len,
-- const uint8_t* nonce, uint8_t* encrypted_footer);
--
-- void WipeOut();
--
-- private:
-- /// Can serve one key length only. Possible values: 16, 24, 32 bytes.
-- explicit AesEncryptor(ParquetCipher::type alg_id, int key_len, bool metadata);
-- // PIMPL Idiom
-- class AesEncryptorImpl;
-- std::unique_ptr<AesEncryptorImpl> impl_;
--};
--
--/// Performs AES decryption operations with GCM or CTR ciphers.
--class AesDecryptor {
-- public:
-- static AesDecryptor* Make(ParquetCipher::type alg_id, int key_len, bool metadata,
-- std::vector<AesDecryptor*>* all_decryptors);
--
-- ~AesDecryptor();
-- void WipeOut();
--
-- /// Size difference between plaintext and ciphertext, for this cipher.
-- int CiphertextSizeDelta();
--
-- /// Decrypts ciphertext with the key and aad. Key length is passed only for
-- /// validation. If different from value in constructor, exception will be thrown.
-- int Decrypt(const uint8_t* ciphertext, int ciphertext_len, const uint8_t* key,
-- int key_len, const uint8_t* aad, int aad_len, uint8_t* plaintext);
--
-- private:
-- /// Can serve one key length only. Possible values: 16, 24, 32 bytes.
-- explicit AesDecryptor(ParquetCipher::type alg_id, int key_len, bool metadata);
-- // PIMPL Idiom
-- class AesDecryptorImpl;
-- std::unique_ptr<AesDecryptorImpl> impl_;
--};
--
--std::string CreateModuleAad(const std::string& file_aad, int8_t module_type,
-- int16_t row_group_ordinal, int16_t column_ordinal,
-- int16_t page_ordinal);
--
--std::string CreateFooterAad(const std::string& aad_prefix_bytes);
--
--// Update last two bytes of page (or page header) module AAD
--void QuickUpdatePageAad(const std::string& AAD, int16_t new_page_ordinal);
--
--// Wraps OpenSSL RAND_bytes function
--void RandBytes(unsigned char* buf, int num);
--
--} // namespace encryption
--} // namespace parquet
-+#if ARROW_VERSION_MAJOR < 20
-+#include "encryption_internal_19.h"
-+#else
-+#include "encryption_internal_20.h"
-+#endif
---- ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/internal_file_decryptor_19.h.orig 2025-07-08 07:40:29.814292389 -0400
-+++ ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/internal_file_decryptor_19.h 2025-07-08 07:40:29.813727465 -0400
-@@ -0,0 +1,121 @@
-+// 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.
-+
-+#pragma once
-+
-+#include <map>
-+#include <memory>
-+#include <string>
-+#include <vector>
-+
-+#include "parquet/schema.h"
-+
-+namespace parquet {
-+
-+namespace encryption {
-+class AesDecryptor;
-+class AesEncryptor;
-+} // namespace encryption
-+
-+class FileDecryptionProperties;
-+
-+class PARQUET_EXPORT Decryptor {
-+ public:
-+ Decryptor(encryption::AesDecryptor* decryptor, const std::string& key,
-+ const std::string& file_aad, const std::string& aad,
-+ ::arrow::MemoryPool* pool);
-+
-+ const std::string& file_aad() const { return file_aad_; }
-+ void UpdateAad(const std::string& aad) { aad_ = aad; }
-+ ::arrow::MemoryPool* pool() { return pool_; }
-+
-+ int CiphertextSizeDelta();
-+ int Decrypt(const uint8_t* ciphertext, int ciphertext_len, uint8_t* plaintext);
-+
-+ private:
-+ encryption::AesDecryptor* aes_decryptor_;
-+ std::string key_;
-+ std::string file_aad_;
-+ std::string aad_;
-+ ::arrow::MemoryPool* pool_;
-+};
-+
-+class InternalFileDecryptor {
-+ public:
-+ explicit InternalFileDecryptor(FileDecryptionProperties* properties,
-+ const std::string& file_aad,
-+ ParquetCipher::type algorithm,
-+ const std::string& footer_key_metadata,
-+ ::arrow::MemoryPool* pool);
-+
-+ std::string& file_aad() { return file_aad_; }
-+
-+ std::string GetFooterKey();
-+
-+ ParquetCipher::type algorithm() { return algorithm_; }
-+
-+ std::string& footer_key_metadata() { return footer_key_metadata_; }
-+
-+ FileDecryptionProperties* properties() { return properties_; }
-+
-+ void WipeOutDecryptionKeys();
-+
-+ ::arrow::MemoryPool* pool() { return pool_; }
-+
-+ std::shared_ptr<Decryptor> GetFooterDecryptor();
-+ std::shared_ptr<Decryptor> GetFooterDecryptorForColumnMeta(const std::string& aad = "");
-+ std::shared_ptr<Decryptor> GetFooterDecryptorForColumnData(const std::string& aad = "");
-+ std::shared_ptr<Decryptor> GetColumnMetaDecryptor(
-+ const std::string& column_path, const std::string& column_key_metadata,
-+ const std::string& aad = "");
-+ std::shared_ptr<Decryptor> GetColumnDataDecryptor(
-+ const std::string& column_path, const std::string& column_key_metadata,
-+ const std::string& aad = "");
-+
-+ private:
-+ FileDecryptionProperties* properties_;
-+ // Concatenation of aad_prefix (if exists) and aad_file_unique
-+ std::string file_aad_;
-+ std::map<std::string, std::shared_ptr<Decryptor>> column_data_map_;
-+ std::map<std::string, std::shared_ptr<Decryptor>> column_metadata_map_;
-+
-+ std::shared_ptr<Decryptor> footer_metadata_decryptor_;
-+ std::shared_ptr<Decryptor> footer_data_decryptor_;
-+ ParquetCipher::type algorithm_;
-+ std::string footer_key_metadata_;
-+ std::vector<encryption::AesDecryptor*> all_decryptors_;
-+
-+ /// Key must be 16, 24 or 32 bytes in length. Thus there could be up to three
-+ // types of meta_decryptors and data_decryptors.
-+ std::unique_ptr<encryption::AesDecryptor> meta_decryptor_[3];
-+ std::unique_ptr<encryption::AesDecryptor> data_decryptor_[3];
-+
-+ ::arrow::MemoryPool* pool_;
-+
-+ std::shared_ptr<Decryptor> GetFooterDecryptor(const std::string& aad, bool metadata);
-+ std::shared_ptr<Decryptor> GetColumnDecryptor(const std::string& column_path,
-+ const std::string& column_key_metadata,
-+ const std::string& aad,
-+ bool metadata = false);
-+
-+ encryption::AesDecryptor* GetMetaAesDecryptor(size_t key_size);
-+ encryption::AesDecryptor* GetDataAesDecryptor(size_t key_size);
-+
-+ int MapKeyLenToDecryptorArrayIndex(int key_len);
-+};
-+
-+} // namespace parquet
---- ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/internal_file_decryptor_20.h.orig 2025-07-08 07:40:29.815411998 -0400
-+++ ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/internal_file_decryptor_20.h 2025-07-08 07:40:29.815245155 -0400
-@@ -0,0 +1,148 @@
-+// 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.
-+
-+#pragma once
-+
-+#include <memory>
-+#include <mutex>
-+#include <string>
-+#include <vector>
-+
-+#include "parquet/schema.h"
-+
-+namespace parquet {
-+
-+namespace encryption {
-+class AesDecryptor;
-+class AesEncryptor;
-+} // namespace encryption
-+
-+class ColumnCryptoMetaData;
-+class FileDecryptionProperties;
-+
-+// An object handling decryption using well-known encryption parameters
-+//
-+// CAUTION: Decryptor objects are not thread-safe.
-+class PARQUET_EXPORT Decryptor {
-+ public:
-+ Decryptor(std::unique_ptr<encryption::AesDecryptor> decryptor, const std::string& key,
-+ const std::string& file_aad, const std::string& aad,
-+ ::arrow::MemoryPool* pool);
-+ ~Decryptor();
-+
-+ const std::string& file_aad() const { return file_aad_; }
-+ void UpdateAad(const std::string& aad) { aad_ = aad; }
-+ ::arrow::MemoryPool* pool() { return pool_; }
-+
-+ [[nodiscard]] int32_t PlaintextLength(int32_t ciphertext_len) const;
-+ [[nodiscard]] int32_t CiphertextLength(int32_t plaintext_len) const;
-+ int32_t Decrypt(::arrow::util::span<const uint8_t> ciphertext,
-+ ::arrow::util::span<uint8_t> plaintext);
-+
-+ private:
-+ std::unique_ptr<encryption::AesDecryptor> aes_decryptor_;
-+ std::string key_;
-+ std::string file_aad_;
-+ std::string aad_;
-+ ::arrow::MemoryPool* pool_;
-+};
-+
-+class InternalFileDecryptor {
-+ public:
-+ explicit InternalFileDecryptor(std::shared_ptr<FileDecryptionProperties> properties,
-+ const std::string& file_aad,
-+ ParquetCipher::type algorithm,
-+ const std::string& footer_key_metadata,
-+ ::arrow::MemoryPool* pool);
-+
-+ const std::string& file_aad() const { return file_aad_; }
-+
-+ std::string GetFooterKey();
-+
-+ ParquetCipher::type algorithm() const { return algorithm_; }
-+
-+ const std::string& footer_key_metadata() const { return footer_key_metadata_; }
-+
-+ const std::shared_ptr<FileDecryptionProperties>& properties() const {
-+ return properties_;
-+ }
-+
-+ ::arrow::MemoryPool* pool() const { return pool_; }
-+
-+ // Get a Decryptor instance for the Parquet footer
-+ std::unique_ptr<Decryptor> GetFooterDecryptor();
-+
-+ // Get a Decryptor instance for column chunk metadata.
-+ std::unique_ptr<Decryptor> GetColumnMetaDecryptor(
-+ const std::string& column_path, const std::string& column_key_metadata,
-+ const std::string& aad = "") {
-+ return GetColumnDecryptor(column_path, column_key_metadata, aad, /*metadata=*/true);
-+ }
-+
-+ // Get a Decryptor instance for column chunk data.
-+ std::unique_ptr<Decryptor> GetColumnDataDecryptor(
-+ const std::string& column_path, const std::string& column_key_metadata,
-+ const std::string& aad = "") {
-+ return GetColumnDecryptor(column_path, column_key_metadata, aad, /*metadata=*/false);
-+ }
-+
-+ // Get a Decryptor factory for column chunk metadata.
-+ //
-+ // This is typically useful if multi-threaded decryption is expected.
-+ // This is a static function as it accepts a null `InternalFileDecryptor*`
-+ // argument if the column is not encrypted.
-+ static std::function<std::unique_ptr<Decryptor>()> GetColumnMetaDecryptorFactory(
-+ InternalFileDecryptor*, const ColumnCryptoMetaData* crypto_metadata,
-+ const std::string& aad = "");
-+ // Get a Decryptor factory for column chunk data.
-+ //
-+ // This is typically useful if multi-threaded decryption is expected.
-+ // This is a static function as it accepts a null `InternalFileDecryptor*`
-+ // argument if the column is not encrypted.
-+ static std::function<std::unique_ptr<Decryptor>()> GetColumnDataDecryptorFactory(
-+ InternalFileDecryptor*, const ColumnCryptoMetaData* crypto_metadata,
-+ const std::string& aad = "");
-+
-+ private:
-+ std::shared_ptr<FileDecryptionProperties> properties_;
-+ // Concatenation of aad_prefix (if exists) and aad_file_unique
-+ std::string file_aad_;
-+ ParquetCipher::type algorithm_;
-+ std::string footer_key_metadata_;
-+ ::arrow::MemoryPool* pool_;
-+
-+ // Protects footer_key_ updates
-+ std::mutex mutex_;
-+ std::string footer_key_;
-+
-+ std::string GetColumnKey(const std::string& column_path,
-+ const std::string& column_key_metadata);
-+
-+ std::unique_ptr<Decryptor> GetFooterDecryptor(const std::string& aad, bool metadata);
-+
-+ std::unique_ptr<Decryptor> GetColumnDecryptor(const std::string& column_path,
-+ const std::string& column_key_metadata,
-+ const std::string& aad, bool metadata);
-+
-+ std::function<std::unique_ptr<Decryptor>()> GetColumnDecryptorFactory(
-+ const ColumnCryptoMetaData* crypto_metadata, const std::string& aad, bool metadata);
-+};
-+
-+void UpdateDecryptor(Decryptor* decryptor, int16_t row_group_ordinal,
-+ int16_t column_ordinal, int8_t module_type);
-+
-+} // namespace parquet
---- ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/internal_file_decryptor.h.orig 2024-10-06 07:18:41.000000000 -0400
-+++ ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/internal_file_decryptor.h 2025-07-08 07:40:29.813623143 -0400
-@@ -17,105 +17,8 @@
-
- #pragma once
-
--#include <map>
--#include <memory>
--#include <string>
--#include <vector>
--
--#include "parquet/schema.h"
--
--namespace parquet {
--
--namespace encryption {
--class AesDecryptor;
--class AesEncryptor;
--} // namespace encryption
--
--class FileDecryptionProperties;
--
--class PARQUET_EXPORT Decryptor {
-- public:
-- Decryptor(encryption::AesDecryptor* decryptor, const std::string& key,
-- const std::string& file_aad, const std::string& aad,
-- ::arrow::MemoryPool* pool);
--
-- const std::string& file_aad() const { return file_aad_; }
-- void UpdateAad(const std::string& aad) { aad_ = aad; }
-- ::arrow::MemoryPool* pool() { return pool_; }
--
-- int CiphertextSizeDelta();
-- int Decrypt(const uint8_t* ciphertext, int ciphertext_len, uint8_t* plaintext);
--
-- private:
-- encryption::AesDecryptor* aes_decryptor_;
-- std::string key_;
-- std::string file_aad_;
-- std::string aad_;
-- ::arrow::MemoryPool* pool_;
--};
--
--class InternalFileDecryptor {
-- public:
-- explicit InternalFileDecryptor(FileDecryptionProperties* properties,
-- const std::string& file_aad,
-- ParquetCipher::type algorithm,
-- const std::string& footer_key_metadata,
-- ::arrow::MemoryPool* pool);
--
-- std::string& file_aad() { return file_aad_; }
--
-- std::string GetFooterKey();
--
-- ParquetCipher::type algorithm() { return algorithm_; }
--
-- std::string& footer_key_metadata() { return footer_key_metadata_; }
--
-- FileDecryptionProperties* properties() { return properties_; }
--
-- void WipeOutDecryptionKeys();
--
-- ::arrow::MemoryPool* pool() { return pool_; }
--
-- std::shared_ptr<Decryptor> GetFooterDecryptor();
-- std::shared_ptr<Decryptor> GetFooterDecryptorForColumnMeta(const std::string& aad = "");
-- std::shared_ptr<Decryptor> GetFooterDecryptorForColumnData(const std::string& aad = "");
-- std::shared_ptr<Decryptor> GetColumnMetaDecryptor(
-- const std::string& column_path, const std::string& column_key_metadata,
-- const std::string& aad = "");
-- std::shared_ptr<Decryptor> GetColumnDataDecryptor(
-- const std::string& column_path, const std::string& column_key_metadata,
-- const std::string& aad = "");
--
-- private:
-- FileDecryptionProperties* properties_;
-- // Concatenation of aad_prefix (if exists) and aad_file_unique
-- std::string file_aad_;
-- std::map<std::string, std::shared_ptr<Decryptor>> column_data_map_;
-- std::map<std::string, std::shared_ptr<Decryptor>> column_metadata_map_;
--
-- std::shared_ptr<Decryptor> footer_metadata_decryptor_;
-- std::shared_ptr<Decryptor> footer_data_decryptor_;
-- ParquetCipher::type algorithm_;
-- std::string footer_key_metadata_;
-- std::vector<encryption::AesDecryptor*> all_decryptors_;
--
-- /// Key must be 16, 24 or 32 bytes in length. Thus there could be up to three
-- // types of meta_decryptors and data_decryptors.
-- std::unique_ptr<encryption::AesDecryptor> meta_decryptor_[3];
-- std::unique_ptr<encryption::AesDecryptor> data_decryptor_[3];
--
-- ::arrow::MemoryPool* pool_;
--
-- std::shared_ptr<Decryptor> GetFooterDecryptor(const std::string& aad, bool metadata);
-- std::shared_ptr<Decryptor> GetColumnDecryptor(const std::string& column_path,
-- const std::string& column_key_metadata,
-- const std::string& aad,
-- bool metadata = false);
--
-- encryption::AesDecryptor* GetMetaAesDecryptor(size_t key_size);
-- encryption::AesDecryptor* GetDataAesDecryptor(size_t key_size);
--
-- int MapKeyLenToDecryptorArrayIndex(int key_len);
--};
--
--} // namespace parquet
-+#if ARROW_VERSION_MAJOR < 20
-+#include "internal_file_decryptor_19.h"
-+#else
-+#include "internal_file_decryptor_20.h"
-+#endif
---- ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/s3select_parquet_intrf.h.orig 2024-10-06 07:18:41.000000000 -0400
-+++ ceph-20.0.0-2362-ga9d20fc0/src/s3select/include/s3select_parquet_intrf.h 2025-07-08 07:40:29.816727417 -0400
-@@ -1002,6 +1002,7 @@
- throw ParquetException("Encrypted files cannot contain more than 32767 row groups");
- }
-
-+#if ARROW_VERSION_MAJOR < 20
- // The column is encrypted
- std::shared_ptr<::parquet::Decryptor> meta_decryptor;
- std::shared_ptr<Decryptor> data_decryptor;
-@@ -1035,6 +1036,25 @@
- false,
- #endif
- properties_.memory_pool(), &ctx);
-+#else
-+ // Arrow 20+ version uses factory functions instead of shared_ptr for decryptors
-+ std::function<std::unique_ptr<Decryptor>()> meta_decryptor_factory =
-+ InternalFileDecryptor::GetColumnMetaDecryptorFactory(file_decryptor_.get(), crypto_metadata.get());
-+ std::function<std::unique_ptr<Decryptor>()> data_decryptor_factory =
-+ InternalFileDecryptor::GetColumnDataDecryptorFactory(file_decryptor_.get(), crypto_metadata.get());
-+
-+ const CryptoContext ctx {
-+ col->has_dictionary_page(),
-+ row_group_ordinal_,
-+ static_cast<int16_t>(i),
-+ meta_decryptor_factory,
-+ data_decryptor_factory,
-+ };
-+
-+ return PageReader::Open(stream, col->num_values(), col->compression(),
-+ false,
-+ properties_.memory_pool(), &ctx);
-+#endif
- }
-
- private:
-@@ -1071,7 +1091,9 @@
- }
-
- void Close() override {
-+#if ARROW_VERSION_MAJOR < 20
- if (file_decryptor_) file_decryptor_->WipeOutDecryptionKeys();
-+#endif
- }
-
- std::shared_ptr<RowGroupReader> GetRowGroup(int i) override {
-@@ -1249,9 +1271,17 @@
- // Handle AAD prefix
- EncryptionAlgorithm algo = file_crypto_metadata->encryption_algorithm();
- std::string file_aad = HandleAadPrefix(file_decryption_properties, algo);
-+#if ARROW_VERSION_MAJOR < 20
- file_decryptor_ = std::make_shared<::parquet::InternalFileDecryptor>(
- file_decryption_properties, file_aad, algo.algorithm,
- file_crypto_metadata->key_metadata(), properties_.memory_pool());
-+#else
-+ // Arrow 20+ takes a shared_ptr to FileDecryptionProperties
-+ file_decryptor_ = std::make_shared<::parquet::InternalFileDecryptor>(
-+ std::shared_ptr<FileDecryptionProperties>(file_decryption_properties),
-+ file_aad, algo.algorithm,
-+ file_crypto_metadata->key_metadata(), properties_.memory_pool());
-+#endif
-
- int64_t metadata_offset = source_size_ - kFooterSize - footer_len + crypto_metadata_len;
- uint32_t metadata_len = footer_len - crypto_metadata_len;
-@@ -1282,9 +1312,18 @@
- EncryptionAlgorithm algo = file_metadata_->encryption_algorithm();
- // Handle AAD prefix
- std::string file_aad = HandleAadPrefix(file_decryption_properties, algo);
-+#if ARROW_VERSION_MAJOR < 20
- file_decryptor_ = std::make_shared<::parquet::InternalFileDecryptor>(
- file_decryption_properties, file_aad, algo.algorithm,
- file_metadata_->footer_signing_key_metadata(), properties_.memory_pool());
-+#else
-+ // Arrow 20+ takes a shared_ptr to FileDecryptionProperties
-+ file_decryptor_ = std::make_shared<::parquet::InternalFileDecryptor>(
-+ std::shared_ptr<FileDecryptionProperties>(file_decryption_properties),
-+ file_aad, algo.algorithm,
-+ file_metadata_->footer_signing_key_metadata(), properties_.memory_pool());
-+ // In Arrow 20+, no need to set file_decryptor in metadata
-+#endif
- // set the InternalFileDecryptor in the metadata as well, as it's used
- // for signature verification and for ColumnChunkMetaData creation.
- #if GAL_set_file_decryptor_declare_private
diff --git a/0056-libarrow-25.0.0.patch b/0056-libarrow-25.0.0.patch
new file mode 100644
index 0000000..1aaa53c
--- /dev/null
+++ b/0056-libarrow-25.0.0.patch
@@ -0,0 +1,291 @@
+--- ceph-21.1.0/src/s3select/include/internal_file_decryptor.h.orig 2024-10-06 07:18:41.000000000 -0400
++++ ceph-21.1.0/src/s3select/include/internal_file_decryptor.h 2026-09-11 16:22:28.213694586 -0400
+@@ -17,11 +17,14 @@
+
+ #pragma once
+
+-#include <map>
++#include <functional>
+ #include <memory>
++#include <mutex>
++#include <span>
+ #include <string>
+ #include <vector>
+
++#include "arrow/util/secure_string.h"
+ #include "parquet/schema.h"
+
+ namespace parquet {
+@@ -31,24 +34,31 @@
+ class AesEncryptor;
+ } // namespace encryption
+
++class ColumnCryptoMetaData;
++class DecryptionKeyRetriever;
+ class FileDecryptionProperties;
+
++// An object handling decryption using well-known encryption parameters
++//
++// CAUTION: Decryptor objects are not thread-safe.
+ class PARQUET_EXPORT Decryptor {
+ public:
+- Decryptor(encryption::AesDecryptor* decryptor, const std::string& key,
+- const std::string& file_aad, const std::string& aad,
++ Decryptor(std::unique_ptr<encryption::AesDecryptor> decryptor,
++ ::arrow::util::SecureString key, std::string file_aad, std::string aad,
+ ::arrow::MemoryPool* pool);
++ ~Decryptor();
+
+ const std::string& file_aad() const { return file_aad_; }
+ void UpdateAad(const std::string& aad) { aad_ = aad; }
+ ::arrow::MemoryPool* pool() { return pool_; }
+
+- int CiphertextSizeDelta();
+- int Decrypt(const uint8_t* ciphertext, int ciphertext_len, uint8_t* plaintext);
++ [[nodiscard]] int32_t PlaintextLength(int32_t ciphertext_len) const;
++ [[nodiscard]] int32_t CiphertextLength(int32_t plaintext_len) const;
++ int32_t Decrypt(std::span<const uint8_t> ciphertext, std::span<uint8_t> plaintext);
+
+ private:
+- encryption::AesDecryptor* aes_decryptor_;
+- std::string key_;
++ std::unique_ptr<encryption::AesDecryptor> aes_decryptor_;
++ ::arrow::util::SecureString key_;
+ std::string file_aad_;
+ std::string aad_;
+ ::arrow::MemoryPool* pool_;
+@@ -56,66 +66,90 @@
+
+ class InternalFileDecryptor {
+ public:
+- explicit InternalFileDecryptor(FileDecryptionProperties* properties,
++ explicit InternalFileDecryptor(std::shared_ptr<FileDecryptionProperties> properties,
+ const std::string& file_aad,
+ ParquetCipher::type algorithm,
+ const std::string& footer_key_metadata,
+ ::arrow::MemoryPool* pool);
+
+- std::string& file_aad() { return file_aad_; }
++ const std::string& file_aad() const { return file_aad_; }
+
+- std::string GetFooterKey();
++ const ::arrow::util::SecureString& GetFooterKey();
+
+- ParquetCipher::type algorithm() { return algorithm_; }
++ ParquetCipher::type algorithm() const { return algorithm_; }
+
+- std::string& footer_key_metadata() { return footer_key_metadata_; }
++ const std::string& footer_key_metadata() const { return footer_key_metadata_; }
+
+- FileDecryptionProperties* properties() { return properties_; }
++ const std::shared_ptr<FileDecryptionProperties>& properties() const {
++ return properties_;
++ }
+
+- void WipeOutDecryptionKeys();
++ ::arrow::MemoryPool* pool() const { return pool_; }
+
+- ::arrow::MemoryPool* pool() { return pool_; }
++ // Get a Decryptor instance for the Parquet footer
++ std::unique_ptr<Decryptor> GetFooterDecryptor();
+
+- std::shared_ptr<Decryptor> GetFooterDecryptor();
+- std::shared_ptr<Decryptor> GetFooterDecryptorForColumnMeta(const std::string& aad = "");
+- std::shared_ptr<Decryptor> GetFooterDecryptorForColumnData(const std::string& aad = "");
+- std::shared_ptr<Decryptor> GetColumnMetaDecryptor(
++ // Get a Decryptor instance for column chunk metadata.
++ std::unique_ptr<Decryptor> GetColumnMetaDecryptor(
+ const std::string& column_path, const std::string& column_key_metadata,
+- const std::string& aad = "");
+- std::shared_ptr<Decryptor> GetColumnDataDecryptor(
++ const std::string& aad = "") {
++ return GetColumnDecryptor(column_path, column_key_metadata, aad, /*metadata=*/true);
++ }
++
++ // Get a Decryptor instance for column chunk data.
++ std::unique_ptr<Decryptor> GetColumnDataDecryptor(
+ const std::string& column_path, const std::string& column_key_metadata,
++ const std::string& aad = "") {
++ return GetColumnDecryptor(column_path, column_key_metadata, aad, /*metadata=*/false);
++ }
++
++ // Get a Decryptor factory for column chunk metadata.
++ //
++ // This is typically useful if multi-threaded decryption is expected.
++ // This is a static function as it accepts a null `InternalFileDecryptor*`
++ // argument if the column is not encrypted.
++ static std::function<std::unique_ptr<Decryptor>()> GetColumnMetaDecryptorFactory(
++ InternalFileDecryptor*, const ColumnCryptoMetaData* crypto_metadata,
++ const std::string& aad = "");
++ // Get a Decryptor factory for column chunk data.
++ //
++ // This is typically useful if multi-threaded decryption is expected.
++ // This is a static function as it accepts a null `InternalFileDecryptor*`
++ // argument if the column is not encrypted.
++ static std::function<std::unique_ptr<Decryptor>()> GetColumnDataDecryptorFactory(
++ InternalFileDecryptor*, const ColumnCryptoMetaData* crypto_metadata,
+ const std::string& aad = "");
+
+ private:
+- FileDecryptionProperties* properties_;
++ std::shared_ptr<FileDecryptionProperties> properties_;
+ // Concatenation of aad_prefix (if exists) and aad_file_unique
+ std::string file_aad_;
+- std::map<std::string, std::shared_ptr<Decryptor>> column_data_map_;
+- std::map<std::string, std::shared_ptr<Decryptor>> column_metadata_map_;
+-
+- std::shared_ptr<Decryptor> footer_metadata_decryptor_;
+- std::shared_ptr<Decryptor> footer_data_decryptor_;
+ ParquetCipher::type algorithm_;
+ std::string footer_key_metadata_;
+- std::vector<encryption::AesDecryptor*> all_decryptors_;
++ ::arrow::MemoryPool* pool_;
+
+- /// Key must be 16, 24 or 32 bytes in length. Thus there could be up to three
+- // types of meta_decryptors and data_decryptors.
+- std::unique_ptr<encryption::AesDecryptor> meta_decryptor_[3];
+- std::unique_ptr<encryption::AesDecryptor> data_decryptor_[3];
++ // Protects footer_key_ updates
++ std::mutex mutex_;
++ ::arrow::util::SecureString footer_key_;
+
+- ::arrow::MemoryPool* pool_;
++ ::arrow::util::SecureString GetColumnKey(const std::string& column_path,
++ const std::string& column_key_metadata);
+
+- std::shared_ptr<Decryptor> GetFooterDecryptor(const std::string& aad, bool metadata);
+- std::shared_ptr<Decryptor> GetColumnDecryptor(const std::string& column_path,
+- const std::string& column_key_metadata,
+- const std::string& aad,
+- bool metadata = false);
++ static ::arrow::util::SecureString RetrieveColumnKeyIfEmpty(
++ ::arrow::util::SecureString column_key, const std::string& column_key_metadata,
++ const std::shared_ptr<DecryptionKeyRetriever>& key_retriever);
+
+- encryption::AesDecryptor* GetMetaAesDecryptor(size_t key_size);
+- encryption::AesDecryptor* GetDataAesDecryptor(size_t key_size);
++ std::unique_ptr<Decryptor> GetFooterDecryptor(const std::string& aad, bool metadata);
+
+- int MapKeyLenToDecryptorArrayIndex(int key_len);
++ std::unique_ptr<Decryptor> GetColumnDecryptor(const std::string& column_path,
++ const std::string& column_key_metadata,
++ const std::string& aad, bool metadata);
++
++ std::function<std::unique_ptr<Decryptor>()> GetColumnDecryptorFactory(
++ const ColumnCryptoMetaData* crypto_metadata, const std::string& aad, bool metadata);
+ };
+
++void UpdateDecryptor(Decryptor* decryptor, int16_t row_group_ordinal,
++ int16_t column_ordinal, int8_t module_type);
++
+ } // namespace parquet
+--- ceph-21.1.0/src/s3select/include/s3select_parquet_intrf.h.orig 2026-09-11 17:19:19.797033501 -0400
++++ ceph-21.1.0/src/s3select/include/s3select_parquet_intrf.h 2026-09-11 18:24:57.317792222 -0400
+@@ -561,10 +561,10 @@
+ Result<std::shared_ptr<Buffer>> DoRead(int64_t nbytes);
+
+ /// \brief Thread-safe implementation of ReadAt
+- Result<int64_t> DoReadAt(int64_t position, int64_t nbytes, void* out);
++ Result<int64_t> DoReadAt(int64_t position, int64_t nbytes, bool unused, void* out);
+
+ /// \brief Thread-safe implementation of ReadAt
+- Result<std::shared_ptr<Buffer>> DoReadAt(int64_t position, int64_t nbytes);
++ Result<std::shared_ptr<Buffer>> DoReadAt(int64_t position, int64_t nbytes, bool unused);
+
+ Result<int64_t> DoGetSize();
+ Status DoSeek(int64_t position);
+@@ -687,11 +687,11 @@
+ return impl_->IMPL->Read(nbytes, out);
+ }
+
+-Result<int64_t> ReadableFile::DoReadAt(int64_t position, int64_t nbytes, void* out) {
++Result<int64_t> ReadableFile::DoReadAt(int64_t position, int64_t nbytes, bool unused, void* out) {
+ return impl_->IMPL->ReadAt(position, nbytes, out);
+ }
+
+-Result<std::shared_ptr<Buffer>> ReadableFile::DoReadAt(int64_t position, int64_t nbytes) {
++Result<std::shared_ptr<Buffer>> ReadableFile::DoReadAt(int64_t position, int64_t nbytes, bool unused) {
+ return impl_->ReadBufferAt(position, nbytes);
+ }
+
+@@ -1002,6 +1002,7 @@
+ throw ParquetException("Encrypted files cannot contain more than 32767 row groups");
+ }
+
++#if ARROW_VERSION_MAJOR < 20
+ // The column is encrypted
+ std::shared_ptr<::parquet::Decryptor> meta_decryptor;
+ std::shared_ptr<Decryptor> data_decryptor;
+@@ -1035,6 +1036,25 @@
+ false,
+ #endif
+ properties_.memory_pool(), &ctx);
++#else
++ // Arrow 20+ version uses factory functions instead of shared_ptr for decryptors
++ std::function<std::unique_ptr<Decryptor>()> meta_decryptor_factory =
++ InternalFileDecryptor::GetColumnMetaDecryptorFactory(file_decryptor_.get(), crypto_metadata.get());
++ std::function<std::unique_ptr<Decryptor>()> data_decryptor_factory =
++ InternalFileDecryptor::GetColumnDataDecryptorFactory(file_decryptor_.get(), crypto_metadata.get());
++
++ const CryptoContext ctx {
++ col->has_dictionary_page(),
++ row_group_ordinal_,
++ static_cast<int16_t>(i),
++ meta_decryptor_factory,
++ data_decryptor_factory,
++ };
++
++ return PageReader::Open(stream, col->num_values(), col->compression(),
++ false,
++ properties_.memory_pool(), &ctx);
++#endif
+ }
+
+ private:
+@@ -1071,7 +1091,9 @@
+ }
+
+ void Close() override {
++#if ARROW_VERSION_MAJOR < 20
+ if (file_decryptor_) file_decryptor_->WipeOutDecryptionKeys();
++#endif
+ }
+
+ std::shared_ptr<RowGroupReader> GetRowGroup(int i) override {
+@@ -1249,9 +1271,17 @@
+ // Handle AAD prefix
+ EncryptionAlgorithm algo = file_crypto_metadata->encryption_algorithm();
+ std::string file_aad = HandleAadPrefix(file_decryption_properties, algo);
++#if ARROW_VERSION_MAJOR < 20
+ file_decryptor_ = std::make_shared<::parquet::InternalFileDecryptor>(
+ file_decryption_properties, file_aad, algo.algorithm,
+ file_crypto_metadata->key_metadata(), properties_.memory_pool());
++#else
++ // Arrow 20+ takes a shared_ptr to FileDecryptionProperties
++ file_decryptor_ = std::make_shared<::parquet::InternalFileDecryptor>(
++ std::shared_ptr<FileDecryptionProperties>(file_decryption_properties),
++ file_aad, algo.algorithm,
++ file_crypto_metadata->key_metadata(), properties_.memory_pool());
++#endif
+
+ int64_t metadata_offset = source_size_ - kFooterSize - footer_len + crypto_metadata_len;
+ uint32_t metadata_len = footer_len - crypto_metadata_len;
+@@ -1282,9 +1312,18 @@
+ EncryptionAlgorithm algo = file_metadata_->encryption_algorithm();
+ // Handle AAD prefix
+ std::string file_aad = HandleAadPrefix(file_decryption_properties, algo);
++#if ARROW_VERSION_MAJOR < 20
+ file_decryptor_ = std::make_shared<::parquet::InternalFileDecryptor>(
+ file_decryption_properties, file_aad, algo.algorithm,
+ file_metadata_->footer_signing_key_metadata(), properties_.memory_pool());
++#else
++ // Arrow 20+ takes a shared_ptr to FileDecryptionProperties
++ file_decryptor_ = std::make_shared<::parquet::InternalFileDecryptor>(
++ std::shared_ptr<FileDecryptionProperties>(file_decryption_properties),
++ file_aad, algo.algorithm,
++ file_metadata_->footer_signing_key_metadata(), properties_.memory_pool());
++ // In Arrow 20+, no need to set file_decryptor in metadata
++#endif
+ // set the InternalFileDecryptor in the metadata as well, as it's used
+ // for signature verification and for ColumnChunkMetaData creation.
+ #if GAL_set_file_decryptor_declare_private
diff --git a/ceph.spec b/ceph.spec
index 9f8474a..57723f1 100644
--- a/ceph.spec
+++ b/ceph.spec
@@ -197,7 +197,7 @@ fi
#################################################################################
Name: ceph
Version: 21.1.0
-Release: 6%{?dist}
+Release: 7%{?dist}
%if 0%{?fedora} || 0%{?rhel}
Epoch: 2
%endif
@@ -232,7 +232,7 @@ Patch: 0049-src-rocksdb-db-blob-blob_file_meta.h.patch
Patch: 0051-src-googletest-nosharedlibs.patch
Patch: 0052-src-tracing.patch
Patch: 0053-src-test-neorados-common_tests.h.patch
-Patch: 0056-libarrow-20.0.0.patch
+Patch: 0056-libarrow-25.0.0.patch
Patch: 0059-iso646.patch
Patch: 0062-src-rgw-driver-dbstore-CMakeLists.txt.patch
Patch: 0063-src-jaegertracing-opentelemetry-cpp-CMakeLists.txt.patch
@@ -3203,6 +3203,9 @@ exit 0
%endif
%changelog
+* Fri Sep 11 2026 Kaleb S. KEITHLEY <kkeithle[at]redhat.com> - 2:21.1.0-7
+- rebuild for libarrow (Apache Arrow) 25.0.1
+
* Thu Aug 13 2026 Jason Montleon <jason@montleon.com> - 2:21.1.0-6
- rhbz#2515956, fix FTBFS on riscv64 regression
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-09-11 22:53 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-11 22:53 [rpms/ceph] rawhide: rebuild for libarrow (Apache Arrow) 25.0.1 Kaleb S. KEITHLEY
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox