From: Jamie Pryde Date: Tue, 26 Nov 2024 10:00:25 +0000 (+0000) Subject: erasure-code: Add minimum granularity interface to EC plugins X-Git-Tag: v20.3.0~425^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=678ed6e1b0957b7168df46ebe14223d7a1f93f09;p=ceph.git 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 --- diff --git a/src/erasure-code/ErasureCodeInterface.h b/src/erasure-code/ErasureCodeInterface.h index 673136a701ba5..bd7c2c44302f5 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 ab74542a3ea73..265756352c18b 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 3697df721ef35..f847d090e4f0d 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 4d338c8b418fb..d38b996a84a5c 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 75d5c3c1a56cc..48e98747ad65f 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 b05df07c6145f..dc62c450da44d 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 d5e3a07e847a1..7a41014a27ccd 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 51e20359a4184..1440b4d293771 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 4226361c47eb7..c036199c5d9b0 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 05b95ded40298..367a1574a89db 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;