39 template<
typename...Args>
42 argsToStream(s, std::forward<Args>(args)...);
51 template<
typename Last>
52 static void argsToStream(std::stringstream& stream, Last&& last) {
62 template<
typename First,
typename...Rest >
63 static void argsToStream(std::stringstream& stream, First&& first, Rest&&...rest) {
65 argsToStream(stream, std::forward<Rest>(rest)...);
74 unsigned char* encode_matrix,
75 unsigned char* decode_matrix,
76 unsigned int* decode_index,
77 unsigned char* src_err_list,
78 unsigned char* src_in_err,
80 unsigned int nsrcerrs,
87 unsigned char* invert_matrix, * backup, * b, s;
90 size_t mk = (size_t)m * (
size_t)k;
91 std::vector<unsigned char> memory(3 * mk);
94 invert_matrix = &memory[2 * mk];
97 for (i = 0, r = 0; i < k; i++, r++) {
98 while (src_in_err[r]) {
101 for (j = 0; j < k; j++) {
102 b[k * i + j] = encode_matrix[k * r + j];
103 backup[k * i + j] = encode_matrix[k * r + j];
108 while (gf_invert_matrix(b, invert_matrix, k) < 0) {
109 if (nerrs == (m - k)) {
113 memcpy(b, backup, mk);
114 for (i = nsrcerrs; i < nerrs - nsrcerrs; i++) {
115 if (src_err_list[i] == (decode_index[k - 1] + incr)) {
121 if (decode_index[k - 1] + incr >= m) {
124 decode_index[k - 1] += incr;
125 for (j = 0; j < k; j++) {
126 b[k * (k - 1) + j] = encode_matrix[k * decode_index[k - 1] + j];
131 for (i = 0; i < nsrcerrs; i++) {
132 for (j = 0; j < k; j++) {
133 decode_matrix[k * i + j] = invert_matrix[k * src_err_list[i] + j];
137 for (p = nsrcerrs; p < nerrs; p++) {
138 for (i = 0; i < k; i++) {
140 for (j = 0; j < k; j++) {
141 s ^= gf_mul(invert_matrix[j * k + i],
142 encode_matrix[k * src_err_list[p] + j]);
145 decode_matrix[k * p + i] = s;
153 encode_matrix( objcfg.nbchunks * objcfg.nbdata )
157 gf_gen_cauchy1_matrix( encode_matrix.data(),
static_cast<int>( objcfg.
nbchunks ),
static_cast<int>( objcfg.
nbdata ) );
161 std::string RedundancyProvider::getErrorPattern(
stripes_t &stripes )
const
163 std::string pattern( objcfg.
nbchunks, 0 );
164 for( uint8_t i = 0; i < objcfg.
nbchunks; ++i )
165 if( !stripes[i].valid ) pattern[i] =
'\1';
171 RedundancyProvider::CodingTable& RedundancyProvider::getCodingTable(
const std::string& pattern )
173 std::lock_guard<std::mutex> lock(mutex);
176 if( !cache.count(pattern) )
179 int nerrs = 0, nsrcerrs = 0;
180 unsigned char err_indx_list[objcfg.
nbparity];
182 uint8_t n =
static_cast<uint8_t
>(pattern.size() & 0xff);
183 for (uint8_t i = 0; i < n; i++) {
185 err_indx_list[nerrs++] = i;
186 if (i < objcfg.
nbdata) { nsrcerrs++; }
193 dd.blockIndices.resize( objcfg.
nbdata );
197 std::vector<unsigned char> decode_matrix(objcfg.
nbchunks * objcfg.
nbdata);
200 err_indx_list, (
unsigned char*) pattern.c_str(), nerrs, nsrcerrs,
201 static_cast<int>( objcfg.
nbdata ),
static_cast<int>( objcfg.
nbchunks ) ) )
205 ec_init_tables(
static_cast<int>( objcfg.
nbdata ), nerrs, decode_matrix.data(), dd.table.data() );
206 cache.insert( std::make_pair(pattern, dd) );
208 return cache.at(pattern);
211 void RedundancyProvider::replication(
stripes_t &stripes )
214 void *healthy =
nullptr;
215 for(
auto itr = stripes.begin(); itr != stripes.end(); ++itr )
218 healthy = itr->buffer;
224 for( uint8_t i = 0; i < objcfg.
nbchunks; ++i )
226 if( !stripes[i].valid )
227 memcpy( stripes[i].buffer, healthy, objcfg.
chunksize );
234 std::string pattern = getErrorPattern( stripes );
241 return replication( stripes );
244 CodingTable& dd = getCodingTable(pattern);
246 unsigned char* inbuf[objcfg.
nbdata];
247 for( uint8_t i = 0; i < objcfg.
nbdata; i++ )
248 inbuf[i] =
reinterpret_cast<unsigned char*
>( stripes[dd.blockIndices[i]].buffer );
250 std::vector<unsigned char> memory( dd.nErrors * objcfg.
chunksize );
252 unsigned char* outbuf[dd.nErrors];
253 for (
int i = 0; i < dd.nErrors; i++)
255 outbuf[i] = &memory[i * objcfg.
chunksize];
260 static_cast<int>( objcfg.
nbdata ),
268 for (
size_t i = 0; i < objcfg.
nbchunks; i++)
272 memcpy( stripes[i].buffer, outbuf[e], objcfg.
chunksize );
Class for computing parities and recovering data.
static std::string toString(Args &&...args)
RedundancyProvider(const ObjCfg &objcfg)
void compute(stripes_t &stripes)
const uint16_t stError
An error occurred that could potentially be retried.
const uint16_t errDataError
data is corrupted
std::vector< stripe_t > stripes_t
All stripes in a block.
static int gf_gen_decode_matrix(unsigned char *encode_matrix, unsigned char *decode_matrix, unsigned int *decode_index, unsigned char *src_err_list, unsigned char *src_in_err, unsigned int nerrs, unsigned int nsrcerrs, unsigned int k, unsigned int m)