From aab8f581a7aa7504793b34d4fbf4103208f83618 Mon Sep 17 00:00:00 2001 From: Jamie Pryde Date: Tue, 19 Nov 2024 12:11:37 +0000 Subject: [PATCH] erasure-code: Add parity delta write optimization to SHEC This commit adds FLAG_EC_PLUGIN_PARITY_DELTA_OPTIMIZATION to the list of optimizations supported by the SHEC plugin, and encode_delta and apply_delta functions. Signed-off-by: Jamie Pryde Signed-off-by: Alex Ainscow --- src/erasure-code/shec/ErasureCodeShec.cc | 42 ++++++++++++++++++++++++ src/erasure-code/shec/ErasureCodeShec.h | 10 +++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/erasure-code/shec/ErasureCodeShec.cc b/src/erasure-code/shec/ErasureCodeShec.cc index 9ca36c127e8..82a899ad35d 100644 --- a/src/erasure-code/shec/ErasureCodeShec.cc +++ b/src/erasure-code/shec/ErasureCodeShec.cc @@ -273,6 +273,48 @@ int ErasureCodeShecReedSolomonVandermonde::shec_decode(int *erased, return shec_matrix_decode(erased, avails, data, coding, blocksize); } +void ErasureCodeShecReedSolomonVandermonde::encode_delta(const bufferptr &old_data, + const bufferptr &new_data, + bufferptr *delta_maybe_in_place) +{ + if (&old_data != delta_maybe_in_place) { + memcpy(delta_maybe_in_place->c_str(), old_data.c_str(), delta_maybe_in_place->length()); + } + char *new_data_p = const_cast(new_data.c_str()); + char *delta_p = delta_maybe_in_place->c_str(); + galois_region_xor(new_data_p, delta_p, delta_maybe_in_place->length()); +} + +void ErasureCodeShecReedSolomonVandermonde::apply_delta(const shard_id_map &in, + shard_id_map &out) +{ + auto first = in.begin(); + const unsigned blocksize = first->second.length(); + + for (auto const& [datashard, databuf] : in) { + if (datashard < k) { + for (auto const& [codingshard, codingbuf] : out) { + if (codingshard >= k) { + ceph_assert(codingbuf.length() == blocksize); + char* input_data = const_cast(databuf.c_str()); + char* output_data = const_cast(codingbuf.c_str()); + switch (w) { + case 8: + galois_w08_region_multiply(input_data, matrix[static_cast(datashard) + (k * (static_cast(codingshard) - k))], blocksize, output_data, 1); + break; + case 16: + galois_w16_region_multiply(input_data, matrix[static_cast(datashard) + (k * (static_cast(codingshard) - k))], blocksize, output_data, 1); + break; + case 32: + galois_w32_region_multiply(input_data, matrix[datashard + (k * (codingshard - k))], blocksize, output_data, 1); + break; + } + } + } + } + } +} + unsigned ErasureCodeShecReedSolomonVandermonde::get_alignment() const { return k*w*sizeof(int); diff --git a/src/erasure-code/shec/ErasureCodeShec.h b/src/erasure-code/shec/ErasureCodeShec.h index 2ce7020cbcf..cd6025936dc 100644 --- a/src/erasure-code/shec/ErasureCodeShec.h +++ b/src/erasure-code/shec/ErasureCodeShec.h @@ -64,7 +64,8 @@ public: uint64_t get_supported_optimizations() const override { return FLAG_EC_PLUGIN_PARTIAL_READ_OPTIMIZATION | FLAG_EC_PLUGIN_PARTIAL_WRITE_OPTIMIZATION | - FLAG_EC_PLUGIN_ZERO_INPUT_ZERO_OUTPUT_OPTIMIZATION; + FLAG_EC_PLUGIN_ZERO_INPUT_ZERO_OUTPUT_OPTIMIZATION | + FLAG_EC_PLUGIN_PARITY_DELTA_OPTIMIZATION; } unsigned int get_chunk_count() const override { @@ -144,6 +145,13 @@ public: char **data, char **coding, int blocksize) override; + + void encode_delta(const ceph::bufferptr &old_data, + const ceph::bufferptr &new_data, + ceph::bufferptr *delta_maybe_in_place); + void apply_delta(const shard_id_map &in, + shard_id_map &out); + unsigned get_alignment() const override; size_t get_minimum_granularity() override { -- 2.39.5