]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
erasure-code: Add parity delta write optimization to SHEC
authorJamie Pryde <jamiepry@uk.ibm.com>
Tue, 19 Nov 2024 12:11:37 +0000 (12:11 +0000)
committerAlex Ainscow <aainscow@uk.ibm.com>
Wed, 19 Mar 2025 11:03:55 +0000 (11:03 +0000)
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 <jamiepry@uk.ibm.com>
Signed-off-by: Alex Ainscow <aainscow@uk.ibm.com>
src/erasure-code/shec/ErasureCodeShec.cc
src/erasure-code/shec/ErasureCodeShec.h

index 9ca36c127e8e3b8b09729155fa59e2ba0bac7935..82a899ad35daaa90ce0a03dfc8cd257a3c39bfd7 100644 (file)
@@ -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<char*>(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<bufferptr> &in,
+                                                        shard_id_map<bufferptr> &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<char*>(databuf.c_str());
+          char* output_data = const_cast<char*>(codingbuf.c_str());
+          switch (w) {
+            case 8:
+              galois_w08_region_multiply(input_data, matrix[static_cast<int>(datashard) + (k * (static_cast<int>(codingshard) - k))], blocksize, output_data, 1);
+              break;
+            case 16:
+              galois_w16_region_multiply(input_data, matrix[static_cast<int>(datashard) + (k * (static_cast<int>(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);
index 2ce7020cbcfecc7dcf2d5c2d3153dab5a0d66f0f..cd6025936dc660bb9fe825df6c602702f158a0da 100644 (file)
@@ -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<ceph::bufferptr> &in,
+                        shard_id_map<ceph::bufferptr> &out);
+
   unsigned get_alignment() const override;
   size_t get_minimum_granularity() override
   {