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);
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 {
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
{