diff options
Diffstat (limited to 'src/erasure-code/isa/ErasureCodeIsa.h')
-rw-r--r-- | src/erasure-code/isa/ErasureCodeIsa.h | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/src/erasure-code/isa/ErasureCodeIsa.h b/src/erasure-code/isa/ErasureCodeIsa.h new file mode 100644 index 000000000..705a1723a --- /dev/null +++ b/src/erasure-code/isa/ErasureCodeIsa.h @@ -0,0 +1,153 @@ +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2014 CERN (Switzerland) + * + * Author: Andreas-Joachim Peters <Andreas.Joachim.Peters@cern.ch> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + */ + +/** + * @file ErasureCodeIsa.cc + * + * @brief Erasure Code CODEC using the INTEL ISA-L library. + * + * The INTEL ISA-L library supports two pre-defined encoding matrices (cauchy = default, reed_sol_van = default) + * The default CODEC implementation using these two matrices is implemented in class ErasureCodeIsaDefault. + * ISA-L allows to use custom matrices which might be added later as implementations deriving from the base class ErasoreCodeIsa. + */ + +#ifndef CEPH_ERASURE_CODE_ISA_L_H +#define CEPH_ERASURE_CODE_ISA_L_H + +// ----------------------------------------------------------------------------- +#include "erasure-code/ErasureCode.h" +#include "ErasureCodeIsaTableCache.h" +// ----------------------------------------------------------------------------- + +class ErasureCodeIsa : public ceph::ErasureCode { +public: + + enum eMatrix { + kVandermonde = 0, kCauchy = 1 + }; + + int k; + int m; + int w; + + ErasureCodeIsaTableCache &tcache; + const char *technique; + + ErasureCodeIsa(const char *_technique, + ErasureCodeIsaTableCache &_tcache) : + k(0), + m(0), + w(0), + tcache(_tcache), + technique(_technique) + { + } + + + ~ErasureCodeIsa() override + { + } + + unsigned int + get_chunk_count() const override + { + return k + m; + } + + unsigned int + get_data_chunk_count() const override + { + return k; + } + + unsigned int get_chunk_size(unsigned int object_size) const override; + + int encode_chunks(const std::set<int> &want_to_encode, + std::map<int, ceph::buffer::list> *encoded) override; + + int decode_chunks(const std::set<int> &want_to_read, + const std::map<int, ceph::buffer::list> &chunks, + std::map<int, ceph::buffer::list> *decoded) override; + + int init(ceph::ErasureCodeProfile &profile, std::ostream *ss) override; + + virtual void isa_encode(char **data, + char **coding, + int blocksize) = 0; + + + virtual int isa_decode(int *erasures, + char **data, + char **coding, + int blocksize) = 0; + + virtual unsigned get_alignment() const = 0; + + virtual void prepare() = 0; + + private: + virtual int parse(ceph::ErasureCodeProfile &profile, + std::ostream *ss) = 0; +}; + +// ----------------------------------------------------------------------------- + +class ErasureCodeIsaDefault : public ErasureCodeIsa { +private: + int matrixtype; + +public: + + static const std::string DEFAULT_K; + static const std::string DEFAULT_M; + + unsigned char* encode_coeff; // encoding coefficient + unsigned char* encode_tbls; // encoding table + + ErasureCodeIsaDefault(ErasureCodeIsaTableCache &_tcache, + int matrix = kVandermonde) : + + ErasureCodeIsa("default", _tcache), + encode_coeff(0), encode_tbls(0) + { + matrixtype = matrix; + } + + + ~ErasureCodeIsaDefault() override + { + + } + + void isa_encode(char **data, + char **coding, + int blocksize) override; + + virtual bool erasure_contains(int *erasures, int i); + + int isa_decode(int *erasures, + char **data, + char **coding, + int blocksize) override; + + unsigned get_alignment() const override; + + void prepare() override; + + private: + int parse(ceph::ErasureCodeProfile &profile, + std::ostream *ss) override; +}; + +#endif |