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 std::vector<unsigned char> memory((
size_t) (m * k * 3));
92 backup = &memory[m * k];
93 invert_matrix = &memory[2 * m * k];
96 for (i = 0, r = 0; i < k; i++, r++) {
97 while (src_in_err[r]) {
100 for (j = 0; j < k; j++) {
101 b[k * i + j] = encode_matrix[k * r + j];
102 backup[k * i + j] = encode_matrix[k * r + j];
107 while (gf_invert_matrix(b, invert_matrix, k) < 0) {
108 if (nerrs == (m - k)) {
112 memcpy(b, backup, (
size_t) (m * k));
113 for (i = nsrcerrs; i < nerrs - nsrcerrs; i++) {
114 if (src_err_list[i] == (decode_index[k - 1] + incr)) {
120 if (decode_index[k - 1] + incr >= m) {
123 decode_index[k - 1] += incr;
124 for (j = 0; j < k; j++) {
125 b[k * (k - 1) + j] = encode_matrix[k * decode_index[k - 1] + j];
130 for (i = 0; i < nsrcerrs; i++) {
131 for (j = 0; j < k; j++) {
132 decode_matrix[k * i + j] = invert_matrix[k * src_err_list[i] + j];
136 for (p = nsrcerrs; p < nerrs; p++) {
137 for (i = 0; i < k; i++) {
139 for (j = 0; j < k; j++) {
140 s ^= gf_mul(invert_matrix[j * k + i],
141 encode_matrix[k * src_err_list[p] + j]);
144 decode_matrix[k * p + i] = s;
152 encode_matrix( objcfg.nbchunks * objcfg.nbdata )
156 gf_gen_cauchy1_matrix( encode_matrix.data(),
static_cast<int>( objcfg.
nbchunks ),
static_cast<int>( objcfg.
nbdata ) );
160 std::string RedundancyProvider::getErrorPattern(
stripes_t &stripes )
const
162 std::string pattern( objcfg.
nbchunks, 0 );
163 for( uint8_t i = 0; i < objcfg.
nbchunks; ++i )
164 if( !stripes[i].valid ) pattern[i] =
'\1';
170 RedundancyProvider::CodingTable& RedundancyProvider::getCodingTable(
const std::string& pattern )
172 std::lock_guard<std::mutex> lock(mutex);
175 if( !cache.count(pattern) )
178 int nerrs = 0, nsrcerrs = 0;
179 unsigned char err_indx_list[objcfg.
nbparity];
180 for (std::uint8_t i = 0; i < pattern.size(); i++) {
182 err_indx_list[nerrs++] = i;
183 if (i < objcfg.
nbdata) { nsrcerrs++; }
190 dd.blockIndices.resize( objcfg.
nbdata );
194 std::vector<unsigned char> decode_matrix(objcfg.
nbchunks * objcfg.
nbdata);
197 err_indx_list, (
unsigned char*) pattern.c_str(), nerrs, nsrcerrs,
198 static_cast<int>( objcfg.
nbdata ),
static_cast<int>( objcfg.
nbchunks ) ) )
202 ec_init_tables(
static_cast<int>( objcfg.
nbdata ), nerrs, decode_matrix.data(), dd.table.data() );
203 cache.insert( std::make_pair(pattern, dd) );
205 return cache.at(pattern);
208 void RedundancyProvider::replication(
stripes_t &stripes )
211 void *healthy =
nullptr;
212 for(
auto itr = stripes.begin(); itr != stripes.end(); ++itr )
215 healthy = itr->buffer;
221 for( uint8_t i = 0; i < objcfg.
nbchunks; ++i )
223 if( !stripes[i].valid )
224 memcpy( stripes[i].buffer, healthy, objcfg.
chunksize );
231 std::string pattern = getErrorPattern( stripes );
238 return replication( stripes );
241 CodingTable& dd = getCodingTable(pattern);
243 unsigned char* inbuf[objcfg.
nbdata];
244 for( uint8_t i = 0; i < objcfg.
nbdata; i++ )
245 inbuf[i] =
reinterpret_cast<unsigned char*
>( stripes[dd.blockIndices[i]].buffer );
247 std::vector<unsigned char> memory( dd.nErrors * objcfg.
chunksize );
249 unsigned char* outbuf[dd.nErrors];
250 for (
int i = 0; i < dd.nErrors; i++)
252 outbuf[i] = &memory[i * objcfg.
chunksize];
257 static_cast<int>( objcfg.
nbdata ),
265 for (
size_t i = 0; i < objcfg.
nbchunks; i++)
269 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)