Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fb319ab5de | |||
| 1cb2c4bfdb | |||
| 632d91beae | |||
| e080504467 | |||
| aa63e53d04 | |||
| 6926ef1169 | |||
| f8977a765e | |||
| 5d2421bad4 | |||
| f5d39cf385 | |||
| e2cb602e33 | |||
| f704ff82a4 | |||
| a547e637b8 | |||
| 7bda55e728 | |||
| 6b5e836a43 | |||
| 0a3faf9744 | |||
| f1a1925584 |
@@ -0,0 +1,11 @@
|
||||
--- ceph-16.1.0-43-g6b74fb5c/cmake/modules/Finduring.cmake.orig 2021-02-01 08:45:39.316108287 -0500
|
||||
+++ ceph-16.1.0-43-g6b74fb5c/cmake/modules/Finduring.cmake 2021-02-01 08:45:59.813665378 -0500
|
||||
@@ -5,7 +5,7 @@
|
||||
# uring_FOUND - True if uring found.
|
||||
|
||||
find_path(URING_INCLUDE_DIR liburing.h)
|
||||
-find_library(URING_LIBRARIES liburing.a liburing)
|
||||
+find_library(URING_LIBRARIES liburing.so liburing)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(uring DEFAULT_MSG URING_LIBRARIES URING_INCLUDE_DIR)
|
||||
@@ -0,0 +1,42 @@
|
||||
--- ceph-16.2.7/src/common/LogEntry.cc.orig 2022-01-17 13:52:10.799134159 -0500
|
||||
+++ ceph-16.2.7/src/common/LogEntry.cc 2022-01-17 13:52:47.244469274 -0500
|
||||
@@ -183,7 +183,7 @@
|
||||
return "crit";
|
||||
default:
|
||||
ceph_abort();
|
||||
- return 0;
|
||||
+ return "";
|
||||
}
|
||||
}
|
||||
|
||||
--- ceph-16.2.7/src/test/librados/tier_cxx.cc.orig 2022-01-19 09:30:47.209459506 -0500
|
||||
+++ ceph-16.2.7/src/test/librados/tier_cxx.cc 2022-01-19 10:02:47.783240298 -0500
|
||||
@@ -120,7 +120,7 @@
|
||||
}
|
||||
|
||||
void check_fp_oid_refcount(librados::IoCtx& ioctx, std::string foid, uint64_t count,
|
||||
- std::string fp_algo = NULL)
|
||||
+ std::string fp_algo = "")
|
||||
{
|
||||
bufferlist t;
|
||||
int size = foid.length();
|
||||
@@ -148,7 +148,7 @@
|
||||
ASSERT_LE(count, refs.count());
|
||||
}
|
||||
|
||||
-string get_fp_oid(string oid, std::string fp_algo = NULL)
|
||||
+string get_fp_oid(string oid, std::string fp_algo = "")
|
||||
{
|
||||
if (fp_algo == "sha1") {
|
||||
unsigned char fingerprint[CEPH_CRYPTO_SHA1_DIGESTSIZE + 1];
|
||||
--- ceph-17.0.0-10335-gfd206722/src/s3select/include/s3select_functions.h.orig 2022-02-11 17:21:40.268627997 -0500
|
||||
+++ ceph-17.0.0-10335-gfd206722/src/s3select/include/s3select_functions.h 2022-02-11 17:21:57.155325437 -0500
|
||||
@@ -466,7 +466,7 @@
|
||||
|
||||
std::string print(int ident) override
|
||||
{
|
||||
- return std::string(0);
|
||||
+ return std::string("");
|
||||
}
|
||||
|
||||
void push_argument(base_statement* arg)
|
||||
@@ -0,0 +1,11 @@
|
||||
--- ceph-17.1.0-175-g086c8f84/src/arrow/cpp/cmake_modules/ThirdpartyToolchain.cmake.orig 2022-04-08 11:27:53.593570634 -0400
|
||||
+++ ceph-17.1.0-175-g086c8f84/src/arrow/cpp/cmake_modules/ThirdpartyToolchain.cmake 2022-04-08 11:28:20.778087653 -0400
|
||||
@@ -1991,7 +1991,7 @@
|
||||
|
||||
if((NOT ARROW_SIMD_LEVEL STREQUAL "NONE") OR (NOT ARROW_RUNTIME_SIMD_LEVEL STREQUAL "NONE"
|
||||
))
|
||||
- set(xsimd_SOURCE "BUNDLED")
|
||||
+ set(xsimd_SOURCE "SYSTEM")
|
||||
resolve_dependency(xsimd)
|
||||
# TODO: Don't use global includes but rather target_include_directories
|
||||
include_directories(SYSTEM ${XSIMD_INCLUDE_DIR})
|
||||
@@ -0,0 +1,32 @@
|
||||
--- ceph-18.0.0-1810-g728e8ac0/src/osd/scrubber/scrub_backend.h.orig 2023-01-18 16:35:03.398700052 -0500
|
||||
+++ ceph-18.0.0-1810-g728e8ac0/src/osd/scrubber/scrub_backend.h 2023-01-18 16:37:55.882677965 -0500
|
||||
@@ -183,20 +183,20 @@
|
||||
// note: 'if' chain, as hard to consistently (on all compilers) avoid some
|
||||
// warnings for a switch plus multiple return paths
|
||||
if (as_auth.possible_auth == shard_as_auth_t::usable_t::not_usable) {
|
||||
- return format_to(ctx.out(),
|
||||
- "{{shard-not-usable:{}}}",
|
||||
- as_auth.error_text);
|
||||
+ return fmt::format_to(ctx.out(),
|
||||
+ "{{shard-not-usable:{}}}",
|
||||
+ as_auth.error_text.c_str());
|
||||
}
|
||||
if (as_auth.possible_auth == shard_as_auth_t::usable_t::not_found) {
|
||||
- return format_to(ctx.out(), "{{shard-not-found}}");
|
||||
+ return fmt::format_to(ctx.out(), "{{shard-not-found}}");
|
||||
}
|
||||
- return format_to(ctx.out(),
|
||||
- "{{shard-usable: soid:{} {{txt:{}}} }}",
|
||||
- as_auth.oi.soid,
|
||||
- as_auth.error_text);
|
||||
+ return fmt::format_to(ctx.out(),
|
||||
+ "{{shard-usable: soid:{} {{txt:{}}} }}",
|
||||
+ as_auth.oi.soid,
|
||||
+ as_auth.error_text.c_str());
|
||||
|
||||
} else {
|
||||
- return format_to(
|
||||
+ return fmt::format_to(
|
||||
ctx.out(),
|
||||
"usable:{} soid:{} {{txt:{}}}",
|
||||
(as_auth.possible_auth == shard_as_auth_t::usable_t::usable) ? "yes"
|
||||
@@ -0,0 +1,199 @@
|
||||
--- ceph-18.0.0-2148-g9754cafc/src/osd/scrubber/scrub_backend.cc.orig 2023-02-08 16:01:53.800709761 -0500
|
||||
+++ ceph-18.0.0-2148-g9754cafc/src/osd/scrubber/scrub_backend.cc 2023-02-11 05:06:14.954254050 -0500
|
||||
@@ -507,11 +507,11 @@
|
||||
}
|
||||
}
|
||||
|
||||
- dout(10) << fmt::format("{}: selecting osd {} for obj {} with oi {}",
|
||||
+ dout(10) << fmt::format("{}: selecting osd {} for obj {} with oi {:p}",
|
||||
__func__,
|
||||
ret_auth.auth_shard,
|
||||
ho,
|
||||
- ret_auth.auth_oi)
|
||||
+ (void*)&ret_auth.auth_oi)
|
||||
<< dendl;
|
||||
|
||||
return ret_auth;
|
||||
@@ -1171,23 +1171,23 @@
|
||||
|
||||
if (auth.digest_present && candidate.digest_present &&
|
||||
auth.digest != candidate.digest) {
|
||||
- format_to(std::back_inserter(out),
|
||||
- "data_digest {:#x} != data_digest {:#x} from shard {}",
|
||||
- candidate.digest,
|
||||
- auth.digest,
|
||||
- auth_shard);
|
||||
+ fmt::format_to(std::back_inserter(out),
|
||||
+ "data_digest {:#x} != data_digest {:#x} from shard {}",
|
||||
+ candidate.digest,
|
||||
+ auth.digest,
|
||||
+ auth_shard);
|
||||
error = true;
|
||||
obj_result.set_data_digest_mismatch();
|
||||
}
|
||||
|
||||
if (auth.omap_digest_present && candidate.omap_digest_present &&
|
||||
auth.omap_digest != candidate.omap_digest) {
|
||||
- format_to(std::back_inserter(out),
|
||||
- "{}omap_digest {:#x} != omap_digest {:#x} from shard {}",
|
||||
- sep(error),
|
||||
- candidate.omap_digest,
|
||||
- auth.omap_digest,
|
||||
- auth_shard);
|
||||
+ fmt::format_to(std::back_inserter(out),
|
||||
+ "{}omap_digest {:#x} != omap_digest {:#x} from shard {}",
|
||||
+ sep(error),
|
||||
+ candidate.omap_digest,
|
||||
+ auth.omap_digest,
|
||||
+ auth_shard);
|
||||
obj_result.set_omap_digest_mismatch();
|
||||
}
|
||||
|
||||
@@ -1195,24 +1195,24 @@
|
||||
if (m_is_replicated) {
|
||||
if (auth_oi.is_data_digest() && candidate.digest_present &&
|
||||
auth_oi.data_digest != candidate.digest) {
|
||||
- format_to(std::back_inserter(out),
|
||||
- "{}data_digest {:#x} != data_digest {:#x} from auth oi {}",
|
||||
- sep(error),
|
||||
- candidate.digest,
|
||||
- auth_oi.data_digest,
|
||||
- auth_oi);
|
||||
+ fmt::format_to(std::back_inserter(out),
|
||||
+ "{}data_digest {:#x} != data_digest {:#x} from auth oi {:p}",
|
||||
+ sep(error),
|
||||
+ candidate.digest,
|
||||
+ auth_oi.data_digest,
|
||||
+ (void*)&auth_oi);
|
||||
shard_result.set_data_digest_mismatch_info();
|
||||
}
|
||||
|
||||
// for replicated:
|
||||
if (auth_oi.is_omap_digest() && candidate.omap_digest_present &&
|
||||
auth_oi.omap_digest != candidate.omap_digest) {
|
||||
- format_to(std::back_inserter(out),
|
||||
- "{}omap_digest {:#x} != omap_digest {:#x} from auth oi {}",
|
||||
- sep(error),
|
||||
- candidate.omap_digest,
|
||||
- auth_oi.omap_digest,
|
||||
- auth_oi);
|
||||
+ fmt::format_to(std::back_inserter(out),
|
||||
+ "{}omap_digest {:#x} != omap_digest {:#x} from auth oi {:p}",
|
||||
+ sep(error),
|
||||
+ candidate.omap_digest,
|
||||
+ auth_oi.omap_digest,
|
||||
+ (void*)&auth_oi);
|
||||
shard_result.set_omap_digest_mismatch_info();
|
||||
}
|
||||
}
|
||||
@@ -1241,7 +1241,7 @@
|
||||
auth_bl.push_back(auth_attr->second);
|
||||
|
||||
if (!can_bl.contents_equal(auth_bl)) {
|
||||
- format_to(std::back_inserter(out), "{}object info inconsistent ", sep(error));
|
||||
+ fmt::format_to(std::back_inserter(out), "{}object info inconsistent ", sep(error));
|
||||
obj_result.set_object_info_inconsistency();
|
||||
}
|
||||
}
|
||||
@@ -1261,7 +1261,7 @@
|
||||
auth_bl.push_back(auth_attr->second);
|
||||
|
||||
if (!can_bl.contents_equal(auth_bl)) {
|
||||
- format_to(std::back_inserter(out), "{}snapset inconsistent ", sep(error));
|
||||
+ fmt::format_to(std::back_inserter(out), "{}snapset inconsistent ", sep(error));
|
||||
obj_result.set_snapset_inconsistency();
|
||||
}
|
||||
}
|
||||
@@ -1284,7 +1284,7 @@
|
||||
auth_bl.push_back(auth_hi->second);
|
||||
|
||||
if (!can_bl.contents_equal(auth_bl)) {
|
||||
- format_to(std::back_inserter(out), "{}hinfo inconsistent ", sep(error));
|
||||
+ fmt::format_to(std::back_inserter(out), "{}hinfo inconsistent ", sep(error));
|
||||
obj_result.set_hinfo_inconsistency();
|
||||
}
|
||||
}
|
||||
@@ -1296,22 +1296,22 @@
|
||||
|
||||
uint64_t oi_size = logical_to_ondisk_size(auth_oi.size);
|
||||
if (oi_size != candidate.size) {
|
||||
- format_to(std::back_inserter(out),
|
||||
- "{}size {} != size {} from auth oi {}",
|
||||
- sep(error),
|
||||
- candidate.size,
|
||||
- oi_size,
|
||||
- auth_oi);
|
||||
+ fmt::format_to(std::back_inserter(out),
|
||||
+ "{}size {} != size {} from auth oi {:p}",
|
||||
+ sep(error),
|
||||
+ candidate.size,
|
||||
+ oi_size,
|
||||
+ (void*)&auth_oi);
|
||||
shard_result.set_size_mismatch_info();
|
||||
}
|
||||
|
||||
if (auth.size != candidate.size) {
|
||||
- format_to(std::back_inserter(out),
|
||||
- "{}size {} != size {} from shard {}",
|
||||
- sep(error),
|
||||
- candidate.size,
|
||||
- auth.size,
|
||||
- auth_shard);
|
||||
+ fmt::format_to(std::back_inserter(out),
|
||||
+ "{}size {} != size {} from shard {}",
|
||||
+ sep(error),
|
||||
+ candidate.size,
|
||||
+ auth.size,
|
||||
+ auth_shard);
|
||||
obj_result.set_size_mismatch();
|
||||
}
|
||||
|
||||
@@ -1320,11 +1320,11 @@
|
||||
if (candidate.size > m_conf->osd_max_object_size &&
|
||||
!obj_result.has_size_too_large()) {
|
||||
|
||||
- format_to(std::back_inserter(out),
|
||||
- "{}size {} > {} is too large",
|
||||
- sep(error),
|
||||
- candidate.size,
|
||||
- m_conf->osd_max_object_size);
|
||||
+ fmt::format_to(std::back_inserter(out),
|
||||
+ "{}size {} > {} is too large",
|
||||
+ sep(error),
|
||||
+ candidate.size,
|
||||
+ m_conf->osd_max_object_size);
|
||||
obj_result.set_size_too_large();
|
||||
}
|
||||
|
||||
@@ -1340,10 +1340,10 @@
|
||||
|
||||
auto cand = candidate.attrs.find(k);
|
||||
if (cand == candidate.attrs.end()) {
|
||||
- format_to(std::back_inserter(out), "{}attr name mismatch '{}'", sep(error), k);
|
||||
+ fmt::format_to(std::back_inserter(out), "{}attr name mismatch '{}'", sep(error), k);
|
||||
obj_result.set_attr_name_mismatch();
|
||||
} else if (cand->second.cmp(v)) {
|
||||
- format_to(std::back_inserter(out), "{}attr value mismatch '{}'", sep(error), k);
|
||||
+ fmt::format_to(std::back_inserter(out), "{}attr value mismatch '{}'", sep(error), k);
|
||||
obj_result.set_attr_value_mismatch();
|
||||
}
|
||||
}
|
||||
@@ -1356,7 +1356,7 @@
|
||||
|
||||
auto in_auth = auth.attrs.find(k);
|
||||
if (in_auth == auth.attrs.end()) {
|
||||
- format_to(std::back_inserter(out), "{}attr name mismatch '{}'", sep(error), k);
|
||||
+ fmt::format_to(std::back_inserter(out), "{}attr name mismatch '{}'", sep(error), k);
|
||||
obj_result.set_attr_name_mismatch();
|
||||
}
|
||||
}
|
||||
@@ -1823,8 +1823,7 @@
|
||||
SnapMapReaderI& snaps_getter)
|
||||
{
|
||||
using result_t = Scrub::SnapMapReaderI::result_t;
|
||||
- dout(15) << fmt::format("{}: obj:{} snapset:{}", __func__, hoid, snapset)
|
||||
- << dendl;
|
||||
+ // dout(15) << fmt::format("{}: obj:{} snapset:{}", __func__, hoid, snapset) << dendl;
|
||||
|
||||
auto p = snapset.clone_snaps.find(hoid.snap);
|
||||
if (p == snapset.clone_snaps.end()) {
|
||||
@@ -0,0 +1,151 @@
|
||||
--- ceph-17.2.6/src/kv/rocksdb_cache/ShardedCache.h.orig 2023-04-05 11:09:51.000000000 -0400
|
||||
+++ ceph-17.2.6/src/kv/rocksdb_cache/ShardedCache.h 2023-04-21 16:22:26.665067333 -0400
|
||||
@@ -15,7 +15,7 @@
|
||||
#include <mutex>
|
||||
|
||||
#include "rocksdb/version.h"
|
||||
-#include "rocksdb/cache.h"
|
||||
+#include "rocksdb/advanced_cache.h"
|
||||
#include "include/ceph_hash.h"
|
||||
#include "common/PriorityCache.h"
|
||||
//#include "hash.h"
|
||||
@@ -26,7 +26,8 @@
|
||||
|
||||
namespace rocksdb_cache {
|
||||
|
||||
-using DeleterFn = void (*)(const rocksdb::Slice& key, void* value);
|
||||
+// using DeleterFn = void (*)(const rocksdb::Slice& key, void* value);
|
||||
+using DeleterFn = void (*)(rocksdb::Cache::ObjectPtr obj, rocksdb::MemoryAllocator* allocator);
|
||||
|
||||
// Single cache shard interface.
|
||||
class CacheShard {
|
||||
@@ -34,11 +35,19 @@
|
||||
CacheShard() = default;
|
||||
virtual ~CacheShard() = default;
|
||||
|
||||
- virtual rocksdb::Status Insert(const rocksdb::Slice& key, uint32_t hash, void* value,
|
||||
- size_t charge,
|
||||
- DeleterFn deleter,
|
||||
- rocksdb::Cache::Handle** handle, rocksdb::Cache::Priority priority) = 0;
|
||||
- virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, uint32_t hash) = 0;
|
||||
+ virtual rocksdb::Status Insert(const rocksdb::Slice& key,
|
||||
+ rockdb::ObjectPtr obj,
|
||||
+ const rocksdb::CacheItemHelper* helper,
|
||||
+ size_t charge,
|
||||
+ rocksdb:Handle** handle = nullptr,
|
||||
+ Rocksdb::Priority priority = Rocksdb::Priority::LOW)
|
||||
+ virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key,
|
||||
+ const rocksdb::CacheItemHelper* helper = nullptr,
|
||||
+ rocksdb::CreateContext* create_context = nullptr,
|
||||
+ rocksdb::Priority priority = rocksdb::Priority::LOW,
|
||||
+ bool wait = true,
|
||||
+ rocksdb::Statistics* stats = nullptr);
|
||||
+
|
||||
virtual bool Ref(rocksdb::Cache::Handle* handle) = 0;
|
||||
virtual bool Release(rocksdb::Cache::Handle* handle, bool force_erase = false) = 0;
|
||||
virtual void Erase(const rocksdb::Slice& key, uint32_t hash) = 0;
|
||||
@@ -68,8 +77,8 @@
|
||||
virtual const char* Name() const override = 0;
|
||||
virtual rocksdb::Status Insert(const rocksdb::Slice& key, void* value, size_t charge,
|
||||
DeleterFn,
|
||||
- rocksdb::Cache::Handle** handle, Priority priority) override;
|
||||
- virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, rocksdb::Statistics* stats) override;
|
||||
+ rocksdb::Cache::Handle** handle, Priority priority);
|
||||
+ virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, rocksdb::Statistics* stats);
|
||||
virtual bool Ref(rocksdb::Cache::Handle* handle) override;
|
||||
virtual bool Release(rocksdb::Cache::Handle* handle, bool force_erase = false) override;
|
||||
virtual void* Value(Handle* handle) override = 0;
|
||||
@@ -84,14 +93,17 @@
|
||||
virtual size_t GetPinnedUsage() const override;
|
||||
virtual size_t GetCharge(Handle* handle) const = 0;
|
||||
#if (ROCKSDB_MAJOR >= 7 || (ROCKSDB_MAJOR == 6 && ROCKSDB_MINOR >= 22))
|
||||
- virtual DeleterFn GetDeleter(Handle* handle) const override;
|
||||
+ virtual DeleterFn GetDeleter(Handle* handle) const;
|
||||
#endif
|
||||
virtual void DisownData() override = 0;
|
||||
#if (ROCKSDB_MAJOR >= 7 || (ROCKSDB_MAJOR == 6 && ROCKSDB_MINOR >= 22))
|
||||
+ virtual const rocksdb::CacheItemHelper* GetCacheItemHelper(rocksdb::Cache::Handle* handle) const;
|
||||
virtual void ApplyToAllEntries(
|
||||
- const std::function<void(const rocksdb::Slice& key, void* value, size_t charge,
|
||||
- DeleterFn deleter)>& callback,
|
||||
- const ApplyToAllEntriesOptions& opts) override;
|
||||
+ const std::function<void(const rocksdb::Slice& key,
|
||||
+ rocksdb::Cache::ObjectPtr obj,
|
||||
+ size_t charge,
|
||||
+ const rocksdb::CacheItemHelper* helper)>& callback,
|
||||
+ const rocksdb::ApplyToAllEntriesOptions& opts);
|
||||
#else
|
||||
virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
|
||||
bool thread_safe) override;
|
||||
--- ceph-17.2.6/src/kv/RocksDBStore.cc.orig 2023-04-05 11:09:51.000000000 -0400
|
||||
+++ ceph-17.2.6/src/kv/RocksDBStore.cc 2023-04-20 16:19:29.280669881 -0400
|
||||
@@ -903,6 +903,19 @@
|
||||
// base_name - name of column without shard suffix: "-"+number
|
||||
// options - additional options to apply
|
||||
// cf_opt - column family options to update
|
||||
+
|
||||
+rocksdb::Status GetColumnFamilyOptionsFromMap(
|
||||
+ const rocksdb::ColumnFamilyOptions& base_options,
|
||||
+ const std::unordered_map<std::string, std::string>& opts_map,
|
||||
+ rocksdb::ColumnFamilyOptions* new_options, bool input_strings_escaped,
|
||||
+ bool ignore_unknown_options) {
|
||||
+ rocksdb::ConfigOptions config_options;
|
||||
+ config_options.ignore_unknown_options = ignore_unknown_options;
|
||||
+ config_options.input_strings_escaped = input_strings_escaped;
|
||||
+ return rocksdb::GetColumnFamilyOptionsFromMap(config_options, base_options, opts_map,
|
||||
+ new_options);
|
||||
+}
|
||||
+
|
||||
int RocksDBStore::update_column_family_options(const std::string& base_name,
|
||||
const std::string& more_options,
|
||||
rocksdb::ColumnFamilyOptions* cf_opt)
|
||||
@@ -916,7 +929,7 @@
|
||||
<< " options=" << more_options << dendl;
|
||||
return r;
|
||||
}
|
||||
- status = rocksdb::GetColumnFamilyOptionsFromMap(*cf_opt, options_map, cf_opt);
|
||||
+ status = GetColumnFamilyOptionsFromMap(*cf_opt, options_map, cf_opt, false, false);
|
||||
if (!status.ok()) {
|
||||
dout(5) << __func__ << " invalid column family optionsp; column family="
|
||||
<< base_name << " options=" << more_options << dendl;
|
||||
@@ -937,6 +950,20 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
+rocksdb::Status GetBlockBasedTableOptionsFromMap(
|
||||
+ const rocksdb::BlockBasedTableOptions& table_options,
|
||||
+ const std::unordered_map<std::string, std::string>& opts_map,
|
||||
+ rocksdb::BlockBasedTableOptions* new_table_options, bool input_strings_escaped,
|
||||
+ bool ignore_unknown_options) {
|
||||
+ rocksdb::ConfigOptions config_options;
|
||||
+ config_options.input_strings_escaped = input_strings_escaped;
|
||||
+ config_options.ignore_unknown_options = ignore_unknown_options;
|
||||
+ config_options.invoke_prepare_options = false;
|
||||
+
|
||||
+ return rocksdb::GetBlockBasedTableOptionsFromMap(config_options, table_options,
|
||||
+ opts_map, new_table_options);
|
||||
+}
|
||||
+
|
||||
int RocksDBStore::apply_block_cache_options(const std::string& column_name,
|
||||
const std::string& block_cache_opt,
|
||||
rocksdb::ColumnFamilyOptions* cf_opt)
|
||||
@@ -981,7 +1008,7 @@
|
||||
}
|
||||
|
||||
rocksdb::BlockBasedTableOptions column_bbt_opts;
|
||||
- status = GetBlockBasedTableOptionsFromMap(bbt_opts, cache_options_map, &column_bbt_opts);
|
||||
+ status = GetBlockBasedTableOptionsFromMap(bbt_opts, cache_options_map, &column_bbt_opts, false, false);
|
||||
if (!status.ok()) {
|
||||
dout(5) << __func__ << " invalid block cache options; column=" << column_name
|
||||
<< " options=" << block_cache_opt << dendl;
|
||||
--- ceph-17.2.6/src/kv/rocksdb_cache/BinnedLRUCache.h.orig 2023-04-21 10:11:00.180387609 -0400
|
||||
+++ ceph-17.2.6/src/kv/rocksdb_cache/BinnedLRUCache.h 2023-04-21 10:17:15.527816193 -0400
|
||||
@@ -121,7 +121,7 @@
|
||||
void Free() {
|
||||
ceph_assert((refs == 1 && InCache()) || (refs == 0 && !InCache()));
|
||||
if (deleter) {
|
||||
- (*deleter)(key(), value);
|
||||
+ (*deleter)(this, nullptr);
|
||||
}
|
||||
delete[] key_data;
|
||||
delete this;
|
||||
@@ -0,0 +1,61 @@
|
||||
--- ceph-18.0.0-2726-g7cea3740/src/rgw/rgw_asio_client.cc.orig 2023-03-14 18:46:02.037195570 -0400
|
||||
+++ ceph-18.0.0-2726-g7cea3740/src/rgw/rgw_asio_client.cc 2023-03-14 18:55:14.446438244 -0400
|
||||
@@ -39,11 +39,13 @@
|
||||
const auto& value = header->value();
|
||||
|
||||
if (field == beast::http::field::content_length) {
|
||||
- env.set("CONTENT_LENGTH", value.to_string());
|
||||
+ std::string scratch{value.data(), value.size()};
|
||||
+ env.set("CONTENT_LENGTH", scratch.c_str());
|
||||
continue;
|
||||
}
|
||||
if (field == beast::http::field::content_type) {
|
||||
- env.set("CONTENT_TYPE", value.to_string());
|
||||
+ std::string scratch{value.data(), value.size()};
|
||||
+ env.set("CONTENT_TYPE", scratch.c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -62,26 +64,37 @@
|
||||
}
|
||||
*dest = '\0';
|
||||
|
||||
- env.set(buf, value.to_string());
|
||||
+ std::string scratch{value.data(), value.size()};
|
||||
+ env.set(buf, scratch.c_str());
|
||||
}
|
||||
|
||||
int major = request.version() / 10;
|
||||
int minor = request.version() % 10;
|
||||
env.set("HTTP_VERSION", std::to_string(major) + '.' + std::to_string(minor));
|
||||
|
||||
- env.set("REQUEST_METHOD", request.method_string().to_string());
|
||||
+ {
|
||||
+ std::string scratch {request.method_string().data(),request.method_string().size()};
|
||||
+ env.set("REQUEST_METHOD", scratch.c_str());
|
||||
+ }
|
||||
|
||||
// split uri from query
|
||||
auto uri = request.target();
|
||||
auto pos = uri.find('?');
|
||||
if (pos != uri.npos) {
|
||||
auto query = uri.substr(pos + 1);
|
||||
- env.set("QUERY_STRING", query.to_string());
|
||||
+ std::string scratch{query.data(), query.size()};
|
||||
+ env.set("QUERY_STRING", scratch.c_str());
|
||||
uri = uri.substr(0, pos);
|
||||
}
|
||||
- env.set("SCRIPT_URI", uri.to_string());
|
||||
+ {
|
||||
+ std::string scratch {uri.data(), uri.size()};
|
||||
+ env.set("SCRIPT_URI", scratch.c_str());
|
||||
+ }
|
||||
|
||||
- env.set("REQUEST_URI", request.target().to_string());
|
||||
+ {
|
||||
+ std::string scratch {request.target().data(), request.target().size()};
|
||||
+ env.set("REQUEST_URI", scratch.c_str());
|
||||
+ }
|
||||
|
||||
char port_buf[16];
|
||||
snprintf(port_buf, sizeof(port_buf), "%d", local_endpoint.port());
|
||||
@@ -1,41 +0,0 @@
|
||||
From f5d3e9146d9ceb12858bc94d60090bd851b1c088 Mon Sep 17 00:00:00 2001
|
||||
From: Adam Emerson <aemerson@redhat.com>
|
||||
Date: Wed, 20 Dec 2023 13:51:21 -0500
|
||||
Subject: [PATCH] test/neorados: Use two fewer GTest internals
|
||||
|
||||
To get coroutine tests working, I used some internals. Two of these
|
||||
are no longer available in newer versions. Since they can be
|
||||
implemented with regular old C++ features, use those.
|
||||
|
||||
This fixes an FTBFS on Fedora Rawhide introduced in
|
||||
`35231f7251ed70d8d817ee7e727d9763669d101f`.
|
||||
|
||||
Signed-off-by: Adam Emerson <aemerson@redhat.com>
|
||||
---
|
||||
src/test/neorados/common_tests.h | 12 ++++++++----
|
||||
1 file changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/test/neorados/common_tests.h b/src/test/neorados/common_tests.h
|
||||
index 9610f08f643f3..396432e417e84 100644
|
||||
--- a/src/test/neorados/common_tests.h
|
||||
+++ b/src/test/neorados/common_tests.h
|
||||
@@ -391,10 +391,14 @@ class NeoRadosECTest : public NeoRadosTestBase {
|
||||
public: \
|
||||
GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() = default; \
|
||||
~GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() override = default; \
|
||||
- GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
|
||||
- test_name)); \
|
||||
- GTEST_DISALLOW_MOVE_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
|
||||
- test_name)); \
|
||||
+ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)( \
|
||||
+ const GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)&) = delete; \
|
||||
+ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)& operator =( \
|
||||
+ const GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)&) = delete; \
|
||||
+ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)( \
|
||||
+ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)&&) = delete; \
|
||||
+ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)& operator =( \
|
||||
+ GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)&&) = delete; \
|
||||
\
|
||||
private: \
|
||||
boost::asio::awaitable<void> CoTestBody() override; \
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
--- ceph-18.2.4/src/include/rados/rgw_file.h.orig 2024-09-23 12:05:39.942703570 -0400
|
||||
+++ ceph-18.2.4/src/include/rados/rgw_file.h 2024-09-23 12:05:55.800441732 -0400
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
#define LIBRGW_FILE_VER_MAJOR 1
|
||||
#define LIBRGW_FILE_VER_MINOR 2
|
||||
-#define LIBRGW_FILE_VER_EXTRA 0
|
||||
+#define LIBRGW_FILE_VER_EXTRA 1
|
||||
|
||||
#define LIBRGW_FILE_VERSION(maj, min, extra) ((maj << 16) + (min << 8) + extra)
|
||||
#define LIBRGW_FILE_VERSION_CODE LIBRGW_FILE_VERSION(LIBRGW_FILE_VER_MAJOR, LIBRGW_FILE_VER_MINOR, LIBRGW_FILE_VER_EXTRA)
|
||||
@@ -0,0 +1,14 @@
|
||||
--- ceph-18.2.4/CMakeLists.txt.orig 2025-04-08 12:58:08.231622137 -0400
|
||||
+++ ceph-18.2.4/CMakeLists.txt 2025-04-08 12:58:17.021471996 -0400
|
||||
@@ -739,11 +739,3 @@
|
||||
option(WITH_GRAFANA "install grafana dashboards" OFF)
|
||||
add_subdirectory(monitoring/ceph-mixin)
|
||||
|
||||
-include(CTags)
|
||||
-option(CTAG_EXCLUDES "Exclude files/directories when running ctag.")
|
||||
-add_tags(ctags
|
||||
- SRC_DIR src
|
||||
- TAG_FILE tags
|
||||
- EXCLUDE_OPTS ${CTAG_EXCLUDES}
|
||||
- EXCLUDES "*.js" "*.css" ".tox" "python-common/build")
|
||||
-add_custom_target(tags DEPENDS ctags)
|
||||
@@ -1,19 +0,0 @@
|
||||
--- ceph-18.2.3/src/mgr/PyModule.cc.orig 2024-06-06 16:31:10.340731851 -0400
|
||||
+++ ceph-18.2.3/src/mgr/PyModule.cc 2024-06-07 12:58:49.913571410 -0400
|
||||
@@ -342,6 +342,16 @@
|
||||
return ceph_module;
|
||||
}
|
||||
|
||||
+// FIXME
|
||||
+// Removed in Python 3.13 API, but kept for the stable ABI
|
||||
+#ifdef __cplusplus
|
||||
+extern "C" {
|
||||
+#endif
|
||||
+PyAPI_FUNC(void) PySys_SetPath(const wchar_t *);
|
||||
+#ifdef __cplusplus
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
int PyModule::load(PyThreadState *pMainThreadState)
|
||||
{
|
||||
ceph_assert(pMainThreadState != nullptr);
|
||||
@@ -1,15 +0,0 @@
|
||||
--- ceph-19.1.0/src/common/crc32c_ppc_asm.S.orig 2024-07-10 10:55:06.255480790 -0400
|
||||
+++ ceph-19.1.0/src/common/crc32c_ppc_asm.S 2024-07-10 12:53:42.844075490 -0400
|
||||
@@ -54,11 +54,8 @@
|
||||
/* byte reverse permute constant */
|
||||
.octa 0x0F0E0D0C0B0A09080706050403020100
|
||||
|
||||
-#ifdef CRC32_CONSTANTS_HEADER
|
||||
-#include CRC32_CONSTANTS_HEADER
|
||||
-#else
|
||||
+#define __ASSEMBLY__
|
||||
#include "crc32c_ppc_constants.h"
|
||||
-#endif
|
||||
|
||||
.text
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
--- ceph-19.1.0/src/cpp_redis/CMakeLists.txt.orig 2024-07-11 15:16:22.487082035 -0400
|
||||
+++ ceph-19.1.0/src/cpp_redis/CMakeLists.txt 2024-07-11 15:17:57.226534456 -0400
|
||||
@@ -174,6 +174,7 @@
|
||||
set_target_properties(${PROJECT} PROPERTIES COMPILE_DEFINITIONS "__CPP_REDIS_USE_CUSTOM_TCP_CLIENT=${USE_CUSTOM_TCP_CLIENT}")
|
||||
endif(USE_CUSTOM_TCP_CLIENT)
|
||||
|
||||
+install(TARGETS ${PROJECT} DESTINATION ${CMAKE_INSTALL_LIBDIR}/ceph)
|
||||
|
||||
###
|
||||
# examples
|
||||
--- ceph-19.1.0/src/cpp_redis/tacopie/CMakeLists.txt.orig 2024-01-30 21:47:59.000000000 -0500
|
||||
+++ ceph-19.1.0/src/cpp_redis/tacopie/CMakeLists.txt 2024-07-12 07:37:23.584654640 -0400
|
||||
@@ -162,6 +162,8 @@
|
||||
ENDIF(SELECT_TIMEOUT)
|
||||
|
||||
|
||||
+install(TARGETS ${PROJECT} DESTINATION ${CMAKE_INSTALL_LIBDIR}/ceph)
|
||||
+
|
||||
###
|
||||
# examples
|
||||
###
|
||||
@@ -1,28 +0,0 @@
|
||||
--- ceph-19.1.0/src/common/crc32c_ppc_fast_zero_asm.S.orig 2024-07-26 07:18:50.733484175 -0400
|
||||
+++ ceph-19.1.0/src/common/crc32c_ppc_fast_zero_asm.S 2024-07-26 07:17:48.449531183 -0400
|
||||
@@ -45,8 +45,10 @@
|
||||
|
||||
/* unsigned int barrett_reduction(unsigned long val) */
|
||||
FUNC_START(barrett_reduction)
|
||||
- lis r4,.constants@ha
|
||||
- la r4,.constants@l(r4)
|
||||
+/* lis r4,.constants@ha */
|
||||
+/* la r4,.constants@l(r4) */
|
||||
+ addis r4,r4,.constants@toc@ha
|
||||
+ addi r4,r4,.constants@toc@l
|
||||
|
||||
li r5,16
|
||||
vxor v1,v1,v1 /* zero v1 */
|
||||
@@ -83,8 +85,10 @@
|
||||
|
||||
/* unsigned int barrett_reduction_reflected(unsigned long val) */
|
||||
FUNC_START(barrett_reduction_reflected)
|
||||
- lis r4,.bit_reflected_constants@ha
|
||||
- la r4,.bit_reflected_constants@l(r4)
|
||||
+/* lis r4,.bit_reflected_constants@ha */
|
||||
+/* la r4,.bit_reflected_constants@l(r4) */
|
||||
+ addis r4,r4,.bit_reflected_constants@toc@ha
|
||||
+ addi r4,r4,.bit_reflected_constants@toc@l
|
||||
|
||||
li r5,16
|
||||
vxor v1,v1,v1 /* zero v1 */
|
||||
@@ -1,55 +0,0 @@
|
||||
diff --git a/src/common/openssl_opts_handler.cc b/src/common/openssl_opts_handler.cc
|
||||
index 81d0c4786..d9866f197 100644
|
||||
--- a/src/common/openssl_opts_handler.cc
|
||||
+++ b/src/common/openssl_opts_handler.cc
|
||||
@@ -16,7 +16,10 @@
|
||||
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/conf.h>
|
||||
+#include <openssl/err.h>
|
||||
+#ifndef OPENSSL_NO_ENGINE
|
||||
#include <openssl/engine.h>
|
||||
+#endif
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
@@ -116,11 +119,13 @@ void load_module(const string &engine_conf)
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
|
||||
+#ifndef OPENSSL_NO_ENGINE
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
ENGINE_load_builtin_engines();
|
||||
#pragma clang diagnostic pop
|
||||
#pragma GCC diagnostic pop
|
||||
+#endif
|
||||
|
||||
if (CONF_modules_load(
|
||||
conf, nullptr,
|
||||
diff --git a/src/crypto/openssl/openssl_crypto_accel.cc b/src/crypto/openssl/openssl_crypto_accel.cc
|
||||
index f99844a38..4944205dd 100644
|
||||
--- a/src/crypto/openssl/openssl_crypto_accel.cc
|
||||
+++ b/src/crypto/openssl/openssl_crypto_accel.cc
|
||||
@@ -14,7 +14,6 @@
|
||||
|
||||
#include "crypto/openssl/openssl_crypto_accel.h"
|
||||
#include <openssl/evp.h>
|
||||
-#include <openssl/engine.h>
|
||||
#include "common/debug.h"
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
diff --git a/src/jaegertracing/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/civetweb.c b/src/jaegertracing/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/civetweb.c
|
||||
index fea9e6f98..c7eddb20b 100644
|
||||
--- a/src/jaegertracing/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/civetweb.c
|
||||
+++ b/src/jaegertracing/opentelemetry-cpp/third_party/prometheus-cpp/3rdparty/civetweb/src/civetweb.c
|
||||
@@ -1744,7 +1744,9 @@ typedef struct SSL_CTX SSL_CTX;
|
||||
#include <openssl/conf.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/dh.h>
|
||||
+#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
|
||||
#include <openssl/engine.h>
|
||||
+#endif
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/opensslv.h>
|
||||
#include <openssl/pem.h>
|
||||
@@ -1,16 +0,0 @@
|
||||
--- ceph-19.2.0/src/mds/CMakeLists.txt.orig 2024-12-20 17:15:47.632569537 -0500
|
||||
+++ ceph-19.2.0/src/mds/CMakeLists.txt 2024-12-20 17:16:48.945481957 -0500
|
||||
@@ -45,12 +45,11 @@
|
||||
QuiesceDbManager.cc
|
||||
QuiesceAgent.cc
|
||||
MDSRankQuiesce.cc
|
||||
- BoostUrlImpl.cc
|
||||
${CMAKE_SOURCE_DIR}/src/common/TrackedOp.cc
|
||||
${CMAKE_SOURCE_DIR}/src/common/MemoryModel.cc
|
||||
${CMAKE_SOURCE_DIR}/src/osdc/Journaler.cc
|
||||
${CMAKE_SOURCE_DIR}/src/mgr/MDSPerfMetricTypes.cc)
|
||||
add_library(mds STATIC ${mds_srcs})
|
||||
target_link_libraries(mds PRIVATE
|
||||
- heap_profiler cpu_profiler osdc ${LUA_LIBRARIES})
|
||||
+ boost_url heap_profiler cpu_profiler osdc ${LUA_LIBRARIES})
|
||||
target_include_directories(mds PRIVATE "${LUA_INCLUDE_DIR}")
|
||||
@@ -1,20 +0,0 @@
|
||||
--- ceph-19.2.0/src/rocksdb/db/blob/blob_file_meta.h.orig 2025-01-16 08:16:41.762758595 -0500
|
||||
+++ ceph-19.2.0/src/rocksdb/db/blob/blob_file_meta.h 2025-01-16 08:17:37.172784779 -0500
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
+#include <cstdint>
|
||||
|
||||
#include "rocksdb/rocksdb_namespace.h"
|
||||
|
||||
--- ceph-19.2.0/src/rocksdb/include/rocksdb/trace_record.h.orig 2025-01-16 09:04:19.196962397 -0500
|
||||
+++ ceph-19.2.0/src/rocksdb/include/rocksdb/trace_record.h 2025-01-16 09:04:33.885701684 -0500
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
+#include <cstdint>
|
||||
|
||||
#include "rocksdb/rocksdb_namespace.h"
|
||||
#include "rocksdb/slice.h"
|
||||
@@ -1,257 +0,0 @@
|
||||
--- ceph-19.2.0/src/rgw/driver/posix/zpp_bits.h.orig 2024-09-18 12:27:51.000000000 -0400
|
||||
+++ ceph-19.2.0/src/rgw/driver/posix/zpp_bits.h 2025-01-16 14:58:48.471438398 -0500
|
||||
@@ -2687,8 +2687,12 @@
|
||||
{
|
||||
using type = std::remove_cvref_t<decltype(container)>;
|
||||
using value_type = typename type::value_type;
|
||||
- constexpr auto is_const = std::is_const_v<
|
||||
- std::remove_reference_t<decltype(container[0])>>;
|
||||
+ constexpr auto is_const =
|
||||
+ std::is_const_v<std::remove_reference_t<value_type>> ||
|
||||
+ requires {
|
||||
+ requires std::is_const_v<
|
||||
+ std::remove_reference_t<decltype(container[0])>>;
|
||||
+ };
|
||||
|
||||
if constexpr (!std::is_void_v<SizeType> &&
|
||||
(requires(type container) { container.resize(1); } ||
|
||||
@@ -2827,9 +2831,7 @@
|
||||
if constexpr (requires { typename type::mapped_type; }) {
|
||||
using value_type = std::pair<typename type::key_type,
|
||||
typename type::mapped_type>;
|
||||
- std::aligned_storage_t<sizeof(value_type),
|
||||
- alignof(value_type)>
|
||||
- storage;
|
||||
+ alignas(value_type) std::byte storage[sizeof(value_type)];
|
||||
|
||||
auto object = access::placement_new<value_type>(
|
||||
std::addressof(storage));
|
||||
@@ -2843,9 +2845,7 @@
|
||||
} else {
|
||||
using value_type = typename type::value_type;
|
||||
|
||||
- std::aligned_storage_t<sizeof(value_type),
|
||||
- alignof(value_type)>
|
||||
- storage;
|
||||
+ alignas(value_type) std::byte storage[sizeof(value_type)];
|
||||
|
||||
auto object = access::placement_new<value_type>(
|
||||
std::addressof(storage));
|
||||
@@ -2903,8 +2903,7 @@
|
||||
return result;
|
||||
}
|
||||
} else {
|
||||
- std::aligned_storage_t<sizeof(value_type), alignof(value_type)>
|
||||
- storage;
|
||||
+ alignas(value_type) std::byte storage[sizeof(value_type)];
|
||||
|
||||
auto object =
|
||||
access::placement_new<value_type>(std::addressof(storage));
|
||||
@@ -2947,9 +2946,7 @@
|
||||
}
|
||||
return serialize_one(*std::get_if<element_type>(&variant));
|
||||
} else {
|
||||
- std::aligned_storage_t<sizeof(element_type),
|
||||
- alignof(element_type)>
|
||||
- storage;
|
||||
+ alignas(element_type) std::byte storage[sizeof(element_type)];
|
||||
|
||||
auto object = access::placement_new<element_type>(
|
||||
std::addressof(storage));
|
||||
@@ -2996,8 +2993,7 @@
|
||||
return self.serialize_one(
|
||||
*std::get_if<Types>(&variant));
|
||||
} else {
|
||||
- std::aligned_storage_t<sizeof(Types), alignof(Types)>
|
||||
- storage;
|
||||
+ alignas(Types) std::byte storage[sizeof(Types)];
|
||||
|
||||
auto object = access::placement_new<Types>(
|
||||
std::addressof(storage));
|
||||
@@ -3008,6 +3004,7 @@
|
||||
return result;
|
||||
}
|
||||
variant = std::move(*object);
|
||||
+ return errc{};
|
||||
}
|
||||
}...};
|
||||
|
||||
@@ -3307,7 +3304,7 @@
|
||||
ZPP_BITS_INLINE constexpr static auto serialize(auto & serializer,
|
||||
auto & self)
|
||||
{
|
||||
- return serializer.template serialize_one(self.variant, self.id);
|
||||
+ return serializer.serialize_one(self.variant, self.id);
|
||||
}
|
||||
|
||||
Variant & variant;
|
||||
@@ -3448,13 +3445,14 @@
|
||||
}
|
||||
|
||||
constexpr explicit value_or_errc(error_type error) :
|
||||
- m_error(std::forward<decltype(error)>(error))
|
||||
+ m_error(std::forward<decltype(error)>(error)),
|
||||
+ m_failure(true)
|
||||
{
|
||||
}
|
||||
|
||||
constexpr value_or_errc(value_or_errc && other) noexcept
|
||||
{
|
||||
- if (other.is_value()) {
|
||||
+ if (other.success()) {
|
||||
if constexpr (!std::is_void_v<Type>) {
|
||||
if constexpr (!std::is_reference_v<Type>) {
|
||||
::new (std::addressof(m_return_value))
|
||||
@@ -3752,16 +3750,16 @@
|
||||
requires(decltype(in.remaining_data()) & data) {
|
||||
(context.*Function)(data);
|
||||
}) {
|
||||
- struct _
|
||||
+ struct guard
|
||||
{
|
||||
decltype(in) archive;
|
||||
decltype(in.remaining_data()) data;
|
||||
- constexpr ~_()
|
||||
+ constexpr ~guard()
|
||||
{
|
||||
archive.position() += data.size();
|
||||
}
|
||||
- } _{in, in.remaining_data()};
|
||||
- return (context.*Function)(_.data);
|
||||
+ } guard{in, in.remaining_data()};
|
||||
+ return (context.*Function)(guard.data);
|
||||
} else {
|
||||
return (context.*Function)();
|
||||
}
|
||||
@@ -3776,16 +3774,16 @@
|
||||
requires(decltype(in.remaining_data()) & data) {
|
||||
Function(data);
|
||||
}) {
|
||||
- struct _
|
||||
+ struct guard
|
||||
{
|
||||
decltype(in) archive;
|
||||
decltype(in.remaining_data()) data;
|
||||
- constexpr ~_()
|
||||
+ constexpr ~guard()
|
||||
{
|
||||
archive.position() += data.size();
|
||||
}
|
||||
- } _{in, in.remaining_data()};
|
||||
- return Function(_.data);
|
||||
+ } guard{in, in.remaining_data()};
|
||||
+ return Function(guard.data);
|
||||
} else {
|
||||
return Function();
|
||||
}
|
||||
@@ -5029,9 +5027,7 @@
|
||||
serialize use();
|
||||
};
|
||||
|
||||
- std::aligned_storage_t<sizeof(value_type),
|
||||
- alignof(value_type)>
|
||||
- storage;
|
||||
+ alignas(value_type) std::byte storage[sizeof(value_type)];
|
||||
|
||||
auto object =
|
||||
access::placement_new<value_type>(std::addressof(storage));
|
||||
@@ -5111,9 +5107,7 @@
|
||||
return errc{};
|
||||
}
|
||||
} else {
|
||||
- std::aligned_storage_t<sizeof(value_type),
|
||||
- alignof(value_type)>
|
||||
- storage;
|
||||
+ alignas(value_type) std::byte storage[sizeof(value_type)];
|
||||
|
||||
auto object = access::placement_new<value_type>(
|
||||
std::addressof(storage));
|
||||
@@ -5382,47 +5376,47 @@
|
||||
};
|
||||
auto align = [](auto v, auto a) { return (v + (a - 1)) / a * a; };
|
||||
|
||||
- auto h0 = big_endian{0x6a09e667u};
|
||||
- auto h1 = big_endian{0xbb67ae85u};
|
||||
- auto h2 = big_endian{0x3c6ef372u};
|
||||
- auto h3 = big_endian{0xa54ff53au};
|
||||
- auto h4 = big_endian{0x510e527fu};
|
||||
- auto h5 = big_endian{0x9b05688cu};
|
||||
- auto h6 = big_endian{0x1f83d9abu};
|
||||
- auto h7 = big_endian{0x5be0cd19u};
|
||||
-
|
||||
- std::array k{big_endian{0x428a2f98u}, big_endian{0x71374491u},
|
||||
- big_endian{0xb5c0fbcfu}, big_endian{0xe9b5dba5u},
|
||||
- big_endian{0x3956c25bu}, big_endian{0x59f111f1u},
|
||||
- big_endian{0x923f82a4u}, big_endian{0xab1c5ed5u},
|
||||
- big_endian{0xd807aa98u}, big_endian{0x12835b01u},
|
||||
- big_endian{0x243185beu}, big_endian{0x550c7dc3u},
|
||||
- big_endian{0x72be5d74u}, big_endian{0x80deb1feu},
|
||||
- big_endian{0x9bdc06a7u}, big_endian{0xc19bf174u},
|
||||
- big_endian{0xe49b69c1u}, big_endian{0xefbe4786u},
|
||||
- big_endian{0x0fc19dc6u}, big_endian{0x240ca1ccu},
|
||||
- big_endian{0x2de92c6fu}, big_endian{0x4a7484aau},
|
||||
- big_endian{0x5cb0a9dcu}, big_endian{0x76f988dau},
|
||||
- big_endian{0x983e5152u}, big_endian{0xa831c66du},
|
||||
- big_endian{0xb00327c8u}, big_endian{0xbf597fc7u},
|
||||
- big_endian{0xc6e00bf3u}, big_endian{0xd5a79147u},
|
||||
- big_endian{0x06ca6351u}, big_endian{0x14292967u},
|
||||
- big_endian{0x27b70a85u}, big_endian{0x2e1b2138u},
|
||||
- big_endian{0x4d2c6dfcu}, big_endian{0x53380d13u},
|
||||
- big_endian{0x650a7354u}, big_endian{0x766a0abbu},
|
||||
- big_endian{0x81c2c92eu}, big_endian{0x92722c85u},
|
||||
- big_endian{0xa2bfe8a1u}, big_endian{0xa81a664bu},
|
||||
- big_endian{0xc24b8b70u}, big_endian{0xc76c51a3u},
|
||||
- big_endian{0xd192e819u}, big_endian{0xd6990624u},
|
||||
- big_endian{0xf40e3585u}, big_endian{0x106aa070u},
|
||||
- big_endian{0x19a4c116u}, big_endian{0x1e376c08u},
|
||||
- big_endian{0x2748774cu}, big_endian{0x34b0bcb5u},
|
||||
- big_endian{0x391c0cb3u}, big_endian{0x4ed8aa4au},
|
||||
- big_endian{0x5b9cca4fu}, big_endian{0x682e6ff3u},
|
||||
- big_endian{0x748f82eeu}, big_endian{0x78a5636fu},
|
||||
- big_endian{0x84c87814u}, big_endian{0x8cc70208u},
|
||||
- big_endian{0x90befffau}, big_endian{0xa4506cebu},
|
||||
- big_endian{0xbef9a3f7u}, big_endian{0xc67178f2u}};
|
||||
+ auto h0 = big_endian{std::uint32_t{0x6a09e667u}};
|
||||
+ auto h1 = big_endian{std::uint32_t{0xbb67ae85u}};
|
||||
+ auto h2 = big_endian{std::uint32_t{0x3c6ef372u}};
|
||||
+ auto h3 = big_endian{std::uint32_t{0xa54ff53au}};
|
||||
+ auto h4 = big_endian{std::uint32_t{0x510e527fu}};
|
||||
+ auto h5 = big_endian{std::uint32_t{0x9b05688cu}};
|
||||
+ auto h6 = big_endian{std::uint32_t{0x1f83d9abu}};
|
||||
+ auto h7 = big_endian{std::uint32_t{0x5be0cd19u}};
|
||||
+
|
||||
+ std::array k{big_endian{std::uint32_t{0x428a2f98u}}, big_endian{std::uint32_t{0x71374491u}},
|
||||
+ big_endian{std::uint32_t{0xb5c0fbcfu}}, big_endian{std::uint32_t{0xe9b5dba5u}},
|
||||
+ big_endian{std::uint32_t{0x3956c25bu}}, big_endian{std::uint32_t{0x59f111f1u}},
|
||||
+ big_endian{std::uint32_t{0x923f82a4u}}, big_endian{std::uint32_t{0xab1c5ed5u}},
|
||||
+ big_endian{std::uint32_t{0xd807aa98u}}, big_endian{std::uint32_t{0x12835b01u}},
|
||||
+ big_endian{std::uint32_t{0x243185beu}}, big_endian{std::uint32_t{0x550c7dc3u}},
|
||||
+ big_endian{std::uint32_t{0x72be5d74u}}, big_endian{std::uint32_t{0x80deb1feu}},
|
||||
+ big_endian{std::uint32_t{0x9bdc06a7u}}, big_endian{std::uint32_t{0xc19bf174u}},
|
||||
+ big_endian{std::uint32_t{0xe49b69c1u}}, big_endian{std::uint32_t{0xefbe4786u}},
|
||||
+ big_endian{std::uint32_t{0x0fc19dc6u}}, big_endian{std::uint32_t{0x240ca1ccu}},
|
||||
+ big_endian{std::uint32_t{0x2de92c6fu}}, big_endian{std::uint32_t{0x4a7484aau}},
|
||||
+ big_endian{std::uint32_t{0x5cb0a9dcu}}, big_endian{std::uint32_t{0x76f988dau}},
|
||||
+ big_endian{std::uint32_t{0x983e5152u}}, big_endian{std::uint32_t{0xa831c66du}},
|
||||
+ big_endian{std::uint32_t{0xb00327c8u}}, big_endian{std::uint32_t{0xbf597fc7u}},
|
||||
+ big_endian{std::uint32_t{0xc6e00bf3u}}, big_endian{std::uint32_t{0xd5a79147u}},
|
||||
+ big_endian{std::uint32_t{0x06ca6351u}}, big_endian{std::uint32_t{0x14292967u}},
|
||||
+ big_endian{std::uint32_t{0x27b70a85u}}, big_endian{std::uint32_t{0x2e1b2138u}},
|
||||
+ big_endian{std::uint32_t{0x4d2c6dfcu}}, big_endian{std::uint32_t{0x53380d13u}},
|
||||
+ big_endian{std::uint32_t{0x650a7354u}}, big_endian{std::uint32_t{0x766a0abbu}},
|
||||
+ big_endian{std::uint32_t{0x81c2c92eu}}, big_endian{std::uint32_t{0x92722c85u}},
|
||||
+ big_endian{std::uint32_t{0xa2bfe8a1u}}, big_endian{std::uint32_t{0xa81a664bu}},
|
||||
+ big_endian{std::uint32_t{0xc24b8b70u}}, big_endian{std::uint32_t{0xc76c51a3u}},
|
||||
+ big_endian{std::uint32_t{0xd192e819u}}, big_endian{std::uint32_t{0xd6990624u}},
|
||||
+ big_endian{std::uint32_t{0xf40e3585u}}, big_endian{std::uint32_t{0x106aa070u}},
|
||||
+ big_endian{std::uint32_t{0x19a4c116u}}, big_endian{std::uint32_t{0x1e376c08u}},
|
||||
+ big_endian{std::uint32_t{0x2748774cu}}, big_endian{std::uint32_t{0x34b0bcb5u}},
|
||||
+ big_endian{std::uint32_t{0x391c0cb3u}}, big_endian{std::uint32_t{0x4ed8aa4au}},
|
||||
+ big_endian{std::uint32_t{0x5b9cca4fu}}, big_endian{std::uint32_t{0x682e6ff3u}},
|
||||
+ big_endian{std::uint32_t{0x748f82eeu}}, big_endian{std::uint32_t{0x78a5636fu}},
|
||||
+ big_endian{std::uint32_t{0x84c87814u}}, big_endian{std::uint32_t{0x8cc70208u}},
|
||||
+ big_endian{std::uint32_t{0x90befffau}}, big_endian{std::uint32_t{0xa4506cebu}},
|
||||
+ big_endian{std::uint32_t{0xbef9a3f7u}}, big_endian{std::uint32_t{0xc67178f2u}}};
|
||||
|
||||
constexpr auto original_message = to_bytes<Object>();
|
||||
constexpr auto chunk_size = 512 / CHAR_BIT;
|
||||
@@ -1,42 +0,0 @@
|
||||
--- ceph-19.2.0/src/googletest/googletest/CMakeLists.txt.orig 2025-01-23 07:43:33.314970694 -0500
|
||||
+++ ceph-19.2.0/src/googletest/googletest/CMakeLists.txt 2025-01-23 07:44:13.529250429 -0500
|
||||
@@ -63,6 +63,8 @@
|
||||
set_up_hermetic_build()
|
||||
endif()
|
||||
|
||||
+option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
|
||||
+
|
||||
# These commands only run if this is the main project
|
||||
if(CMAKE_PROJECT_NAME STREQUAL "gtest" OR CMAKE_PROJECT_NAME STREQUAL "googletest-distribution")
|
||||
|
||||
@@ -126,9 +128,9 @@
|
||||
# are used for other targets, to ensure that gtest can be compiled by a user
|
||||
# aggressive about warnings.
|
||||
cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
|
||||
-set_target_properties(gtest PROPERTIES VERSION ${GOOGLETEST_VERSION})
|
||||
+#set_target_properties(gtest PROPERTIES VERSION ${GOOGLETEST_VERSION})
|
||||
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)
|
||||
-set_target_properties(gtest_main PROPERTIES VERSION ${GOOGLETEST_VERSION})
|
||||
+#set_target_properties(gtest_main PROPERTIES VERSION ${GOOGLETEST_VERSION})
|
||||
# If the CMake version supports it, attach header directory information
|
||||
# to the targets for when we are part of a parent build (ie being pulled
|
||||
# in via add_subdirectory() rather than being a standalone build).
|
||||
--- ceph-19.2.0/src/googletest/googlemock/CMakeLists.txt.orig 2025-01-23 07:40:52.399853240 -0500
|
||||
+++ ceph-19.2.0/src/googletest/googlemock/CMakeLists.txt 2025-01-23 07:43:18.466236642 -0500
|
||||
@@ -54,6 +54,7 @@
|
||||
# if they are the same (the default).
|
||||
add_subdirectory("${gtest_dir}" "${gmock_BINARY_DIR}/${gtest_dir}")
|
||||
|
||||
+option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
|
||||
|
||||
# These commands only run if this is the main project
|
||||
if(CMAKE_PROJECT_NAME STREQUAL "gmock" OR CMAKE_PROJECT_NAME STREQUAL "googletest-distribution")
|
||||
@@ -100,7 +101,7 @@
|
||||
else()
|
||||
cxx_library(gmock "${cxx_strict}" src/gmock-all.cc)
|
||||
target_link_libraries(gmock PUBLIC gtest)
|
||||
- set_target_properties(gmock PROPERTIES VERSION ${GOOGLETEST_VERSION})
|
||||
+ # set_target_properties(gmock PROPERTIES VERSION ${GOOGLETEST_VERSION})
|
||||
cxx_library(gmock_main "${cxx_strict}" src/gmock_main.cc)
|
||||
target_link_libraries(gmock_main PUBLIC gmock)
|
||||
set_target_properties(gmock_main PROPERTIES VERSION ${GOOGLETEST_VERSION})
|
||||
@@ -1,11 +0,0 @@
|
||||
--- ceph-19.2.0/src/tracing/CMakeLists.txt.orig 2025-01-23 17:51:43.874162594 -0500
|
||||
+++ ceph-19.2.0/src/tracing/CMakeLists.txt 2025-01-23 17:54:21.877186735 -0500
|
||||
@@ -6,6 +6,8 @@
|
||||
set(header_dir ${working_dir}/tracing)
|
||||
file(MAKE_DIRECTORY ${header_dir})
|
||||
|
||||
+set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu23")
|
||||
+
|
||||
add_custom_target(tracepoint_libraries)
|
||||
|
||||
file(GLOB tps "*.tp")
|
||||
@@ -1,30 +0,0 @@
|
||||
--- ceph-19.2.0/src/test/neorados/common_tests.h.orig 2024-09-18 12:27:51.000000000 -0400
|
||||
+++ ceph-19.2.0/src/test/neorados/common_tests.h 2025-01-26 19:31:32.545762972 -0500
|
||||
@@ -47,6 +47,18 @@
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
+#if !defined(GTEST_DISALLOW_COPY_AND_ASSIGN_)
|
||||
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
|
||||
+ type(type const&) = delete; \
|
||||
+ type& operator=(type const&) = delete
|
||||
+#endif
|
||||
+
|
||||
+#if !defined(GTEST_DISALLOW_MOVE_AND_ASSIGN_)
|
||||
+#define GTEST_DISALLOW_MOVE_AND_ASSIGN_(type) \
|
||||
+ type(type&&) noexcept = delete; \
|
||||
+ type& operator=(type&&) noexcept = delete
|
||||
+#endif
|
||||
+
|
||||
/// \file test/neorados/common_tests.h
|
||||
///
|
||||
/// \brief Tools for testing neorados code
|
||||
@@ -398,7 +410,7 @@
|
||||
\
|
||||
private: \
|
||||
boost::asio::awaitable<void> CoTestBody() override; \
|
||||
- static ::testing::TestInfo *const test_info_ GTEST_ATTRIBUTE_UNUSED_; \
|
||||
+ static ::testing::TestInfo *const test_info_ __attribute__((unused)); \
|
||||
}; \
|
||||
\
|
||||
::testing::TestInfo *const GTEST_TEST_CLASS_NAME_(test_suite_name, \
|
||||
@@ -1,52 +0,0 @@
|
||||
--- ceph-19.2.2/src/pybind/cephfs/setup.py.orig 2025-05-29 15:51:00.656323008 -0400
|
||||
+++ ceph-19.2.2/src/pybind/cephfs/setup.py 2025-05-29 15:52:13.215102123 -0400
|
||||
@@ -1,11 +1,11 @@
|
||||
import os
|
||||
-import pkgutil
|
||||
+import importlib.util
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import textwrap
|
||||
-if not pkgutil.find_loader('setuptools'):
|
||||
+if not importlib.util.find_spec('setuptools'):
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
else:
|
||||
--- ceph-19.2.2/src/pybind/rbd/setup.py.orig 2025-05-29 15:48:35.863759314 -0400
|
||||
+++ ceph-19.2.2/src/pybind/rbd/setup.py 2025-05-29 15:50:05.529742462 -0400
|
||||
@@ -1,11 +1,11 @@
|
||||
import os
|
||||
-import pkgutil
|
||||
+import importlib.util
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import textwrap
|
||||
-if not pkgutil.find_loader('setuptools'):
|
||||
+if not importlib.util.find_spec('setuptools'):
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
else:
|
||||
--- ceph-19.2.2/src/pybind/rgw/setup.py.orig 2025-05-29 15:44:13.673781032 -0400
|
||||
+++ ceph-19.2.2/src/pybind/rgw/setup.py 2025-05-29 15:48:23.444285313 -0400
|
||||
@@ -1,5 +1,5 @@
|
||||
-import pkgutil
|
||||
-if not pkgutil.find_loader('setuptools'):
|
||||
+import importlib.util
|
||||
+if not importlib.util.find_spec('setuptools'):
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
else:
|
||||
--- ceph-19.2.2/src/pybind/rados/setup.py.orig 2025-05-29 15:50:14.768095133 -0400
|
||||
+++ ceph-19.2.2/src/pybind/rados/setup.py 2025-05-29 15:50:46.003687955 -0400
|
||||
@@ -1,5 +1,5 @@
|
||||
-import pkgutil
|
||||
-if not pkgutil.find_loader('setuptools'):
|
||||
+import importlib.util
|
||||
+if not importlib.util.find_spec('setuptools'):
|
||||
from distutils.core import setup
|
||||
from distutils.extension import Extension
|
||||
else:
|
||||
@@ -1,845 +0,0 @@
|
||||
diff -ur ceph-19.2.2/src/s3select.orig/include/encryption_internal_19.h ceph-19.2.2/src/s3select/include/encryption_internal_19.h
|
||||
--- ceph-19.2.2/src/s3select.orig/include/encryption_internal_19.h 2025-07-07 13:17:09.262618668 -0400
|
||||
+++ ceph-19.2.2/src/s3select/include/encryption_internal_19.h 2025-07-07 13:08:00.746355226 -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
|
||||
diff -ur ceph-19.2.2/src/s3select.orig/include/encryption_internal_20.h ceph-19.2.2/src/s3select/include/encryption_internal_20.h
|
||||
--- ceph-19.2.2/src/s3select.orig/include/encryption_internal_20.h 2025-07-07 13:17:09.262618668 -0400
|
||||
+++ ceph-19.2.2/src/s3select/include/encryption_internal_20.h 2025-07-07 13:08:00.746536155 -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
|
||||
diff -ur ceph-19.2.2/src/s3select.orig/include/encryption_internal.h ceph-19.2.2/src/s3select/include/encryption_internal.h
|
||||
--- ceph-19.2.2/src/s3select.orig/include/encryption_internal.h 2024-03-26 19:23:12.000000000 -0400
|
||||
+++ ceph-19.2.2/src/s3select/include/encryption_internal.h 2025-07-07 13:08:00.745633149 -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
|
||||
diff -ur ceph-19.2.2/src/s3select.orig/include/internal_file_decryptor_19.h ceph-19.2.2/src/s3select/include/internal_file_decryptor_19.h
|
||||
--- ceph-19.2.2/src/s3select.orig/include/internal_file_decryptor_19.h 2025-07-07 13:17:58.730837390 -0400
|
||||
+++ ceph-19.2.2/src/s3select/include/internal_file_decryptor_19.h 2025-07-07 13:08:00.746893764 -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
|
||||
diff -ur ceph-19.2.2/src/s3select.orig/include/internal_file_decryptor_20.h ceph-19.2.2/src/s3select/include/internal_file_decryptor_20.h
|
||||
--- ceph-19.2.2/src/s3select.orig/include/internal_file_decryptor_20.h 2025-07-07 13:17:58.730837390 -0400
|
||||
+++ ceph-19.2.2/src/s3select/include/internal_file_decryptor_20.h 2025-07-07 13:08:00.747082281 -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
|
||||
diff -ur ceph-19.2.2/src/s3select.orig/include/internal_file_decryptor.h ceph-19.2.2/src/s3select/include/internal_file_decryptor.h
|
||||
--- ceph-19.2.2/src/s3select.orig/include/internal_file_decryptor.h 2024-03-26 19:23:12.000000000 -0400
|
||||
+++ ceph-19.2.2/src/s3select/include/internal_file_decryptor.h 2025-07-07 13:08:00.746720961 -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
|
||||
diff -ur ceph-19.2.2/src/s3select.orig/include/s3select_parquet_intrf.h ceph-19.2.2/src/s3select/include/s3select_parquet_intrf.h
|
||||
--- ceph-19.2.2/src/s3select.orig/include/s3select_parquet_intrf.h 2024-03-26 19:23:12.000000000 -0400
|
||||
+++ ceph-19.2.2/src/s3select/include/s3select_parquet_intrf.h 2025-07-07 13:08:00.747275733 -0400
|
||||
@@ -983,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;
|
||||
@@ -1016,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:
|
||||
@@ -1052,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 {
|
||||
@@ -1230,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;
|
||||
@@ -1259,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
|
||||
@@ -1,37 +0,0 @@
|
||||
From 8c78a22d2cf69892570f635735d9735169b64a75 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Sabaini <peter.sabaini@canonical.com>
|
||||
Date: Wed, 11 Sep 2024 16:56:50 +0200
|
||||
Subject: [PATCH] ceph-volume: fix importlib.metadata compat
|
||||
|
||||
The importlib.metadata library removed older shims in releases >5.0.0
|
||||
where EntryPoints objects use .select() instead of dict-like access.
|
||||
|
||||
Fixes: https://tracker.ceph.com/issues/68032
|
||||
|
||||
Signed-off-by: Peter Sabaini <peter.sabaini@canonical.com>
|
||||
---
|
||||
src/ceph-volume/ceph_volume/main.py | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/ceph-volume/ceph_volume/main.py b/src/ceph-volume/ceph_volume/main.py
|
||||
index f8eca65ec497c..4f27f429e89e2 100644
|
||||
--- a/src/ceph-volume/ceph_volume/main.py
|
||||
+++ b/src/ceph-volume/ceph_volume/main.py
|
||||
@@ -11,8 +11,16 @@
|
||||
from importlib.metadata import entry_points
|
||||
|
||||
def get_entry_points(group: str): # type: ignore
|
||||
- return entry_points().get(group, []) # type: ignore
|
||||
+ eps = entry_points()
|
||||
+ if hasattr(eps, 'select'):
|
||||
+ # New importlib.metadata uses .select()
|
||||
+ return eps.select(group=group)
|
||||
+ else:
|
||||
+ # Fallback to older EntryPoints that returns dicts
|
||||
+ return eps.get(group, []) # type: ignore
|
||||
+
|
||||
except ImportError:
|
||||
+ # Fallback to `pkg_resources` for older versions
|
||||
from pkg_resources import iter_entry_points as entry_points # type: ignore
|
||||
|
||||
def get_entry_points(group: str): # type: ignore
|
||||
@@ -1,53 +0,0 @@
|
||||
From 5924df771f850c249396a37a62f97ac242bf2f96 Mon Sep 17 00:00:00 2001
|
||||
From: Hector Martin <marcan@marcan.st>
|
||||
Date: Wed, 20 Aug 2025 13:34:08 +0900
|
||||
Subject: [PATCH 1/2] mgr/dashboard: Make saml2 robust against module load
|
||||
errors
|
||||
|
||||
Loading saml2 can fail due to issues with the xmlsec package (possibly
|
||||
subinterpreter related):
|
||||
|
||||
File "/usr/share/ceph/mgr/dashboard/controllers/saml2.py", line 6, in <module>
|
||||
from onelogin.saml2.auth import OneLogin_Saml2_Auth
|
||||
File "/lib/python3.13/site-packages/onelogin/saml2/auth.py", line 12, in <module>
|
||||
import xmlsec
|
||||
xmlsec.Error: (100, 'lxml & xmlsec libxml2 library version mismatch')
|
||||
|
||||
Instead of taking down the entire dashboard module, treat this exception
|
||||
like a missing saml2 package.
|
||||
|
||||
Signed-off-by: Hector Martin <marcan@marcan.st>
|
||||
---
|
||||
src/pybind/mgr/dashboard/controllers/saml2.py | 2 +-
|
||||
src/pybind/mgr/dashboard/services/sso.py | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/pybind/mgr/dashboard/controllers/saml2.py b/src/pybind/mgr/dashboard/controllers/saml2.py
|
||||
index c11b18a27bc7..e859f558cdc4 100644
|
||||
--- a/src/pybind/mgr/dashboard/controllers/saml2.py
|
||||
+++ b/src/pybind/mgr/dashboard/controllers/saml2.py
|
||||
@@ -8,7 +8,7 @@ try:
|
||||
from onelogin.saml2.settings import OneLogin_Saml2_Settings
|
||||
|
||||
python_saml_imported = True
|
||||
-except ImportError:
|
||||
+except Exception:
|
||||
python_saml_imported = False
|
||||
|
||||
from .. import mgr
|
||||
diff --git a/src/pybind/mgr/dashboard/services/sso.py b/src/pybind/mgr/dashboard/services/sso.py
|
||||
index 2290e6ea3e15..38910ca4aa34 100644
|
||||
--- a/src/pybind/mgr/dashboard/services/sso.py
|
||||
+++ b/src/pybind/mgr/dashboard/services/sso.py
|
||||
@@ -20,7 +20,7 @@ try:
|
||||
from onelogin.saml2.settings import OneLogin_Saml2_Settings as Saml2Settings
|
||||
|
||||
python_saml_imported = True
|
||||
-except ImportError:
|
||||
+except Exception:
|
||||
python_saml_imported = False
|
||||
|
||||
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
From 76af91b516bb31ae0a79f55f315bef2c2105a06e Mon Sep 17 00:00:00 2001
|
||||
From: Nizamudeen A <nia@redhat.com>
|
||||
Date: Thu, 26 Jun 2025 12:55:22 +0530
|
||||
Subject: [PATCH 2/2] mgr/dashboard: catch protobuf error due to mismatch in
|
||||
version
|
||||
|
||||
Signed-off-by: Nizamudeen A <nia@redhat.com>
|
||||
(cherry picked from commit acb0f19c4a50b2ea68f328a61a14a2da06be298b)
|
||||
|
||||
Conflicts:
|
||||
src/pybind/mgr/dashboard/services/nvmeof_client.py
|
||||
- only kept relavant portion applicable for squid
|
||||
---
|
||||
src/pybind/mgr/dashboard/services/nvmeof_client.py | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/src/pybind/mgr/dashboard/services/nvmeof_client.py b/src/pybind/mgr/dashboard/services/nvmeof_client.py
|
||||
index e0ea6d1e48b3..be2b5edbaa52 100644
|
||||
--- a/src/pybind/mgr/dashboard/services/nvmeof_client.py
|
||||
+++ b/src/pybind/mgr/dashboard/services/nvmeof_client.py
|
||||
@@ -1,3 +1,5 @@
|
||||
+# pylint: disable=unexpected-keyword-arg
|
||||
+
|
||||
import functools
|
||||
import logging
|
||||
from collections.abc import Iterable
|
||||
@@ -9,6 +11,14 @@ from .nvmeof_conf import NvmeofGatewaysConfig
|
||||
logger = logging.getLogger("nvmeof_client")
|
||||
|
||||
try:
|
||||
+ # if the protobuf version is newer than what we generated with
|
||||
+ # proto file import will fail (because of differences between what's
|
||||
+ # available in centos and ubuntu).
|
||||
+ # this "hack" should be removed once we update both the
|
||||
+ # distros; centos and ubuntu.
|
||||
+ import os
|
||||
+ os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python"
|
||||
+
|
||||
import grpc # type: ignore
|
||||
import grpc._channel # type: ignore
|
||||
from google.protobuf.message import Message # type: ignore
|
||||
--
|
||||
2.50.1
|
||||
|
||||
@@ -1,152 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Max R. Carrara" <m.carrara@proxmox.com>
|
||||
Date: Wed, 16 Jul 2025 13:14:39 +0200
|
||||
Subject: [PATCH 58/59] pybind/mgr/restful: provide workaround for PyO3
|
||||
ImportError
|
||||
|
||||
Move the self-signed cert generation into a separate module
|
||||
inside python-common/ceph and run the module in a separate Python
|
||||
process.
|
||||
|
||||
This provides a workaround for the ImportError thrown by PyO3 when
|
||||
the `restful` module is loaded in the context of multiple Python
|
||||
sub-interpreters being present. In particular, the ImportError is
|
||||
thrown by the `crypto` module of the `OpenSSL` package.
|
||||
|
||||
Inspired by an upstream PR [0].
|
||||
|
||||
[0]: https://github.com/ceph/ceph/pull/62951
|
||||
|
||||
Signed-off-by: Max R. Carrara <m.carrara@proxmox.com>
|
||||
---
|
||||
src/pybind/mgr/restful/module.py | 24 +++------
|
||||
src/python-common/ceph/_crypto_wrap.py | 69 ++++++++++++++++++++++++++
|
||||
2 files changed, 76 insertions(+), 17 deletions(-)
|
||||
create mode 100644 src/python-common/ceph/_crypto_wrap.py
|
||||
|
||||
diff --git a/src/pybind/mgr/restful/module.py b/src/pybind/mgr/restful/module.py
|
||||
index 0f8c78e0bd8..7f93c41f1e6 100644
|
||||
--- a/src/pybind/mgr/restful/module.py
|
||||
+++ b/src/pybind/mgr/restful/module.py
|
||||
@@ -7,6 +7,7 @@ import json
|
||||
import time
|
||||
import errno
|
||||
import inspect
|
||||
+import subprocess
|
||||
import tempfile
|
||||
import threading
|
||||
import traceback
|
||||
@@ -19,7 +20,6 @@ from . import context
|
||||
|
||||
from uuid import uuid4
|
||||
from pecan import jsonify, make_app
|
||||
-from OpenSSL import crypto
|
||||
from pecan.rest import RestController
|
||||
from werkzeug.serving import make_server, make_ssl_devcert
|
||||
|
||||
@@ -401,24 +401,14 @@ class Module(MgrModule):
|
||||
|
||||
|
||||
def create_self_signed_cert(self):
|
||||
- # create a key pair
|
||||
- pkey = crypto.PKey()
|
||||
- pkey.generate_key(crypto.TYPE_RSA, 2048)
|
||||
-
|
||||
- # create a self-signed cert
|
||||
- cert = crypto.X509()
|
||||
- cert.get_subject().O = "IT"
|
||||
- cert.get_subject().CN = "ceph-restful"
|
||||
- cert.set_serial_number(int(uuid4()))
|
||||
- cert.gmtime_adj_notBefore(0)
|
||||
- cert.gmtime_adj_notAfter(10*365*24*60*60)
|
||||
- cert.set_issuer(cert.get_subject())
|
||||
- cert.set_pubkey(pkey)
|
||||
- cert.sign(pkey, 'sha512')
|
||||
+ cmd = ["python3", "-m", "ceph._crypto_wrap", "create_self_signed_cert"]
|
||||
+
|
||||
+ response = subprocess.run(cmd, capture_output=True, check=True)
|
||||
+ response_obj = json.loads(response.stdout)
|
||||
|
||||
return (
|
||||
- crypto.dump_certificate(crypto.FILETYPE_PEM, cert),
|
||||
- crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)
|
||||
+ response_obj["cert"].encode("utf-8"),
|
||||
+ response_obj["key"].encode("utf-8"),
|
||||
)
|
||||
|
||||
|
||||
diff --git a/src/python-common/ceph/_crypto_wrap.py b/src/python-common/ceph/_crypto_wrap.py
|
||||
new file mode 100644
|
||||
index 00000000000..16a19a5345e
|
||||
--- /dev/null
|
||||
+++ b/src/python-common/ceph/_crypto_wrap.py
|
||||
@@ -0,0 +1,69 @@
|
||||
+"""CLI wrapper for cryptographic functions of the :mod:`restful` module.
|
||||
+
|
||||
+To be called via :func:`subprocess.run()` as a workaround for
|
||||
+:class:`ImportError`s related to PyO3's current lack of sub-interpreter
|
||||
+support.
|
||||
+
|
||||
+Note:
|
||||
+ Since this module is installed as part of the ``ceph`` package,
|
||||
+ it should be called like so::
|
||||
+
|
||||
+ python3 -m ceph._crypto_wrap create_self_signed_cert
|
||||
+"""
|
||||
+
|
||||
+import argparse
|
||||
+import sys
|
||||
+import json
|
||||
+
|
||||
+from argparse import Namespace
|
||||
+from typing import Any
|
||||
+from uuid import uuid4
|
||||
+
|
||||
+from OpenSSL import crypto
|
||||
+
|
||||
+
|
||||
+def _respond(data: dict[str, Any]) -> None:
|
||||
+ json.dump(data, sys.stdout)
|
||||
+ sys.stdout.flush()
|
||||
+
|
||||
+
|
||||
+def create_self_signed_cert(args: Namespace) -> None:
|
||||
+ cert_key_pair = _create_self_signed_cert()
|
||||
+ _respond(cert_key_pair)
|
||||
+
|
||||
+
|
||||
+def _create_self_signed_cert() -> dict[str, str]:
|
||||
+ # create a key pair
|
||||
+ pubkey = crypto.PKey()
|
||||
+ pubkey.generate_key(crypto.TYPE_RSA, 2048)
|
||||
+
|
||||
+ # create a self-signed cert
|
||||
+ cert = crypto.X509()
|
||||
+ cert.get_subject().O = "IT"
|
||||
+ cert.get_subject().CN = "ceph-restful"
|
||||
+ cert.set_serial_number(int(uuid4()))
|
||||
+ cert.gmtime_adj_notBefore(0)
|
||||
+ cert.gmtime_adj_notAfter(10 * 365 * 24 * 60 * 60)
|
||||
+ cert.set_issuer(cert.get_subject())
|
||||
+ cert.set_pubkey(pubkey)
|
||||
+ cert.sign(pubkey, "sha512")
|
||||
+
|
||||
+ return {
|
||||
+ "cert": crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode(),
|
||||
+ "key": crypto.dump_privatekey(crypto.FILETYPE_PEM, pubkey).decode(),
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+def main() -> None:
|
||||
+ parser = argparse.ArgumentParser(prog="_crypto_wrap.py")
|
||||
+ subparsers = parser.add_subparsers(required=True)
|
||||
+
|
||||
+ parser_cssc = subparsers.add_parser("create_self_signed_cert")
|
||||
+ parser_cssc.set_defaults(func=create_self_signed_cert)
|
||||
+
|
||||
+ args = parser.parse_args()
|
||||
+ args.func(args)
|
||||
+
|
||||
+
|
||||
+if __name__ == "__main__":
|
||||
+ main()
|
||||
@@ -1,56 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Max R. Carrara" <m.carrara@proxmox.com>
|
||||
Date: Wed, 16 Jul 2025 16:31:43 +0200
|
||||
Subject: [PATCH 59/59] mgr: fix module import by making NOTIFY_TYPES in py
|
||||
modules optional
|
||||
|
||||
If NOTIFY_TYPES isn't an attribute of the passed class, the Python
|
||||
(sub-)interpreter raises an AttributeError that must be handled or cleared
|
||||
explicitly via the Python C-API. Unfortunately, this isn't done here,
|
||||
which means that the exception sticks around until handled.
|
||||
|
||||
This caused a call to PyModule::load_subclass_of() to fail and
|
||||
incorrectly report the AttributeError as cause.
|
||||
|
||||
Checking whether the class has NOTIFY_TYPES as attribute in the first
|
||||
place fixes this.
|
||||
|
||||
Note that there's an upstream PR [0] that wasn't backported that aimed
|
||||
to fix this, but does so incorrectly, as the exception is still not
|
||||
cleared there. The warnings regarding NOTIFY_TYPES missing also occurs
|
||||
on Reef but doesn't cause any module imports to fail there. As the
|
||||
affected Ceph code has stayed mostly the same between bookworm and
|
||||
trixie releases, this suggests that some behavior between Python 3.11
|
||||
and 3.13 likely changed.
|
||||
|
||||
Either way, avoiding the AttributeError altogether fixes this.
|
||||
|
||||
[0]: https://github.com/ceph/ceph/pull/57106
|
||||
|
||||
Signed-off-by: Max R. Carrara <m.carrara@proxmox.com>
|
||||
---
|
||||
src/mgr/PyModule.cc | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/mgr/PyModule.cc b/src/mgr/PyModule.cc
|
||||
index 084cf3ffc1e..e6fd269dca5 100644
|
||||
--- a/src/mgr/PyModule.cc
|
||||
+++ b/src/mgr/PyModule.cc
|
||||
@@ -513,11 +513,13 @@ int PyModule::register_options(PyObject *cls)
|
||||
|
||||
int PyModule::load_notify_types()
|
||||
{
|
||||
- PyObject *ls = PyObject_GetAttrString(pClass, "NOTIFY_TYPES");
|
||||
- if (ls == nullptr) {
|
||||
- derr << "Module " << get_name() << " has missing NOTIFY_TYPES member" << dendl;
|
||||
- return -EINVAL;
|
||||
+ if (!PyObject_HasAttrString(pClass, "NOTIFY_TYPES")) {
|
||||
+ dout(10) << "Module " << get_name() << " has no NOTIFY_TYPES member" << dendl;
|
||||
+ return 0;
|
||||
}
|
||||
+
|
||||
+ PyObject *ls = PyObject_GetAttrString(pClass, "NOTIFY_TYPES");
|
||||
+
|
||||
if (!PyObject_TypeCheck(ls, &PyList_Type)) {
|
||||
// Relatively easy mistake for human to make, e.g. defining COMMANDS
|
||||
// as a {} instead of a []
|
||||
@@ -0,0 +1,58 @@
|
||||
commit f9aea9105b6c1a8d7bff0ec0675f84f2ffb1db6f
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Wed Dec 20 14:16:19 2023 +0100
|
||||
|
||||
tracing: Fix C type errors in librados tracing
|
||||
|
||||
This fixes type errors like this:
|
||||
|
||||
In file included from /usr/include/lttng/tracepoint-event.h:69,
|
||||
from …-build/include/tracing/librados.h:4143,
|
||||
from …/src/tracing/librados.c:6
|
||||
:
|
||||
…-build/include/tracing/librados.h:
|
||||
In function ‘lttng_ust__event_probe__librados___rados_mon_command_exit’:
|
||||
…-build/include/tracing/librados.h:477:9: error: initialization of ‘size_t’ {aka ‘long unsigned int’} from ‘size_t *’ {aka ‘long unsigned int *’} makes integer from pointer without a cast
|
||||
477 | ceph_ctf_integerp(size_t, outslen, outslen)
|
||||
| ^~~~~~~~~~~~~~~~~
|
||||
|
||||
GCC 14 will likely treat these type mismatches as an error
|
||||
and fail the build.
|
||||
|
||||
Signed-off-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
diff --git a/src/tracing/librados.tp b/src/tracing/librados.tp
|
||||
index 8b5e78ef15..8e116124b8 100644
|
||||
--- a/src/tracing/librados.tp
|
||||
+++ b/src/tracing/librados.tp
|
||||
@@ -2628,7 +2628,7 @@ TRACEPOINT_EVENT(librados, rados_watch3_enter,
|
||||
TP_FIELDS(
|
||||
ctf_integer_hex(rados_ioctx_t, ioctx, ioctx)
|
||||
ctf_string(oid, oid)
|
||||
- ctf_integer_hex(uint64_t, phandle, phandle)
|
||||
+ ctf_integer_hex(uint64_t*, phandle, phandle)
|
||||
ctf_integer_hex(rados_watchcb2_t, callback, callback)
|
||||
ctf_integer(uint32_t, timeout, timeout)
|
||||
ctf_integer_hex(void*, arg, arg)
|
||||
@@ -2658,7 +2658,7 @@ TRACEPOINT_EVENT(librados, rados_aio_watch2_enter,
|
||||
ctf_integer_hex(rados_ioctx_t, ioctx, ioctx)
|
||||
ctf_string(oid, oid)
|
||||
ctf_integer_hex(rados_completion_t, completion, completion)
|
||||
- ctf_integer_hex(uint64_t, phandle, phandle)
|
||||
+ ctf_integer_hex(uint64_t*, phandle, phandle)
|
||||
ctf_integer_hex(rados_watchcb2_t, callback, callback)
|
||||
ctf_integer(uint32_t, timeout, timeout)
|
||||
ctf_integer_hex(void*, arg, arg)
|
||||
diff --git a/src/tracing/tracing-common.h b/src/tracing/tracing-common.h
|
||||
index 3e07f9de8e..03449ab588 100644
|
||||
--- a/src/tracing/tracing-common.h
|
||||
+++ b/src/tracing/tracing-common.h
|
||||
@@ -21,7 +21,7 @@
|
||||
// type should be an integer type
|
||||
// val should have type type*
|
||||
#define ceph_ctf_integerp(type, field, val) \
|
||||
- ctf_integer(type, field, (val) == NULL ? 0 : (val)) \
|
||||
+ ctf_integer(type, field, (val) == NULL ? 0 : *(val)) \
|
||||
ctf_integer(uint8_t, field##_isnull, (val) == NULL)
|
||||
|
||||
// val should have type char*
|
||||
@@ -0,0 +1,178 @@
|
||||
commit a49d154f4a8e493baf2296a15c7b5c56cd25e993
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Wed Dec 20 14:59:19 2023 +0100
|
||||
|
||||
pybind: Fix C type errors in Cython-generated Python bindings
|
||||
|
||||
Several Ceph APIs use bool * types, which correspond to
|
||||
libcpp.bool * types in Cython. The bint type has an incorrect
|
||||
size 4 and cannot be used as a replacement.
|
||||
|
||||
This prevents a compilation failure with future compilers:
|
||||
|
||||
…-build/src/pybind/rbd/rbd.c: In function ‘__pyx_pf_3rbd_3RBD_104namespace_exists’:
|
||||
…-build/src/pybind/rbd/rbd.c:42165:76: error: passing argument 3 of ‘rbd_namespace_exists’ from incompatible pointer type
|
||||
42165 | __pyx_v_ret = rbd_namespace_exists(__pyx_v__ioctx, __pyx_v__name, (&__pyx_v__exists));
|
||||
| ~^~~~~~~~~~~~~~~~~
|
||||
| |
|
||||
| int *
|
||||
In file included from …-build/src/pybind/rbd/rbd.c:1268:
|
||||
…/src/include/rbd/librbd.h:1496:45: note: expected ‘_Bool *’ but argument is of type ‘int *’
|
||||
1496 | bool *exists);
|
||||
| ^
|
||||
|
||||
Signed-off-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
diff --git a/src/pybind/rbd/c_rbd.pxd b/src/pybind/rbd/c_rbd.pxd
|
||||
index 885f7bd46a..bda23bbc47 100644
|
||||
--- a/src/pybind/rbd/c_rbd.pxd
|
||||
+++ b/src/pybind/rbd/c_rbd.pxd
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
from libc.stdint cimport *
|
||||
from ctime cimport time_t, timespec
|
||||
+cimport libcpp
|
||||
|
||||
cdef extern from "rados/librados.h":
|
||||
enum:
|
||||
@@ -525,7 +526,7 @@ cdef extern from "rbd/librbd.h" nogil:
|
||||
int rbd_snap_unprotect(rbd_image_t image, const char *snap_name)
|
||||
int rbd_snap_is_protected(rbd_image_t image, const char *snap_name,
|
||||
int *is_protected)
|
||||
- int rbd_snap_exists(rbd_image_t image, const char *snapname, bint *exists)
|
||||
+ int rbd_snap_exists(rbd_image_t image, const char *snapname, libcpp.bool *exists)
|
||||
int rbd_snap_get_limit(rbd_image_t image, uint64_t *limit)
|
||||
int rbd_snap_set_limit(rbd_image_t image, uint64_t limit)
|
||||
int rbd_snap_get_timestamp(rbd_image_t image, uint64_t snap_id, timespec *timestamp)
|
||||
@@ -711,7 +712,7 @@ cdef extern from "rbd/librbd.h" nogil:
|
||||
int rbd_namespace_list(rados_ioctx_t io, char *namespace_names,
|
||||
size_t *size)
|
||||
int rbd_namespace_exists(rados_ioctx_t io, const char *namespace_name,
|
||||
- bint *exists)
|
||||
+ libcpp.bool *exists)
|
||||
|
||||
int rbd_pool_init(rados_ioctx_t, bint force)
|
||||
|
||||
diff --git a/src/pybind/rbd/mock_rbd.pxi b/src/pybind/rbd/mock_rbd.pxi
|
||||
index 11872bd814..364f965fba 100644
|
||||
--- a/src/pybind/rbd/mock_rbd.pxi
|
||||
+++ b/src/pybind/rbd/mock_rbd.pxi
|
||||
@@ -3,6 +3,11 @@
|
||||
from libc.stdint cimport *
|
||||
from ctime cimport time_t, timespec
|
||||
|
||||
+# Make the bool type available as libcpp.bool, for both C and C++.
|
||||
+cimport libcpp
|
||||
+cdef extern from "<stdbool.h>":
|
||||
+ pass
|
||||
+
|
||||
cdef nogil:
|
||||
enum:
|
||||
_LIBRADOS_SNAP_HEAD "LIBRADOS_SNAP_HEAD"
|
||||
@@ -637,7 +642,7 @@ cdef nogil:
|
||||
int rbd_snap_is_protected(rbd_image_t image, const char *snap_name,
|
||||
int *is_protected):
|
||||
pass
|
||||
- int rbd_snap_exists(rbd_image_t image, const char *snapname, bint *exists):
|
||||
+ int rbd_snap_exists(rbd_image_t image, const char *snapname, libcpp.bool *exists):
|
||||
pass
|
||||
int rbd_snap_get_limit(rbd_image_t image, uint64_t *limit):
|
||||
pass
|
||||
@@ -896,7 +901,7 @@ cdef nogil:
|
||||
size_t *size):
|
||||
pass
|
||||
int rbd_namespace_exists(rados_ioctx_t io, const char *namespace_name,
|
||||
- bint *exists):
|
||||
+ libcpp.bool *exists):
|
||||
pass
|
||||
int rbd_pool_init(rados_ioctx_t io, bint force):
|
||||
pass
|
||||
diff --git a/src/pybind/rbd/rbd.pyx b/src/pybind/rbd/rbd.pyx
|
||||
index fcb2fb3470..f59ba23f0f 100644
|
||||
--- a/src/pybind/rbd/rbd.pyx
|
||||
+++ b/src/pybind/rbd/rbd.pyx
|
||||
@@ -23,6 +23,7 @@ from libc cimport errno
|
||||
from libc.stdint cimport *
|
||||
from libc.stdlib cimport malloc, realloc, free
|
||||
from libc.string cimport strdup, memset
|
||||
+cimport libcpp
|
||||
|
||||
try:
|
||||
from collections.abc import Iterable
|
||||
@@ -1935,12 +1936,12 @@ class RBD(object):
|
||||
cdef:
|
||||
rados_ioctx_t _ioctx = convert_ioctx(ioctx)
|
||||
const char *_name = name
|
||||
- bint _exists = False
|
||||
+ libcpp.bool _exists = False
|
||||
with nogil:
|
||||
ret = rbd_namespace_exists(_ioctx, _name, &_exists)
|
||||
if ret != 0:
|
||||
raise make_ex(ret, 'error verifying namespace')
|
||||
- return bool(_exists != 0)
|
||||
+ return _exists
|
||||
|
||||
def namespace_list(self, ioctx):
|
||||
"""
|
||||
@@ -3679,12 +3680,12 @@ cdef class Image(object):
|
||||
name = cstr(name, 'name')
|
||||
cdef:
|
||||
char *_name = name
|
||||
- bint _exists = False
|
||||
+ libcpp.bool _exists = False
|
||||
with nogil:
|
||||
ret = rbd_snap_exists(self.image, _name, &_exists)
|
||||
if ret != 0:
|
||||
raise make_ex(ret, 'error getting snapshot exists for %s' % self.name)
|
||||
- return bool(_exists != 0)
|
||||
+ return _exists
|
||||
|
||||
@requires_not_closed
|
||||
def get_snap_limit(self):
|
||||
diff --git a/src/pybind/rgw/mock_rgw.pxi b/src/pybind/rgw/mock_rgw.pxi
|
||||
index ca893a5bb8..806d4df75d 100644
|
||||
--- a/src/pybind/rgw/mock_rgw.pxi
|
||||
+++ b/src/pybind/rgw/mock_rgw.pxi
|
||||
@@ -1,5 +1,10 @@
|
||||
# cython: embedsignature=True
|
||||
|
||||
+# Make the bool type available as libcpp.bool, for both C and C++.
|
||||
+cimport libcpp
|
||||
+cdef extern from "<stdbool.h>":
|
||||
+ pass
|
||||
+
|
||||
cdef nogil:
|
||||
ctypedef void* librgw_t
|
||||
|
||||
@@ -111,8 +116,8 @@ cdef nogil:
|
||||
|
||||
int rgw_readdir(rgw_fs *fs,
|
||||
rgw_file_handle *parent_fh, uint64_t *offset,
|
||||
- bint (*cb)(const char *name, void *arg, uint64_t offset, stat *st, uint32_t st_mask, uint32_t flags) nogil except? -9000,
|
||||
- void *cb_arg, bint *eof, uint32_t flags) except? -9000:
|
||||
+ libcpp.bool (*cb)(const char *name, void *arg, uint64_t offset, stat *st, uint32_t st_mask, uint32_t flags) nogil except? -9000,
|
||||
+ void *cb_arg, libcpp.bool *eof, uint32_t flags) except? -9000:
|
||||
pass
|
||||
|
||||
int rgw_getattr(rgw_fs *fs,
|
||||
diff --git a/src/pybind/rgw/rgw.pyx b/src/pybind/rgw/rgw.pyx
|
||||
index 9bbcdfff58..d210a70bbb 100644
|
||||
--- a/src/pybind/rgw/rgw.pyx
|
||||
+++ b/src/pybind/rgw/rgw.pyx
|
||||
@@ -7,6 +7,7 @@ from cpython cimport PyObject, ref, exc, array
|
||||
from libc.stdint cimport *
|
||||
from libc.stdlib cimport malloc, realloc, free
|
||||
from cstat cimport stat
|
||||
+cimport libcpp
|
||||
|
||||
IF BUILD_DOC:
|
||||
include "mock_rgw.pxi"
|
||||
@@ -373,7 +374,7 @@ cdef class LibRGWFS(object):
|
||||
cdef:
|
||||
rgw_file_handle *_dir_handler = <rgw_file_handle*>dir_handler.handler
|
||||
uint64_t _offset = offset
|
||||
- bint _eof
|
||||
+ libcpp.bool _eof
|
||||
uint32_t _flags = flags
|
||||
with nogil:
|
||||
ret = rgw_readdir(self.fs, _dir_handler, &_offset, &readdir_cb,
|
||||
@@ -0,0 +1,13 @@
|
||||
diff --git a/cmake/modules/BuildBoost.cmake b/cmake/modules/BuildBoost.cmake
|
||||
index 2e92132366..3cb1e3d958 100644
|
||||
--- a/cmake/modules/BuildBoost.cmake
|
||||
+++ b/cmake/modules/BuildBoost.cmake
|
||||
@@ -62,7 +62,7 @@ function(do_build_boost version)
|
||||
else()
|
||||
list(APPEND boost_features "address-model=32")
|
||||
endif()
|
||||
- set(BOOST_CXXFLAGS "-fPIC -w") # check on arm, etc <---XXX
|
||||
+ set(BOOST_CXXFLAGS "-fPIC -w -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -ftemplate-depth-1024 -fno-new-ttp-matching -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free") # check on arm, etc <---XXX
|
||||
list(APPEND boost_features "cxxflags=${BOOST_CXXFLAGS}")
|
||||
|
||||
set(boost_with_libs)
|
||||
@@ -1 +1 @@
|
||||
SHA512 (ceph-19.2.3.tar.gz) = 278101d2df7bed5363b20c2b065d7a7b26252c8164511257e213ffaa58d509015558183de10bc9281bcbe4d9f85244bcac5bba4db9823e28df6a96d0b687d00a
|
||||
SHA512 (ceph-18.2.6.tar.gz) = 06bef880543a3c444783ed4a3927fd94a7b05180d35d356372f36679f1e00c3ee2cf3b0c15732fdc0c1ba55c922e07b7fa66274cb12a196914c79faa99859f13
|
||||
|
||||
Reference in New Issue
Block a user