From 678ed6e1b0957b7168df46ebe14223d7a1f93f09 Mon Sep 17 00:00:00 2001 From: Jamie Pryde Date: Tue, 26 Nov 2024 10:00:25 +0000 Subject: [PATCH] erasure-code: Add minimum granularity interface to EC plugins Add get_minimum_granularity() function to the EC plugin interface, which returns the minimum size in bytes that can be used for partial writes. This is based on the minimum size of coding chunk update that the particular technique supports. Signed-off-by: Jamie Pryde Signed-off-by: Jon Bailey --- src/erasure-code/ErasureCodeInterface.h | 9 +++++++++ src/erasure-code/clay/ErasureCodeClay.cc | 5 +++++ src/erasure-code/clay/ErasureCodeClay.h | 2 ++ src/erasure-code/isa/ErasureCodeIsa.h | 5 +++++ src/erasure-code/jerasure/ErasureCodeJerasure.h | 16 ++++++++++++++++ src/erasure-code/lrc/ErasureCodeLrc.cc | 5 +++++ src/erasure-code/lrc/ErasureCodeLrc.h | 2 ++ src/erasure-code/shec/ErasureCodeShec.h | 4 ++++ src/test/erasure-code/ErasureCodeExample.h | 4 ++++ src/test/erasure-code/TestErasureCode.cc | 1 + 10 files changed, 53 insertions(+) diff --git a/src/erasure-code/ErasureCodeInterface.h b/src/erasure-code/ErasureCodeInterface.h index 673136a701ba..bd7c2c44302f 100644 --- a/src/erasure-code/ErasureCodeInterface.h +++ b/src/erasure-code/ErasureCodeInterface.h @@ -327,6 +327,15 @@ namespace ceph { const std::map &available, std::set *minimum) = 0; + /** + * Return the minimum number of bytes that the plugin and technique + * support for partial writes. This is the minimum size of update + * to coding chunks that the particular technique supports. + * + * @return minimum number of bytes. + */ + virtual size_t get_minimum_granularity() = 0; + /** * Encode the content of **in** and store the result in * **encoded**. All buffers pointed to by **encoded** have the diff --git a/src/erasure-code/clay/ErasureCodeClay.cc b/src/erasure-code/clay/ErasureCodeClay.cc index ab74542a3ea7..265756352c18 100644 --- a/src/erasure-code/clay/ErasureCodeClay.cc +++ b/src/erasure-code/clay/ErasureCodeClay.cc @@ -95,6 +95,11 @@ unsigned int ErasureCodeClay::get_chunk_size(unsigned int stripe_width) const return round_up_to(stripe_width, alignment) / k; } +size_t ErasureCodeClay::get_minimum_granularity() +{ + return mds.erasure_code->get_minimum_granularity(); +} + int ErasureCodeClay::minimum_to_decode(const set &want_to_read, const set &available, map>> *minimum) diff --git a/src/erasure-code/clay/ErasureCodeClay.h b/src/erasure-code/clay/ErasureCodeClay.h index 3697df721ef3..f847d090e4f0 100644 --- a/src/erasure-code/clay/ErasureCodeClay.h +++ b/src/erasure-code/clay/ErasureCodeClay.h @@ -60,6 +60,8 @@ public: unsigned int get_chunk_size(unsigned int stripe_width) const override; + size_t get_minimum_granularity() override; + int minimum_to_decode(const std::set &want_to_read, const std::set &available, std::map>> *minimum) override; diff --git a/src/erasure-code/isa/ErasureCodeIsa.h b/src/erasure-code/isa/ErasureCodeIsa.h index 4d338c8b418f..d38b996a84a5 100644 --- a/src/erasure-code/isa/ErasureCodeIsa.h +++ b/src/erasure-code/isa/ErasureCodeIsa.h @@ -152,6 +152,11 @@ public: unsigned get_alignment() const override; + size_t get_minimum_granularity() override + { + return 1; + } + void prepare() override; private: diff --git a/src/erasure-code/jerasure/ErasureCodeJerasure.h b/src/erasure-code/jerasure/ErasureCodeJerasure.h index 75d5c3c1a56c..48e98747ad65 100644 --- a/src/erasure-code/jerasure/ErasureCodeJerasure.h +++ b/src/erasure-code/jerasure/ErasureCodeJerasure.h @@ -103,6 +103,10 @@ public: char **coding, int blocksize) override; unsigned get_alignment() const override; + size_t get_minimum_granularity() override + { + return 1; + } void prepare() override; private: int parse(ceph::ErasureCodeProfile& profile, std::ostream *ss) override; @@ -133,6 +137,10 @@ public: char **coding, int blocksize) override; unsigned get_alignment() const override; + size_t get_minimum_granularity() override + { + return 1; + } void prepare() override; private: int parse(ceph::ErasureCodeProfile& profile, std::ostream *ss) override; @@ -166,6 +174,10 @@ public: char **coding, int blocksize) override; unsigned get_alignment() const override; + size_t get_minimum_granularity() override + { + return w * packetsize; + } void prepare_schedule(int *matrix); private: int parse(ceph::ErasureCodeProfile& profile, std::ostream *ss) override; @@ -215,6 +227,10 @@ public: char **coding, int blocksize) override; unsigned get_alignment() const override; + size_t get_minimum_granularity() override + { + return w * packetsize; + } virtual bool check_k(std::ostream *ss) const; virtual bool check_w(std::ostream *ss) const; virtual bool check_packetsize_set(std::ostream *ss) const; diff --git a/src/erasure-code/lrc/ErasureCodeLrc.cc b/src/erasure-code/lrc/ErasureCodeLrc.cc index b05df07c6145..dc62c450da44 100644 --- a/src/erasure-code/lrc/ErasureCodeLrc.cc +++ b/src/erasure-code/lrc/ErasureCodeLrc.cc @@ -559,6 +559,11 @@ unsigned int ErasureCodeLrc::get_chunk_size(unsigned int stripe_width) const return layers.front().erasure_code->get_chunk_size(stripe_width); } +size_t ErasureCodeLrc::get_minimum_granularity() +{ + return layers.front().erasure_code->get_minimum_granularity(); +} + void p(const set &s) { cerr << s; } // for gdb int ErasureCodeLrc::_minimum_to_decode(const set &want_to_read, diff --git a/src/erasure-code/lrc/ErasureCodeLrc.h b/src/erasure-code/lrc/ErasureCodeLrc.h index d5e3a07e847a..7a41014a27cc 100644 --- a/src/erasure-code/lrc/ErasureCodeLrc.h +++ b/src/erasure-code/lrc/ErasureCodeLrc.h @@ -105,6 +105,8 @@ public: unsigned int get_chunk_size(unsigned int stripe_width) const override; + size_t get_minimum_granularity() override; + int encode_chunks(const std::set &want_to_encode, std::map *encoded) override; diff --git a/src/erasure-code/shec/ErasureCodeShec.h b/src/erasure-code/shec/ErasureCodeShec.h index 51e20359a418..1440b4d29377 100644 --- a/src/erasure-code/shec/ErasureCodeShec.h +++ b/src/erasure-code/shec/ErasureCodeShec.h @@ -139,6 +139,10 @@ public: char **coding, int blocksize) override; unsigned get_alignment() const override; + size_t get_minimum_granularity() override + { + return 1; + } void prepare() override; private: int parse(const ceph::ErasureCodeProfile &profile) override; diff --git a/src/test/erasure-code/ErasureCodeExample.h b/src/test/erasure-code/ErasureCodeExample.h index 4226361c47eb..c036199c5d9b 100644 --- a/src/test/erasure-code/ErasureCodeExample.h +++ b/src/test/erasure-code/ErasureCodeExample.h @@ -88,6 +88,10 @@ public: return ( object_size / DATA_CHUNKS ) + 1; } + size_t get_minimum_granularity() override { + return 1; + } + int encode(const std::set &want_to_encode, const bufferlist &in, std::map *encoded) override { diff --git a/src/test/erasure-code/TestErasureCode.cc b/src/test/erasure-code/TestErasureCode.cc index 05b95ded4029..367a1574a89d 100644 --- a/src/test/erasure-code/TestErasureCode.cc +++ b/src/test/erasure-code/TestErasureCode.cc @@ -44,6 +44,7 @@ public: unsigned int get_chunk_size(unsigned int object_size) const override { return chunk_size; } + size_t get_minimum_granularity() override { return 1; } int encode_chunks(const set &want_to_encode, map *encoded) override { encode_chunks_encoded = *encoded; -- 2.47.3