summary refs log tree commit diff
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2022-12-23 20:17:15 +0100
committerRicardo Wurmus <rekado@elephly.net>2022-12-23 20:20:06 +0100
commitb6d9e266a740c9706524bdd5c978f70e088675f1 (patch)
treec17cc9110907c481957aca594f09f71ed6f77b1a
parentad141242f8d2a1e9f69f59e53aa26b897c6cd3a6 (diff)
downloadguix-b6d9e266a740c9706524bdd5c978f70e088675f1.tar.gz
gnu: ceph: Update to 17.2.5.
* gnu/packages/storage.scm (ceph): Update to 17.2.5.
[source]: Remove obsolete patches; remove bundled sources for arrow.
[arguments]: Disable parallel build; use system arrow.
[inputs]: Drop input labels; add apache-thrift, apache-arrow-for-ceph, and
utf8proc.
* gnu/packages/patches/ceph-boost-compat.patch: Delete file.
* gnu/packages/patches/ceph-rocksdb-compat.patch: Delete file.
* gnu/local.mk (dist_patch_DATA): Remove them.
-rw-r--r--gnu/local.mk2
-rw-r--r--gnu/packages/patches/ceph-boost-compat.patch18
-rw-r--r--gnu/packages/patches/ceph-rocksdb-compat.patch303
-rw-r--r--gnu/packages/storage.scm216
4 files changed, 118 insertions, 421 deletions
diff --git a/gnu/local.mk b/gnu/local.mk
index 45d05de02d..a75a7252af 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -963,8 +963,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/cdrkit-libre-cross-compile.patch	\
   %D%/packages/patches/cdrtools-3.01-mkisofs-isoinfo.patch 	\
   %D%/packages/patches/ceph-disable-cpu-optimizations.patch	\
-  %D%/packages/patches/ceph-boost-compat.patch			\
-  %D%/packages/patches/ceph-rocksdb-compat.patch		\
   %D%/packages/patches/chmlib-inttypes.patch			\
   %D%/packages/patches/cl-asdf-config-directories.patch		\
   %D%/packages/patches/clamav-config-llvm-libs.patch		\
