]> git.proxmox.com Git - ceph.git/blame - ceph/src/erasure-code/lrc/ErasureCodeLrc.h
buildsys: fix parallel builds
[ceph.git] / ceph / src / erasure-code / lrc / ErasureCodeLrc.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 - scalable distributed file system
5 *
6 * Copyright (C) 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_LRC_H
19#define CEPH_ERASURE_CODE_LRC_H
20
21#include "include/err.h"
22#include "json_spirit/json_spirit.h"
23#include "erasure-code/ErasureCode.h"
24
25#define ERROR_LRC_ARRAY -(MAX_ERRNO + 1)
26#define ERROR_LRC_OBJECT -(MAX_ERRNO + 2)
27#define ERROR_LRC_INT -(MAX_ERRNO + 3)
28#define ERROR_LRC_STR -(MAX_ERRNO + 4)
29#define ERROR_LRC_PLUGIN -(MAX_ERRNO + 5)
30#define ERROR_LRC_DESCRIPTION -(MAX_ERRNO + 6)
31#define ERROR_LRC_PARSE_JSON -(MAX_ERRNO + 7)
32#define ERROR_LRC_MAPPING -(MAX_ERRNO + 8)
33#define ERROR_LRC_MAPPING_SIZE -(MAX_ERRNO + 9)
34#define ERROR_LRC_FIRST_MAPPING -(MAX_ERRNO + 10)
35#define ERROR_LRC_COUNT_CONSTRAINT -(MAX_ERRNO + 11)
36#define ERROR_LRC_CONFIG_OPTIONS -(MAX_ERRNO + 12)
37#define ERROR_LRC_LAYERS_COUNT -(MAX_ERRNO + 13)
38#define ERROR_LRC_RULESET_OP -(MAX_ERRNO + 14)
39#define ERROR_LRC_RULESET_TYPE -(MAX_ERRNO + 15)
40#define ERROR_LRC_RULESET_N -(MAX_ERRNO + 16)
41#define ERROR_LRC_ALL_OR_NOTHING -(MAX_ERRNO + 17)
42#define ERROR_LRC_GENERATED -(MAX_ERRNO + 18)
43#define ERROR_LRC_K_M_MODULO -(MAX_ERRNO + 19)
44#define ERROR_LRC_K_MODULO -(MAX_ERRNO + 20)
45#define ERROR_LRC_M_MODULO -(MAX_ERRNO + 21)
46
47class ErasureCodeLrc : public ErasureCode {
48public:
31f18b77 49 static const std::string DEFAULT_KML;
7c673cae
FG
50
51 struct Layer {
31f18b77 52 explicit Layer(std::string _chunks_map) : chunks_map(_chunks_map) { }
7c673cae 53 ErasureCodeInterfaceRef erasure_code;
31f18b77
FG
54 std::vector<int> data;
55 std::vector<int> coding;
56 std::vector<int> chunks;
57 std::set<int> chunks_as_set;
58 std::string chunks_map;
7c673cae
FG
59 ErasureCodeProfile profile;
60 };
31f18b77
FG
61 std::vector<Layer> layers;
62 std::string directory;
7c673cae
FG
63 unsigned int chunk_count;
64 unsigned int data_chunk_count;
31f18b77 65 std::string ruleset_root;
7c673cae 66 struct Step {
31f18b77 67 Step(std::string _op, std::string _type, int _n) :
7c673cae
FG
68 op(_op),
69 type(_type),
70 n(_n) {}
31f18b77
FG
71 std::string op;
72 std::string type;
7c673cae
FG
73 int n;
74 };
31f18b77 75 std::vector<Step> ruleset_steps;
7c673cae
FG
76
77 explicit ErasureCodeLrc(const std::string &dir)
78 : directory(dir),
79 chunk_count(0), data_chunk_count(0), ruleset_root("default")
80 {
81 ruleset_steps.push_back(Step("chooseleaf", "host", 0));
82 }
83
84 ~ErasureCodeLrc() override {}
85
31f18b77
FG
86 std::set<int> get_erasures(const std::set<int> &need,
87 const std::set<int> &available) const;
7c673cae 88
31f18b77
FG
89 int minimum_to_decode(const std::set<int> &want_to_read,
90 const std::set<int> &available,
91 std::set<int> *minimum) override;
7c673cae 92
31f18b77 93 int create_ruleset(const std::string &name,
7c673cae 94 CrushWrapper &crush,
31f18b77 95 std::ostream *ss) const override;
7c673cae
FG
96
97 unsigned int get_chunk_count() const override {
98 return chunk_count;
99 }
100
101 unsigned int get_data_chunk_count() const override {
102 return data_chunk_count;
103 }
104
105 unsigned int get_chunk_size(unsigned int object_size) const override;
106
31f18b77
FG
107 int encode_chunks(const std::set<int> &want_to_encode,
108 std::map<int, bufferlist> *encoded) override;
7c673cae 109
31f18b77
FG
110 int decode_chunks(const std::set<int> &want_to_read,
111 const std::map<int, bufferlist> &chunks,
112 std::map<int, bufferlist> *decoded) override;
7c673cae 113
31f18b77 114 int init(ErasureCodeProfile &profile, std::ostream *ss) override;
7c673cae 115
31f18b77 116 virtual int parse(ErasureCodeProfile &profile, std::ostream *ss);
7c673cae 117
31f18b77 118 int parse_kml(ErasureCodeProfile &profile, std::ostream *ss);
7c673cae 119
31f18b77 120 int parse_ruleset(ErasureCodeProfile &profile, std::ostream *ss);
7c673cae 121
31f18b77 122 int parse_ruleset_step(std::string description_string,
7c673cae 123 json_spirit::mArray description,
31f18b77 124 std::ostream *ss);
7c673cae
FG
125
126 int layers_description(const ErasureCodeProfile &profile,
127 json_spirit::mArray *description,
31f18b77
FG
128 std::ostream *ss) const;
129 int layers_parse(std::string description_string,
7c673cae 130 json_spirit::mArray description,
31f18b77
FG
131 std::ostream *ss);
132 int layers_init(std::ostream *ss);
133 int layers_sanity_checks(std::string description_string,
134 std::ostream *ss) const;
7c673cae
FG
135};
136
137#endif