]> git.proxmox.com Git - ceph.git/blame - ceph/src/erasure-code/jerasure/ErasureCodeJerasure.h
update sources to v12.1.1
[ceph.git] / ceph / src / erasure-code / jerasure / ErasureCodeJerasure.h
CommitLineData
7c673cae
FG
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) 2013, 2014 Cloudwatt <libre.licensing@cloudwatt.com>
7 * Copyright (C) 2014 Red Hat <contact@redhat.com>
8 *
9 * Author: Loic Dachary <loic@dachary.org>
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
15 *
16 */
17
18#ifndef CEPH_ERASURE_CODE_JERASURE_H
19#define CEPH_ERASURE_CODE_JERASURE_H
20
21#include "erasure-code/ErasureCode.h"
22
7c673cae
FG
23class ErasureCodeJerasure : public ErasureCode {
24public:
25 int k;
26 std::string DEFAULT_K;
27 int m;
28 std::string DEFAULT_M;
29 int w;
30 std::string DEFAULT_W;
31 const char *technique;
224ce89b
WB
32 std::string rule_root;
33 std::string rule_failure_domain;
7c673cae
FG
34 bool per_chunk_alignment;
35
36 explicit ErasureCodeJerasure(const char *_technique) :
37 k(0),
38 DEFAULT_K("2"),
39 m(0),
40 DEFAULT_M("1"),
41 w(0),
42 DEFAULT_W("8"),
43 technique(_technique),
7c673cae
FG
44 per_chunk_alignment(false)
45 {}
46
47 ~ErasureCodeJerasure() override {}
48
7c673cae
FG
49 unsigned int get_chunk_count() const override {
50 return k + m;
51 }
52
53 unsigned int get_data_chunk_count() const override {
54 return k;
55 }
56
57 unsigned int get_chunk_size(unsigned int object_size) const override;
58
31f18b77
FG
59 int encode_chunks(const std::set<int> &want_to_encode,
60 std::map<int, bufferlist> *encoded) override;
7c673cae 61
31f18b77
FG
62 int decode_chunks(const std::set<int> &want_to_read,
63 const std::map<int, bufferlist> &chunks,
64 std::map<int, bufferlist> *decoded) override;
7c673cae 65
31f18b77 66 int init(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
67
68 virtual void jerasure_encode(char **data,
69 char **coding,
70 int blocksize) = 0;
71 virtual int jerasure_decode(int *erasures,
72 char **data,
73 char **coding,
74 int blocksize) = 0;
75 virtual unsigned get_alignment() const = 0;
76 virtual void prepare() = 0;
77 static bool is_prime(int value);
78protected:
31f18b77 79 virtual int parse(ErasureCodeProfile &profile, std::ostream *ss);
7c673cae
FG
80};
81
82class ErasureCodeJerasureReedSolomonVandermonde : public ErasureCodeJerasure {
83public:
84 int *matrix;
85
86 ErasureCodeJerasureReedSolomonVandermonde() :
87 ErasureCodeJerasure("reed_sol_van"),
88 matrix(0)
89 {
90 DEFAULT_K = "7";
91 DEFAULT_M = "3";
92 DEFAULT_W = "8";
93 }
94 ~ErasureCodeJerasureReedSolomonVandermonde() override {
95 if (matrix)
96 free(matrix);
97 }
98
99 void jerasure_encode(char **data,
100 char **coding,
101 int blocksize) override;
102 int jerasure_decode(int *erasures,
103 char **data,
104 char **coding,
105 int blocksize) override;
106 unsigned get_alignment() const override;
107 void prepare() override;
108private:
31f18b77 109 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
110};
111
112class ErasureCodeJerasureReedSolomonRAID6 : public ErasureCodeJerasure {
113public:
114 int *matrix;
115
116 ErasureCodeJerasureReedSolomonRAID6() :
117 ErasureCodeJerasure("reed_sol_r6_op"),
118 matrix(0)
119 {
120 DEFAULT_K = "7";
121 DEFAULT_W = "8";
122 }
123 ~ErasureCodeJerasureReedSolomonRAID6() override {
124 if (matrix)
125 free(matrix);
126 }
127
128 void jerasure_encode(char **data,
129 char **coding,
130 int blocksize) override;
131 int jerasure_decode(int *erasures,
132 char **data,
133 char **coding,
134 int blocksize) override;
135 unsigned get_alignment() const override;
136 void prepare() override;
137private:
31f18b77 138 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
139};
140
141#define DEFAULT_PACKETSIZE "2048"
142
143class ErasureCodeJerasureCauchy : public ErasureCodeJerasure {
144public:
145 int *bitmatrix;
146 int **schedule;
147 int packetsize;
148
149 explicit ErasureCodeJerasureCauchy(const char *technique) :
150 ErasureCodeJerasure(technique),
151 bitmatrix(0),
152 schedule(0),
153 packetsize(0)
154 {
155 DEFAULT_K = "7";
156 DEFAULT_M = "3";
157 DEFAULT_W = "8";
158 }
159 ~ErasureCodeJerasureCauchy() override {
160 if (bitmatrix)
161 free(bitmatrix);
162 if (schedule)
163 free(schedule);
164 }
165
166 void jerasure_encode(char **data,
167 char **coding,
168 int blocksize) override;
169 int jerasure_decode(int *erasures,
170 char **data,
171 char **coding,
172 int blocksize) override;
173 unsigned get_alignment() const override;
174 void prepare_schedule(int *matrix);
175private:
31f18b77 176 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
177};
178
179class ErasureCodeJerasureCauchyOrig : public ErasureCodeJerasureCauchy {
180public:
181 ErasureCodeJerasureCauchyOrig() :
182 ErasureCodeJerasureCauchy("cauchy_orig")
183 {}
184
185 void prepare() override;
186};
187
188class ErasureCodeJerasureCauchyGood : public ErasureCodeJerasureCauchy {
189public:
190 ErasureCodeJerasureCauchyGood() :
191 ErasureCodeJerasureCauchy("cauchy_good")
192 {}
193
194 void prepare() override;
195};
196
197class ErasureCodeJerasureLiberation : public ErasureCodeJerasure {
198public:
199 int *bitmatrix;
200 int **schedule;
201 int packetsize;
202
203 explicit ErasureCodeJerasureLiberation(const char *technique = "liberation") :
204 ErasureCodeJerasure(technique),
205 bitmatrix(0),
206 schedule(0),
207 packetsize(0)
208 {
209 DEFAULT_K = "2";
210 DEFAULT_M = "2";
211 DEFAULT_W = "7";
212 }
213 ~ErasureCodeJerasureLiberation() override;
214
215 void jerasure_encode(char **data,
216 char **coding,
217 int blocksize) override;
218 int jerasure_decode(int *erasures,
219 char **data,
220 char **coding,
221 int blocksize) override;
222 unsigned get_alignment() const override;
31f18b77
FG
223 virtual bool check_k(std::ostream *ss) const;
224 virtual bool check_w(std::ostream *ss) const;
225 virtual bool check_packetsize_set(std::ostream *ss) const;
226 virtual bool check_packetsize(std::ostream *ss) const;
7c673cae 227 virtual int revert_to_default(ErasureCodeProfile &profile,
31f18b77 228 std::ostream *ss);
7c673cae
FG
229 void prepare() override;
230private:
31f18b77 231 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
232};
233
234class ErasureCodeJerasureBlaumRoth : public ErasureCodeJerasureLiberation {
235public:
236 ErasureCodeJerasureBlaumRoth() :
237 ErasureCodeJerasureLiberation("blaum_roth")
238 {
239 }
240
31f18b77 241 bool check_w(std::ostream *ss) const override;
7c673cae
FG
242 void prepare() override;
243};
244
245class ErasureCodeJerasureLiber8tion : public ErasureCodeJerasureLiberation {
246public:
247 ErasureCodeJerasureLiber8tion() :
248 ErasureCodeJerasureLiberation("liber8tion")
249 {
250 DEFAULT_K = "2";
251 DEFAULT_M = "2";
252 DEFAULT_W = "8";
253 }
254
255 void prepare() override;
256private:
31f18b77 257 int parse(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae
FG
258};
259
260#endif