@@ -137,6 +137,18 @@ int ErasureCodeJerasure::decode_chunks(const set<int> &want_to_read,
137137 return jerasure_decode (erasures, data, coding, blocksize);
138138}
139139
140+ void ErasureCodeJerasure::encode_delta (const bufferptr &old_data,
141+ const bufferptr &new_data,
142+ bufferptr *delta_maybe_in_place)
143+ {
144+ if (&old_data != delta_maybe_in_place) {
145+ memcpy (delta_maybe_in_place->c_str (), old_data.c_str (), delta_maybe_in_place->length ());
146+ }
147+ char *new_data_p = const_cast <char *>(new_data.c_str ());
148+ char *delta_p = delta_maybe_in_place->c_str ();
149+ galois_region_xor (new_data_p, delta_p, delta_maybe_in_place->length ());
150+ }
151+
140152bool ErasureCodeJerasure::is_prime (int value)
141153{
142154 int prime55[] = {
@@ -152,7 +164,86 @@ bool ErasureCodeJerasure::is_prime(int value)
152164 return false ;
153165}
154166
155- //
167+ void ErasureCodeJerasure::matrix_apply_delta (const shard_id_map<bufferptr> &in,
168+ shard_id_map<bufferptr> &out,
169+ int k, int w, int *matrix)
170+ {
171+ auto first = in.begin ();
172+ const unsigned blocksize = first->second .length ();
173+
174+ for (auto const & [datashard, databuf] : in) {
175+ if (datashard < k) {
176+ for (auto const & [codingshard, codingbuf] : out) {
177+ if (codingshard >= k) {
178+ ceph_assert (codingbuf.length () == blocksize);
179+ char * input_data = const_cast <char *>(databuf.c_str ());
180+ char * output_data = const_cast <char *>(codingbuf.c_str ());
181+ if (static_cast <int >(codingshard) == k) {
182+ galois_region_xor (input_data, output_data, blocksize);
183+ }
184+ else {
185+ switch (w) {
186+ case 8 :
187+ galois_w08_region_multiply (input_data, matrix[static_cast <int >(datashard) + (k * (static_cast <int >(codingshard) - k))], blocksize, output_data, 1 );
188+ break ;
189+ case 16 :
190+ galois_w16_region_multiply (input_data, matrix[static_cast <int >(datashard) + (k * (static_cast <int >(codingshard) - k))], blocksize, output_data, 1 );
191+ break ;
192+ case 32 :
193+ galois_w32_region_multiply (input_data, matrix[static_cast <int >(datashard) + (k * (static_cast <int >(codingshard) - k))], blocksize, output_data, 1 );
194+ break ;
195+ }
196+ }
197+ }
198+ }
199+ }
200+ }
201+ }
202+
203+ void ErasureCodeJerasure::do_scheduled_ops (char **ptrs, int **operations, int packetsize, int s, int d)
204+ {
205+ char *sptr;
206+ char *dptr;
207+ int op;
208+
209+ for (op = 0 ; operations[op][0 ] >= 0 ; op++) {
210+ if (operations[op][0 ] == s && operations[op][2 ] == d) {
211+ sptr = ptrs[0 ] + operations[op][1 ]*packetsize;
212+ dptr = ptrs[1 ] + operations[op][3 ]*packetsize;
213+ galois_region_xor (sptr, dptr, packetsize);
214+ }
215+ }
216+ }
217+
218+ void ErasureCodeJerasure::schedule_apply_delta (const shard_id_map<bufferptr> &in,
219+ shard_id_map<bufferptr> &out,
220+ int k, int w, int packetsize,
221+ int ** simple_schedule)
222+ {
223+ auto first = in.begin ();
224+ unsigned int blocksize = first->second .length ();
225+
226+ for (auto const & [datashard, databuf] : in) {
227+ if (datashard < k) {
228+ for (auto const & [codingshard, codingbuf] : out) {
229+ if (codingshard >= k) {
230+ ceph_assert (codingbuf.length () == blocksize);
231+ char * ptr_copy[2 ];
232+ ptr_copy[0 ] = const_cast <char *>(databuf.c_str ());
233+ ptr_copy[1 ] = const_cast <char *>(codingbuf.c_str ());
234+ unsigned int done;
235+ for (done = 0 ; done < blocksize; done += (packetsize*w)) {
236+ do_scheduled_ops (ptr_copy, simple_schedule, packetsize, static_cast <int >(datashard), static_cast <int >(codingshard));
237+ ptr_copy[0 ] += (packetsize*w);
238+ ptr_copy[1 ] += (packetsize*w);
239+ }
240+ }
241+ }
242+ }
243+ }
244+ }
245+
246+ //
156247// ErasureCodeJerasureReedSolomonVandermonde
157248//
158249void ErasureCodeJerasureReedSolomonVandermonde::jerasure_encode (char **data,
@@ -171,6 +262,12 @@ int ErasureCodeJerasureReedSolomonVandermonde::jerasure_decode(int *erasures,
171262 erasures, data, coding, blocksize);
172263}
173264
265+ void ErasureCodeJerasureReedSolomonVandermonde::apply_delta (const shard_id_map<bufferptr> &in,
266+ shard_id_map<bufferptr> &out)
267+ {
268+ matrix_apply_delta (in, out, k, w, matrix);
269+ }
270+
174271unsigned ErasureCodeJerasureReedSolomonVandermonde::get_alignment () const
175272{
176273 if (per_chunk_alignment) {
@@ -221,6 +318,12 @@ int ErasureCodeJerasureReedSolomonRAID6::jerasure_decode(int *erasures,
221318 return jerasure_matrix_decode (k, m, w, matrix, 1 , erasures, data, coding, blocksize);
222319}
223320
321+ void ErasureCodeJerasureReedSolomonRAID6::apply_delta (const shard_id_map<bufferptr> &in,
322+ shard_id_map<bufferptr> &out)
323+ {
324+ matrix_apply_delta (in, out, k, w, matrix);
325+ }
326+
224327unsigned ErasureCodeJerasureReedSolomonRAID6::get_alignment () const
225328{
226329 if (per_chunk_alignment) {
@@ -275,6 +378,12 @@ int ErasureCodeJerasureCauchy::jerasure_decode(int *erasures,
275378 erasures, data, coding, blocksize, packetsize, 1 );
276379}
277380
381+ void ErasureCodeJerasureCauchy::apply_delta (const shard_id_map<bufferptr> &in,
382+ shard_id_map<bufferptr> &out)
383+ {
384+ schedule_apply_delta (in, out, k, w, packetsize, simple_schedule);
385+ }
386+
278387unsigned ErasureCodeJerasureCauchy::get_alignment () const
279388{
280389 if (per_chunk_alignment) {
@@ -305,6 +414,7 @@ void ErasureCodeJerasureCauchy::prepare_schedule(int *matrix)
305414{
306415 bitmatrix = jerasure_matrix_to_bitmatrix (k, m, w, matrix);
307416 schedule = jerasure_smart_bitmatrix_to_schedule (k, m, w, bitmatrix);
417+ simple_schedule = jerasure_dumb_bitmatrix_to_schedule (k, m, w, bitmatrix);
308418}
309419
310420ErasureCodeJerasureCauchy::~ErasureCodeJerasureCauchy ()
@@ -313,6 +423,8 @@ ErasureCodeJerasureCauchy::~ErasureCodeJerasureCauchy()
313423 free (bitmatrix);
314424 if (schedule)
315425 jerasure_free_schedule (schedule);
426+ if (simple_schedule)
427+ jerasure_free_schedule (simple_schedule);
316428}
317429
318430//
@@ -344,6 +456,8 @@ ErasureCodeJerasureLiberation::~ErasureCodeJerasureLiberation()
344456 free (bitmatrix);
345457 if (schedule)
346458 jerasure_free_schedule (schedule);
459+ if (simple_schedule)
460+ jerasure_free_schedule (simple_schedule);
347461}
348462
349463void ErasureCodeJerasureLiberation::jerasure_encode (char **data,
@@ -363,6 +477,12 @@ int ErasureCodeJerasureLiberation::jerasure_decode(int *erasures,
363477 coding, blocksize, packetsize, 1 );
364478}
365479
480+ void ErasureCodeJerasureLiberation::apply_delta (const shard_id_map<bufferptr> &in,
481+ shard_id_map<bufferptr> &out)
482+ {
483+ schedule_apply_delta (in, out, k, w, packetsize, simple_schedule);
484+ }
485+
366486unsigned ErasureCodeJerasureLiberation::get_alignment () const
367487{
368488 unsigned alignment = k*w*packetsize*sizeof (int );
@@ -451,6 +571,7 @@ void ErasureCodeJerasureLiberation::prepare()
451571{
452572 bitmatrix = liberation_coding_bitmatrix (k, w);
453573 schedule = jerasure_smart_bitmatrix_to_schedule (k, m, w, bitmatrix);
574+ simple_schedule = jerasure_dumb_bitmatrix_to_schedule (k, m, w, bitmatrix);
454575}
455576
456577//
@@ -475,6 +596,7 @@ void ErasureCodeJerasureBlaumRoth::prepare()
475596{
476597 bitmatrix = blaum_roth_coding_bitmatrix (k, w);
477598 schedule = jerasure_smart_bitmatrix_to_schedule (k, m, w, bitmatrix);
599+ simple_schedule = jerasure_dumb_bitmatrix_to_schedule (k, m, w, bitmatrix);
478600}
479601
480602//
@@ -512,4 +634,5 @@ void ErasureCodeJerasureLiber8tion::prepare()
512634{
513635 bitmatrix = liber8tion_coding_bitmatrix (k);
514636 schedule = jerasure_smart_bitmatrix_to_schedule (k, m, w, bitmatrix);
637+ simple_schedule = jerasure_dumb_bitmatrix_to_schedule (k, m, w, bitmatrix);
515638}
0 commit comments