1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2018 Indian Institute of Science <office.ece@iisc.ac.in>
8 * Author: Myna Vajha <mynaramana@gmail.com>
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
17 #ifndef CEPH_ERASURE_CODE_CLAY_H
18 #define CEPH_ERASURE_CODE_CLAY_H
20 #include "include/err.h"
21 #include "include/buffer_fwd.h"
22 #include "erasure-code/ErasureCode.h"
24 class ErasureCodeClay final
: public ceph::ErasureCode
{
26 std::string DEFAULT_K
{"4"};
27 std::string DEFAULT_M
{"2"};
28 std::string DEFAULT_W
{"8"};
29 int k
= 0, m
= 0, d
= 0, w
= 8;
30 int q
= 0, t
= 0, nu
= 0;
33 std::map
<int, ceph::bufferlist
> U_buf
;
36 ceph::ErasureCodeInterfaceRef erasure_code
;
37 ceph::ErasureCodeProfile profile
;
41 const std::string directory
;
43 explicit ErasureCodeClay(const std::string
& dir
)
47 ~ErasureCodeClay() override
;
49 unsigned int get_chunk_count() const override
{
53 unsigned int get_data_chunk_count() const override
{
57 int get_sub_chunk_count() override
{
61 unsigned int get_chunk_size(unsigned int object_size
) const override
;
63 int minimum_to_decode(const std::set
<int> &want_to_read
,
64 const std::set
<int> &available
,
65 std::map
<int, std::vector
<std::pair
<int, int>>> *minimum
) override
;
67 int decode(const std::set
<int> &want_to_read
,
68 const std::map
<int, ceph::bufferlist
> &chunks
,
69 std::map
<int, ceph::bufferlist
> *decoded
, int chunk_size
) override
;
71 int encode_chunks(const std::set
<int> &want_to_encode
,
72 std::map
<int, ceph::bufferlist
> *encoded
) override
;
74 int decode_chunks(const std::set
<int> &want_to_read
,
75 const std::map
<int, ceph::bufferlist
> &chunks
,
76 std::map
<int, ceph::bufferlist
> *decoded
) override
;
78 int init(ceph::ErasureCodeProfile
&profile
, std::ostream
*ss
) override
;
80 int is_repair(const std::set
<int> &want_to_read
,
81 const std::set
<int> &available_chunks
);
83 int get_repair_sub_chunk_count(const std::set
<int> &want_to_read
);
85 virtual int parse(ceph::ErasureCodeProfile
&profile
, std::ostream
*ss
);
88 int minimum_to_repair(const std::set
<int> &want_to_read
,
89 const std::set
<int> &available_chunks
,
90 std::map
<int, std::vector
<std::pair
<int, int>>> *minimum
);
92 int repair(const std::set
<int> &want_to_read
,
93 const std::map
<int, ceph::bufferlist
> &chunks
,
94 std::map
<int, ceph::bufferlist
> *recovered
, int chunk_size
);
96 int decode_layered(std::set
<int>& erased_chunks
, std::map
<int, ceph::bufferlist
>* chunks
);
98 int repair_one_lost_chunk(std::map
<int, ceph::bufferlist
> &recovered_data
, std::set
<int> &aloof_nodes
,
99 std::map
<int, ceph::bufferlist
> &helper_data
, int repair_blocksize
,
100 std::vector
<std::pair
<int,int>> &repair_sub_chunks_ind
);
102 void get_repair_subchunks(const int &lost_node
,
103 std::vector
<std::pair
<int, int>> &repair_sub_chunks_ind
);
105 int decode_erasures(const std::set
<int>& erased_chunks
, int z
,
106 std::map
<int, ceph::bufferlist
>* chunks
, int sc_size
);
108 int decode_uncoupled(const std::set
<int>& erasures
, int z
, int ss_size
);
110 void set_planes_sequential_decoding_order(int* order
, std::set
<int>& erasures
);
112 void recover_type1_erasure(std::map
<int, ceph::bufferlist
>* chunks
, int x
, int y
, int z
,
113 int* z_vec
, int sc_size
);
115 void get_uncoupled_from_coupled(std::map
<int, ceph::bufferlist
>* chunks
, int x
, int y
, int z
,
116 int* z_vec
, int sc_size
);
118 void get_coupled_from_uncoupled(std::map
<int, ceph::bufferlist
>* chunks
, int x
, int y
, int z
,
119 int* z_vec
, int sc_size
);
121 void get_plane_vector(int z
, int* z_vec
);
123 int get_max_iscore(std::set
<int>& erased_chunks
);