]> git.proxmox.com Git - ceph.git/blob - ceph/src/erasure-code/ErasureCode.h
e544b022a126b35e44787f42a1f232cfb749abae
[ceph.git] / ceph / src / erasure-code / ErasureCode.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3 /*
4 * Ceph distributed storage system
5 *
6 * Copyright (C) 2014 Cloudwatt <libre.licensing@cloudwatt.com>
7 *
8 * Author: Loic Dachary <loic@dachary.org>
9 *
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.
14 *
15 */
16
17 #ifndef CEPH_ERASURE_CODE_H
18 #define CEPH_ERASURE_CODE_H
19
20 /*! @file ErasureCode.h
21 @brief Base class for erasure code plugins implementors
22
23 */
24
25 #include "ErasureCodeInterface.h"
26
27 namespace ceph {
28
29 class ErasureCode : public ErasureCodeInterface {
30 public:
31 static const unsigned SIMD_ALIGN;
32
33 std::vector<int> chunk_mapping;
34 ErasureCodeProfile _profile;
35
36 ~ErasureCode() override {}
37
38 int init(ErasureCodeProfile &profile, std::ostream *ss) override {
39 _profile = profile;
40 return 0;
41 }
42
43 const ErasureCodeProfile &get_profile() const override {
44 return _profile;
45 }
46
47 int sanity_check_k(int k, std::ostream *ss);
48
49 unsigned int get_coding_chunk_count() const override {
50 return get_chunk_count() - get_data_chunk_count();
51 }
52
53 int minimum_to_decode(const std::set<int> &want_to_read,
54 const std::set<int> &available_chunks,
55 std::set<int> *minimum) override;
56
57 int minimum_to_decode_with_cost(const std::set<int> &want_to_read,
58 const std::map<int, int> &available,
59 std::set<int> *minimum) override;
60
61 int encode_prepare(const bufferlist &raw,
62 std::map<int, bufferlist> &encoded) const;
63
64 int encode(const std::set<int> &want_to_encode,
65 const bufferlist &in,
66 std::map<int, bufferlist> *encoded) override;
67
68 int encode_chunks(const std::set<int> &want_to_encode,
69 std::map<int, bufferlist> *encoded) override;
70
71 int decode(const std::set<int> &want_to_read,
72 const std::map<int, bufferlist> &chunks,
73 std::map<int, bufferlist> *decoded) override;
74
75 int decode_chunks(const std::set<int> &want_to_read,
76 const std::map<int, bufferlist> &chunks,
77 std::map<int, bufferlist> *decoded) override;
78
79 const std::vector<int> &get_chunk_mapping() const override;
80
81 int to_mapping(const ErasureCodeProfile &profile,
82 std::ostream *ss);
83
84 static int to_int(const std::string &name,
85 ErasureCodeProfile &profile,
86 int *value,
87 const std::string &default_value,
88 std::ostream *ss);
89
90 static int to_bool(const std::string &name,
91 ErasureCodeProfile &profile,
92 bool *value,
93 const std::string &default_value,
94 std::ostream *ss);
95
96 static int to_string(const std::string &name,
97 ErasureCodeProfile &profile,
98 std::string *value,
99 const std::string &default_value,
100 std::ostream *ss);
101
102 int decode_concat(const std::map<int, bufferlist> &chunks,
103 bufferlist *decoded) override;
104
105 protected:
106 int parse(const ErasureCodeProfile &profile,
107 std::ostream *ss);
108
109 private:
110 int chunk_index(unsigned int i) const;
111 };
112 }
113
114 #endif