*
*/
+#include <errno.h>
+#include <vector>
+#include <algorithm>
+
#include "ErasureCode.h"
+
+int ErasureCode::minimum_to_decode(const set<int> &want_to_read,
+ const set<int> &available_chunks,
+ set<int> *minimum)
+{
+ if (includes(available_chunks.begin(), available_chunks.end(),
+ want_to_read.begin(), want_to_read.end())) {
+ *minimum = want_to_read;
+ } else {
+ unsigned int k = get_data_chunk_count();
+ if (available_chunks.size() < (unsigned)k)
+ return -EIO;
+ set<int>::iterator i;
+ unsigned j;
+ for (i = available_chunks.begin(), j = 0; j < (unsigned)k; ++i, j++)
+ minimum->insert(*i);
+ }
+ return 0;
+}
+
+int ErasureCode::minimum_to_decode_with_cost(const set<int> &want_to_read,
+ const map<int, int> &available,
+ set<int> *minimum)
+{
+ set <int> available_chunks;
+ for (map<int, int>::const_iterator i = available.begin();
+ i != available.end();
+ ++i)
+ available_chunks.insert(i->first);
+ return minimum_to_decode(want_to_read, available_chunks, minimum);
+}
+
int ErasureCode::encode_prepare(const bufferlist &raw,
bufferlist *prepared) const
{
public:
virtual ~ErasureCode() {}
+ virtual int minimum_to_decode(const set<int> &want_to_read,
+ const set<int> &available_chunks,
+ set<int> *minimum);
+
+ virtual int minimum_to_decode_with_cost(const set<int> &want_to_read,
+ const map<int, int> &available,
+ set<int> *minimum);
+
int encode_prepare(const bufferlist &raw, bufferlist *prepared) const;
virtual int encode(const set<int> &want_to_encode,
// -----------------------------------------------------------------------------
-int
-ErasureCodeIsa::minimum_to_decode(const set<int> &want_to_read,
- const set<int> &available_chunks,
- set<int> *minimum)
-{
- if (includes(available_chunks.begin(), available_chunks.end(),
- want_to_read.begin(), want_to_read.end())) {
- *minimum = want_to_read;
- } else {
- if (available_chunks.size() < (unsigned) k)
- return -EIO;
- set<int>::iterator i;
- unsigned j;
- for (i = available_chunks.begin(), j = 0; j < (unsigned) k; ++i, j++)
- minimum->insert(*i);
- }
- return 0;
-}
-
-// -----------------------------------------------------------------------------
-
-int
-ErasureCodeIsa::minimum_to_decode_with_cost(const set<int> &want_to_read,
- const map<int, int> &available,
- set<int> *minimum)
-{
- set <int> available_chunks;
- for (map<int, int>::const_iterator i = available.begin();
- i != available.end();
- ++i)
- available_chunks.insert(i->first);
- return minimum_to_decode(want_to_read, available_chunks, minimum);
-}
-
int ErasureCodeIsa::encode_chunks(const set<int> &want_to_encode,
map<int, bufferlist> *encoded)
{
virtual unsigned int get_chunk_size(unsigned int object_size) const;
- virtual int minimum_to_decode(const set<int> &want_to_read,
- const set<int> &available_chunks,
- set<int> *minimum);
virtual int encode_chunks(const set<int> &want_to_encode,
map<int, bufferlist> *encoded);
- virtual int minimum_to_decode_with_cost(const set<int> &want_to_read,
- const map<int, int> &available,
- set<int> *minimum);
-
virtual int decode_chunks(const set<int> &want_to_read,
const map<int, bufferlist> &chunks,
map<int, bufferlist> *decoded);
}
}
-int ErasureCodeJerasure::minimum_to_decode(const set<int> &want_to_read,
- const set<int> &available_chunks,
- set<int> *minimum)
-{
- if (includes(available_chunks.begin(), available_chunks.end(),
- want_to_read.begin(), want_to_read.end())) {
- *minimum = want_to_read;
- } else {
- if (available_chunks.size() < (unsigned)k)
- return -EIO;
- set<int>::iterator i;
- unsigned j;
- for (i = available_chunks.begin(), j = 0; j < (unsigned)k; ++i, j++)
- minimum->insert(*i);
- }
- return 0;
-}
-
-int ErasureCodeJerasure::minimum_to_decode_with_cost(const set<int> &want_to_read,
- const map<int, int> &available,
- set<int> *minimum)
-{
- set <int> available_chunks;
- for (map<int, int>::const_iterator i = available.begin();
- i != available.end();
- ++i)
- available_chunks.insert(i->first);
- return minimum_to_decode(want_to_read, available_chunks, minimum);
-}
-
int ErasureCodeJerasure::encode_chunks(const set<int> &want_to_encode,
map<int, bufferlist> *encoded)
{
virtual unsigned int get_chunk_size(unsigned int object_size) const;
- virtual int minimum_to_decode(const set<int> &want_to_read,
- const set<int> &available_chunks,
- set<int> *minimum);
virtual int encode_chunks(const set<int> &want_to_encode,
map<int, bufferlist> *encoded);
- virtual int minimum_to_decode_with_cost(const set<int> &want_to_read,
- const map<int, int> &available,
- set<int> *minimum);
-
virtual int decode_chunks(const set<int> &want_to_read,
const map<int, bufferlist> &chunks,
map<int, bufferlist> *decoded);
/*
* Local Variables:
- * compile-command: "cd ../.. ; make -j4 &&
- * make unittest_erasure_code_jerasure &&
+ * compile-command: "cd ../.. ;
+ * make -j4 unittest_erasure_code_jerasure &&
* valgrind --tool=memcheck --leak-check=full \
* ./unittest_erasure_code_jerasure \
* --gtest_filter=*.* --log-to-stderr=true --debug-osd=20"