diff --git a/gnu/packages/patches/ceph-boost-compat.patch b/gnu/packages/patches/ceph-boost-compat.patch
deleted file mode 100644
index 1aecfbbed5..0000000000
--- a/gnu/packages/patches/ceph-boost-compat.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-Add extra includes required for Boost 1.75 and later.
-
-Taken from upstram:
-
-  https://github.com/ceph/ceph/commit/ebf3a0398f18eab67d2ba25e6a10b41ff140f6a4
-
-diff --git a/src/rgw/rgw_string.h b/src/rgw/rgw_string.h
-index 257daa9c1fe6e..90e64f98a2587 100644
---- a/src/rgw/rgw_string.h
-+++ b/src/rgw/rgw_string.h
-@@ -8,5 +8,7 @@
- #include <stdlib.h>
- #include <limits.h>
- #include <string_view>
-+#include <string>
-+#include <stdexcept>
- 
- #include <boost/container/small_vector.hpp>
diff --git a/gnu/packages/patches/ceph-rocksdb-compat.patch b/gnu/packages/patches/ceph-rocksdb-compat.patch
deleted file mode 100644
index 9fb9b0caeb..0000000000
--- a/gnu/packages/patches/ceph-rocksdb-compat.patch
+++ /dev/null
@@ -1,303 +0,0 @@
-Adjust for newer versions of RocksDB.
-
-Taken from upstream:
-
-  https://github.com/ceph/ceph/pull/42815
-  https://github.com/ceph/ceph/commit/ff7f192ea3cf88ca1098bcf9396ff4f8ed1e8792.diff
-
-diff --git a/src/kv/rocksdb_cache/BinnedLRUCache.cc b/src/kv/rocksdb_cache/BinnedLRUCache.cc
-index 0d657883e92de..47c56e2ddd769 100644
---- a/src/kv/rocksdb_cache/BinnedLRUCache.cc
-+++ b/src/kv/rocksdb_cache/BinnedLRUCache.cc
-@@ -151,13 +151,20 @@ void BinnedLRUCacheShard::EraseUnRefEntries() {
-   }
- }
- 
--void BinnedLRUCacheShard::ApplyToAllCacheEntries(void (*callback)(void*, size_t),
--                                           bool thread_safe) {
-+void BinnedLRUCacheShard::ApplyToAllCacheEntries(
-+  const std::function<void(const rocksdb::Slice& key,
-+                           void* value,
-+                           size_t charge,
-+                           DeleterFn)>& callback,
-+  bool thread_safe)
-+{
-   if (thread_safe) {
-     mutex_.lock();
-   }
-   table_.ApplyToAllCacheEntries(
--      [callback](BinnedLRUHandle* h) { callback(h->value, h->charge); });
-+    [callback](BinnedLRUHandle* h) {
-+      callback(h->key(), h->value, h->charge, h->deleter);
-+    });
-   if (thread_safe) {
-     mutex_.unlock();
-   }
-@@ -345,7 +352,7 @@ bool BinnedLRUCacheShard::Release(rocksdb::Cache::Handle* handle, bool force_era
- 
- rocksdb::Status BinnedLRUCacheShard::Insert(const rocksdb::Slice& key, uint32_t hash, void* value,
-                              size_t charge,
--                             void (*deleter)(const rocksdb::Slice& key, void* value),
-+                             DeleterFn deleter,
-                              rocksdb::Cache::Handle** handle, rocksdb::Cache::Priority priority) {
-   auto e = new BinnedLRUHandle();
-   rocksdb::Status s;
-@@ -464,6 +471,12 @@ std::string BinnedLRUCacheShard::GetPrintableOptions() const {
-   return std::string(buffer);
- }
- 
-+DeleterFn BinnedLRUCacheShard::GetDeleter(rocksdb::Cache::Handle* h) const
-+{
-+  auto* handle = reinterpret_cast<BinnedLRUHandle*>(h);
-+  return handle->deleter;
-+}
-+
- BinnedLRUCache::BinnedLRUCache(CephContext *c, 
-                                size_t capacity, 
-                                int num_shard_bits,
-@@ -519,6 +532,13 @@ void BinnedLRUCache::DisownData() {
- #endif  // !__SANITIZE_ADDRESS__
- }
- 
-+#if (ROCKSDB_MAJOR >= 6 && ROCKSDB_MINOR >= 22)
-+DeleterFn BinnedLRUCache::GetDeleter(Handle* handle) const
-+{
-+  return reinterpret_cast<const BinnedLRUHandle*>(handle)->deleter;
-+}
-+#endif
-+
- size_t BinnedLRUCache::TEST_GetLRUSize() {
-   size_t lru_size_of_all_shards = 0;
-   for (int i = 0; i < num_shards_; i++) {
-diff --git a/src/kv/rocksdb_cache/BinnedLRUCache.h b/src/kv/rocksdb_cache/BinnedLRUCache.h
-index 85608be0e5734..88bf4502e8927 100644
---- a/src/kv/rocksdb_cache/BinnedLRUCache.h
-+++ b/src/kv/rocksdb_cache/BinnedLRUCache.h
-@@ -56,7 +56,7 @@ std::shared_ptr<rocksdb::Cache> NewBinnedLRUCache(
- 
- struct BinnedLRUHandle {
-   void* value;
--  void (*deleter)(const rocksdb::Slice&, void* value);
-+  DeleterFn deleter;
-   BinnedLRUHandle* next_hash;
-   BinnedLRUHandle* next;
-   BinnedLRUHandle* prev;
-@@ -189,7 +189,7 @@ class alignas(CACHE_LINE_SIZE) BinnedLRUCacheShard : public CacheShard {
-   // Like Cache methods, but with an extra "hash" parameter.
-   virtual rocksdb::Status Insert(const rocksdb::Slice& key, uint32_t hash, void* value,
-                         size_t charge,
--                        void (*deleter)(const rocksdb::Slice& key, void* value),
-+                        DeleterFn deleter,
-                         rocksdb::Cache::Handle** handle,
-                         rocksdb::Cache::Priority priority) override;
-   virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, uint32_t hash) override;
-@@ -205,13 +205,19 @@ class alignas(CACHE_LINE_SIZE) BinnedLRUCacheShard : public CacheShard {
-   virtual size_t GetUsage() const override;
-   virtual size_t GetPinnedUsage() const override;
- 
--  virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
--                                      bool thread_safe) override;
-+  virtual void ApplyToAllCacheEntries(
-+    const std::function<void(const rocksdb::Slice& key,
-+                             void* value,
-+                             size_t charge,
-+                             DeleterFn)>& callback,
-+    bool thread_safe) override;
- 
-   virtual void EraseUnRefEntries() override;
- 
-   virtual std::string GetPrintableOptions() const override;
- 
-+  virtual DeleterFn GetDeleter(rocksdb::Cache::Handle* handle) const override;
-+
-   void TEST_GetLRUList(BinnedLRUHandle** lru, BinnedLRUHandle** lru_low_pri);
- 
-   //  Retrieves number of elements in LRU, for unit test purpose only
-@@ -304,7 +310,9 @@ class BinnedLRUCache : public ShardedCache {
-   virtual size_t GetCharge(Handle* handle) const override;
-   virtual uint32_t GetHash(Handle* handle) const override;
-   virtual void DisownData() override;
--
-+#if (ROCKSDB_MAJOR >= 6 && ROCKSDB_MINOR >= 22)
-+  virtual DeleterFn GetDeleter(Handle* handle) const override;
-+#endif
-   //  Retrieves number of elements in LRU, for unit test purpose only
-   size_t TEST_GetLRUSize();
-   // Sets the high pri pool ratio
-diff --git a/src/kv/rocksdb_cache/ShardedCache.cc b/src/kv/rocksdb_cache/ShardedCache.cc
-index 367140a94d8be..6cbd89ad6472c 100644
---- a/src/kv/rocksdb_cache/ShardedCache.cc
-+++ b/src/kv/rocksdb_cache/ShardedCache.cc
-@@ -44,7 +44,7 @@ void ShardedCache::SetStrictCapacityLimit(bool strict_capacity_limit) {
- }
- 
- rocksdb::Status ShardedCache::Insert(const rocksdb::Slice& key, void* value, size_t charge,
--                            void (*deleter)(const rocksdb::Slice& key, void* value),
-+                            DeleterFn deleter,
-                             rocksdb::Cache::Handle** handle, Priority priority) {
-   uint32_t hash = HashSlice(key);
-   return GetShard(Shard(hash))
-@@ -109,13 +109,36 @@ size_t ShardedCache::GetPinnedUsage() const {
-   return usage;
- }
- 
-+#if (ROCKSDB_MAJOR >= 6 && ROCKSDB_MINOR >= 22)
-+DeleterFn ShardedCache::GetDeleter(Handle* handle) const
-+{
-+  uint32_t hash = GetHash(handle);
-+  return GetShard(Shard(hash))->GetDeleter(handle);
-+}
-+
-+void ShardedCache::ApplyToAllEntries(
-+    const std::function<void(const rocksdb::Slice& key, void* value, size_t charge,
-+                             DeleterFn deleter)>& callback,
-+    const ApplyToAllEntriesOptions& opts)
-+{
-+  int num_shards = 1 << num_shard_bits_;
-+  for (int s = 0; s < num_shards; s++) {
-+    GetShard(s)->ApplyToAllCacheEntries(callback, true /* thread_safe */);
-+  }
-+}
-+#else
- void ShardedCache::ApplyToAllCacheEntries(void (*callback)(void*, size_t),
-                                           bool thread_safe) {
-   int num_shards = 1 << num_shard_bits_;
-   for (int s = 0; s < num_shards; s++) {
--    GetShard(s)->ApplyToAllCacheEntries(callback, thread_safe);
-+    GetShard(s)->ApplyToAllCacheEntries(
-+      [callback](const rocksdb::Slice&, void* value, size_t charge, DeleterFn) {
-+        callback(value, charge);
-+      },
-+      thread_safe);
-   }
- }
-+#endif
- 
- void ShardedCache::EraseUnRefEntries() {
-   int num_shards = 1 << num_shard_bits_;
-@@ -131,7 +154,7 @@ std::string ShardedCache::GetPrintableOptions() const {
-   char buffer[kBufferSize];
-   {
-     std::lock_guard<std::mutex> l(capacity_mutex_);
--    snprintf(buffer, kBufferSize, "    capacity : %" ROCKSDB_PRIszt "\n",
-+    snprintf(buffer, kBufferSize, "    capacity : %zu\n",
-              capacity_);
-     ret.append(buffer);
-     snprintf(buffer, kBufferSize, "    num_shard_bits : %d\n", num_shard_bits_);
-diff --git a/src/kv/rocksdb_cache/ShardedCache.h b/src/kv/rocksdb_cache/ShardedCache.h
-index 4d64893ab1c7b..f98421a09a33a 100644
---- a/src/kv/rocksdb_cache/ShardedCache.h
-+++ b/src/kv/rocksdb_cache/ShardedCache.h
-@@ -14,6 +14,7 @@
- #include <string>
- #include <mutex>
- 
-+#include "rocksdb/version.h"
- #include "rocksdb/cache.h"
- #include "include/ceph_hash.h"
- #include "common/PriorityCache.h"
-@@ -22,10 +23,11 @@
- #ifndef CACHE_LINE_SIZE
- #define CACHE_LINE_SIZE 64 // XXX arch-specific define 
- #endif
--#define ROCKSDB_PRIszt "zu"
- 
- namespace rocksdb_cache {
- 
-+using DeleterFn = void (*)(const rocksdb::Slice& key, void* value);
-+
- // Single cache shard interface.
- class CacheShard {
-  public:
-@@ -34,7 +36,7 @@ class CacheShard {
- 
-   virtual rocksdb::Status Insert(const rocksdb::Slice& key, uint32_t hash, void* value,
-                                  size_t charge,
--                                 void (*deleter)(const rocksdb::Slice& key, void* value),
-+                                 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 bool Ref(rocksdb::Cache::Handle* handle) = 0;
-@@ -44,10 +46,15 @@ class CacheShard {
-   virtual void SetStrictCapacityLimit(bool strict_capacity_limit) = 0;
-   virtual size_t GetUsage() const = 0;
-   virtual size_t GetPinnedUsage() const = 0;
--  virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
--                                      bool thread_safe) = 0;
-+  virtual void ApplyToAllCacheEntries(
-+    const std::function<void(const rocksdb::Slice& key,
-+                             void* value,
-+                             size_t charge,
-+                             DeleterFn)>& callback,
-+    bool thread_safe) = 0;
-   virtual void EraseUnRefEntries() = 0;
-   virtual std::string GetPrintableOptions() const { return ""; }
-+  virtual DeleterFn GetDeleter(rocksdb::Cache::Handle* handle) const = 0;
- };
- 
- // Generic cache interface which shards cache by hash of keys. 2^num_shard_bits
-@@ -57,34 +64,43 @@ class ShardedCache : public rocksdb::Cache, public PriorityCache::PriCache {
-  public:
-   ShardedCache(size_t capacity, int num_shard_bits, bool strict_capacity_limit);
-   virtual ~ShardedCache() = default;
-+  // rocksdb::Cache
-   virtual const char* Name() const override = 0;
--  virtual CacheShard* GetShard(int shard) = 0;
--  virtual const CacheShard* GetShard(int shard) const = 0;
--  virtual void* Value(Handle* handle) override = 0;
--  virtual size_t GetCharge(Handle* handle) const = 0;
--  virtual uint32_t GetHash(Handle* handle) const = 0;
--  virtual void DisownData() override = 0;
--
--  virtual void SetCapacity(size_t capacity) override;
--  virtual void SetStrictCapacityLimit(bool strict_capacity_limit) override;
--
-   virtual rocksdb::Status Insert(const rocksdb::Slice& key, void* value, size_t charge,
--                                 void (*deleter)(const rocksdb::Slice& key, void* value),
-+                                 DeleterFn,
-                                  rocksdb::Cache::Handle** handle, Priority priority) override;
-   virtual rocksdb::Cache::Handle* Lookup(const rocksdb::Slice& key, rocksdb::Statistics* stats) override;
-   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;
-   virtual void Erase(const rocksdb::Slice& key) override;
-   virtual uint64_t NewId() override;
--  virtual size_t GetCapacity() const override;
-+  virtual void SetCapacity(size_t capacity) override;
-+  virtual void SetStrictCapacityLimit(bool strict_capacity_limit) override;
-   virtual bool HasStrictCapacityLimit() const override;
-+  virtual size_t GetCapacity() const override;
-   virtual size_t GetUsage() const override;
-   virtual size_t GetUsage(rocksdb::Cache::Handle* handle) const override;
-   virtual size_t GetPinnedUsage() const override;
-+  virtual size_t GetCharge(Handle* handle) const = 0;
-+#if (ROCKSDB_MAJOR >= 6 && ROCKSDB_MINOR >= 22)
-+  virtual DeleterFn GetDeleter(Handle* handle) const override;
-+#endif
-+  virtual void DisownData() override = 0;
-+#if (ROCKSDB_MAJOR >= 6 && ROCKSDB_MINOR >= 22)
-+  virtual void ApplyToAllEntries(
-+      const std::function<void(const rocksdb::Slice& key, void* value, size_t charge,
-+                               DeleterFn deleter)>& callback,
-+      const ApplyToAllEntriesOptions& opts) override;
-+#else
-   virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
-                                       bool thread_safe) override;
-+#endif
-   virtual void EraseUnRefEntries() override;
-   virtual std::string GetPrintableOptions() const override;
-+  virtual CacheShard* GetShard(int shard) = 0;
-+  virtual const CacheShard* GetShard(int shard) const = 0;
-+  virtual uint32_t GetHash(Handle* handle) const = 0;
- 
-   int GetNumShardBits() const { return num_shard_bits_; }
- 
-@@ -120,7 +136,7 @@ class ShardedCache : public rocksdb::Cache, public PriorityCache::PriCache {
- //    return Hash(s.data(), s.size(), 0);
-   }
- 
--  uint32_t Shard(uint32_t hash) {
-+  uint32_t Shard(uint32_t hash) const {
-     // Note, hash >> 32 yields hash in gcc, not the zero we expect!
-     return (num_shard_bits_ > 0) ? (hash >> (32 - num_shard_bits_)) : 0;
-   }
diff --git a/gnu/packages/storage.scm b/gnu/packages/storage.scm
index 9d360e8eb3..f9b76b1d38 100644
--- a/gnu/packages/storage.scm
+++ b/gnu/packages/storage.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2017 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2020, 2022 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2021 Greg Hogan <code@greghogan.com>
+;;; Copyright © 2022 Ricardo Wurmus <rekado@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -50,8 +51,10 @@
   #:use-module (gnu packages pretty-print)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages rpc)
   #:use-module (gnu packages sphinx)
   #:use-module (gnu packages sqlite)
+  #:use-module (gnu packages textutils)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xml))
@@ -59,23 +62,22 @@
 (define-public ceph
   (package
     (name "ceph")
-    (version "16.2.9")
+    (version "17.2.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://download.ceph.com/tarballs/ceph-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1yf62k9wlx9pmggwa5c05wfqzy28sdm4b465y4iqrgc9dkrgin08"))
+                "16mjj6cyrpdn49ig82mmrv984vqfdf24d6i4n9sghfli8z0nj8in"))
               (patches
                (search-patches
-                "ceph-disable-cpu-optimizations.patch"
-                "ceph-boost-compat.patch"
-                "ceph-rocksdb-compat.patch"))
+                "ceph-disable-cpu-optimizations.patch"))
               (modules '((guix build utils)))
               (snippet
                '(for-each delete-file-recursively
                           '(;; TODO: Unbundle these:
+                            "src/arrow"
                             ;;"src/isa-l"
                             ;;"src/lua"
                             ;;"src/xxHash"
@@ -87,11 +89,14 @@
                             "src/rapidjson"
                             "src/spdk"
                             "src/rocksdb"
-                            "src/boost")))))
+                            "src/boost"
+                            "src/utf8proc")))))
     (build-system cmake-build-system)
     (arguments
-     `(#:configure-flags
-       (let* ((out (assoc-ref %outputs "out"))
+     (list
+      #:parallel-build? #f ;because mgr_legacy_options.h is not built in time
+      #:configure-flags
+      '(let* ((out (assoc-ref %outputs "out"))
               (lib (assoc-ref %outputs "lib"))
               (libdir (string-append lib "/lib")))
          (list (string-append "-DCMAKE_INSTALL_PREFIX=" out)
@@ -112,11 +117,13 @@
                               (assoc-ref %build-inputs "xfsprogs") "/include")
                "-DCMAKE_INSTALL_LOCALSTATEDIR=/var"
                "-DBUILD_SHARED_LIBS=ON"
-               "-DWITH_SYSTEM_ROCKSDB=ON"
+               "-DWITH_SYSTEM_ARROW=ON"
                "-DWITH_SYSTEM_BOOST=ON"
+               "-DWITH_SYSTEM_ROCKSDB=ON"
+               "-DWITH_SYSTEM_UTF8PROC=ON"
 
                ;; TODO: Enable these when available in Guix.
-               "-DWITH_MGR_DASHBOARD_FRONTEND=OFF"       ;requires node + nodeenv
+               "-DWITH_MGR_DASHBOARD_FRONTEND=OFF" ;requires node + nodeenv
                "-DWITH_BABELTRACE=OFF"
                "-DWITH_LTTNG=OFF"
                "-DWITH_SPDK=OFF"
@@ -136,102 +143,115 @@
        ;; resolved.
        #:tests? #f
        #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out"))
-                   (lib (assoc-ref outputs "lib")))
+       `(modify-phases %standard-phases
+          (add-after 'unpack 'patch-source
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let ((out (assoc-ref outputs "out"))
+                    (lib (assoc-ref outputs "lib")))
+
+                (substitute* "src/rgw/store/dbstore/sqlite/CMakeLists.txt"
+                  (("add_library\\(sqlite_db \\$")
+                   "add_library(sqlite_db STATIC $"))
+                (substitute* "src/rgw/store/dbstore/CMakeLists.txt"
+                  (("add_library\\(dbstore \\$")
+                   "add_library(dbstore STATIC $")
+                  (("add_library\\(dbstore_lib \\$")
+                   "add_library(dbstore_lib STATIC $"))
 
-               (substitute* "cmake/modules/Distutils.cmake"
-                 ;; Prevent creation of Python eggs.
-                 (("setup.py install")
-                  "setup.py install --single-version-externally-managed --root=/")
-                 ;; Inject the -rpath linker argument when linking
-                 ;; Python C libraries so RUNPATH gets set up correctly.
-                 (("LDFLAGS=(.*)\n" _ flags)
-                  (string-append "LDFLAGS=\\\"" flags
-                                 " -Wl,-rpath=" lib "/lib\\\"\n")))
+                (substitute* "cmake/modules/Distutils.cmake"
+                  ;; Prevent creation of Python eggs.
+                  (("setup.py install")
+                   "setup.py install --single-version-externally-managed --root=/")
+                  ;; Inject the -rpath linker argument when linking
+                  ;; Python C libraries so RUNPATH gets set up correctly.
+                  (("LDFLAGS=(.*)\n" _ flags)
+                   (string-append "LDFLAGS=\\\"" flags
+                                  " -Wl,-rpath=" lib "/lib\\\"\n")))
 
-               ;; Statically link libcrc32 because it does not get installed,
-               ;; yet several libraries end up referring to it.
-               (substitute* "src/common/CMakeLists.txt"
-                 (("add_library\\(crc32")
-                  "add_library(crc32 STATIC"))
+                ;; Statically link libcrc32 because it does not get installed,
+                ;; yet several libraries end up referring to it.
+                (substitute* "src/common/CMakeLists.txt"
+                  (("add_library\\(crc32")
+                   "add_library(crc32 STATIC"))
 
-               (substitute* "udev/50-rbd.rules"
-                 (("/usr/bin/ceph-rbdnamer")
-                  (string-append out "/bin/ceph-rbdnamer"))))))
-         (add-before 'install 'set-install-environment
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (py3sitedir
-                     (string-append out "/lib/python"
-                                    ,(version-major+minor
-                                      (package-version python))
-                                    "/site-packages")))
-               ;; The Python install scripts refuses to function if
-               ;; the install directory is not on PYTHONPATH.
-               (setenv "PYTHONPATH" py3sitedir))))
-         (add-after 'install 'wrap-python-scripts
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (scripts '("bin/ceph" "bin/cephfs-top" "sbin/ceph-volume"))
-                    (dependencies (map (lambda (input)
-                                         (assoc-ref inputs input))
-                                       '("python-prettytable" "python-pyyaml")))
-                    (sitedir (lambda (package)
-                               (string-append package
-                                              "/lib/python"
-                                              ,(version-major+minor
-                                                (package-version python))
-                                              "/site-packages")))
-                    (PYTHONPATH (string-join (map sitedir (cons out dependencies))
-                                             ":")))
-               (for-each (lambda (executable)
-                           (wrap-program (string-append out "/" executable)
-                             `("GUIX_PYTHONPATH" ":" prefix (,PYTHONPATH))))
-                         scripts)))))))
+                (substitute* "udev/50-rbd.rules"
+                  (("/usr/bin/ceph-rbdnamer")
+                   (string-append out "/bin/ceph-rbdnamer"))))))
+          (add-before 'install 'set-install-environment
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let* ((out (assoc-ref outputs "out"))
+                     (py3sitedir
+                      (string-append out "/lib/python"
+                                     ,(version-major+minor
+                                       (package-version python))
+                                     "/site-packages")))
+                ;; The Python install scripts refuses to function if
+                ;; the install directory is not on PYTHONPATH.
+                (setenv "PYTHONPATH" py3sitedir))))
+          (add-after 'install 'wrap-python-scripts
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (let* ((out (assoc-ref outputs "out"))
+                     (scripts '("bin/ceph" "bin/cephfs-top" "sbin/ceph-volume"))
+                     (dependencies (map (lambda (input)
+                                          (assoc-ref inputs input))
+                                        '("python-prettytable" "python-pyyaml")))
+                     (sitedir (lambda (package)
+                                (string-append package
+                                               "/lib/python"
+                                               ,(version-major+minor
+                                                 (package-version python))
+                                               "/site-packages")))
+                     (PYTHONPATH (string-join (map sitedir (cons out dependencies))
+                                              ":")))
+                (for-each (lambda (executable)
+                            (wrap-program (string-append out "/" executable)
+                              `("GUIX_PYTHONPATH" ":" prefix (,PYTHONPATH))))
+                          scripts)))))))
     (outputs
      '("out" "lib"))
     (native-inputs
      (list gperf pkg-config python-cython python-sphinx yasm))
     (inputs
-     `(("boost" ,boost)
-       ("curl" ,curl)
-       ("cryptsetup" ,cryptsetup)
-       ("expat" ,expat)
-       ("fcgi" ,fcgi)
-       ("fmt" ,fmt-8)
-       ("fuse" ,fuse)
-       ("icu4c" ,icu4c)
-       ("jemalloc" ,jemalloc)
-       ("keyutils" ,keyutils)
-       ("leveldb" ,leveldb)
-       ("libaio" ,libaio)
-       ("libatomic-ops" ,libatomic-ops)
-       ("libcap-ng" ,libcap-ng)
-       ("libnl" ,libnl)
-       ("librdkafka" ,librdkafka)
-       ("lua" ,lua)
-       ("lz4" ,lz4)
-       ("oath-toolkit" ,oath-toolkit)
-       ("openldap" ,openldap)
-       ("openssl" ,openssl)
-       ("ncurses" ,ncurses)
-       ("nss" ,nss)
-       ("python-prettytable" ,python-prettytable) ;used by ceph_daemon.py
-       ("python-pyyaml" ,python-pyyaml)           ;from python-common/setup.py
-       ("python" ,python)
-       ("rapidjson" ,rapidjson)
-       ("rdma-core" ,rdma-core)
-       ("rocksdb" ,rocksdb)
-       ("snappy" ,snappy)
-       ("sqlite" ,sqlite)
-       ("udev" ,eudev)
-       ("util-linux" ,util-linux)
-       ("util-linux:lib" ,util-linux "lib")
-       ("xfsprogs" ,xfsprogs)
-       ("zlib" ,zlib)))
+     (list `(,apache-thrift "lib")
+           `(,apache-thrift "include")
+           `(,apache-arrow-for-ceph "lib")
+           boost
+           curl
+           cryptsetup
+           eudev
+           expat
+           fcgi
+           fmt-8
+           fuse
+           icu4c
+           jemalloc
+           keyutils
+           leveldb
+           libaio
+           libatomic-ops
+           libcap-ng
+           libnl
+           librdkafka
+           lua
+           lz4
+           oath-toolkit
+           openldap
+           openssl
+           ncurses
+           nss
+           python-prettytable           ;used by ceph_daemon.py
+           python-pyyaml                ;from python-common/setup.py
+           python
+           rapidjson
+           rdma-core
+           rocksdb
+           snappy
+           sqlite
+           utf8proc
+           util-linux
+           `(,util-linux "lib")
+           xfsprogs
+           zlib))
     (home-page "https://ceph.com/")
     (synopsis "Distributed object store and file system")
     (description