]> git.proxmox.com Git - ceph.git/blame - ceph/src/crush/CrushCompiler.h
bump version to 19.2.0-pve1
[ceph.git] / ceph / src / crush / CrushCompiler.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#ifndef CEPH_CRUSH_COMPILER_H
5#define CEPH_CRUSH_COMPILER_H
6
7#include "crush/CrushWrapper.h"
8#include "crush/grammar.h"
9
10#include <map>
31f18b77 11#include <iostream>
7c673cae
FG
12
13class CrushCompiler {
14 CrushWrapper& crush;
9f95a23c 15 std::ostream& err;
7c673cae
FG
16 int verbose;
17 bool unsafe_tunables;
18
19 // decompile
20 enum dcb_state_t {
21 DCB_STATE_IN_PROGRESS = 0,
22 DCB_STATE_DONE
23 };
24
25 int decompile_weight_set_weights(crush_weight_set weight_set,
9f95a23c 26 std::ostream &out);
7c673cae
FG
27 int decompile_weight_set(crush_weight_set *weight_set,
28 __u32 size,
9f95a23c 29 std::ostream &out);
7c673cae
FG
30 int decompile_choose_arg(crush_choose_arg *arg,
31 int bucket_id,
9f95a23c 32 std::ostream &out);
7c673cae
FG
33 int decompile_ids(int *ids,
34 __u32 size,
9f95a23c 35 std::ostream &out);
7c673cae 36 int decompile_choose_arg_map(crush_choose_arg_map arg_map,
9f95a23c 37 std::ostream &out);
7c673cae 38 int decompile_choose_args(const std::pair<const long unsigned int, crush_choose_arg_map> &i,
9f95a23c
TL
39 std::ostream &out);
40 int decompile_bucket_impl(int i, std::ostream &out);
7c673cae
FG
41 int decompile_bucket(int cur,
42 std::map<int, dcb_state_t>& dcb_states,
9f95a23c 43 std::ostream &out);
7c673cae
FG
44
45 // compile
46 typedef char const* iterator_t;
9f95a23c 47 typedef boost::spirit::tree_match<iterator_t> parse_tree_match_t;
7c673cae
FG
48 typedef parse_tree_match_t::tree_iterator iter_t;
49 typedef parse_tree_match_t::node_t node_t;
50
9f95a23c
TL
51 std::map<std::string, int> item_id;
52 std::map<int, std::string> id_item;
53 std::map<int, unsigned> item_weight;
54 std::map<std::string, int> type_id;
55 std::map<std::string, int> rule_id;
56 std::map<int32_t, std::map<int32_t, int32_t> > class_bucket; // bucket id -> class id -> shadow bucket id
7c673cae 57
9f95a23c 58 std::string string_node(node_t &node);
7c673cae
FG
59 int int_node(node_t &node);
60 float float_node(node_t &node);
61
62 int parse_tunable(iter_t const& i);
63 int parse_device(iter_t const& i);
64 int parse_bucket_type(iter_t const& i);
65 int parse_bucket(iter_t const& i);
66 int parse_rule(iter_t const& i);
67 int parse_weight_set_weights(iter_t const& i, int bucket_id, crush_weight_set *weight_set);
68 int parse_weight_set(iter_t const& i, int bucket_id, crush_choose_arg *arg);
69 int parse_choose_arg_ids(iter_t const& i, int bucket_id, crush_choose_arg *args);
70 int parse_choose_arg(iter_t const& i, crush_choose_arg *args);
71 int parse_choose_args(iter_t const& i);
72 void find_used_bucket_ids(iter_t const& i);
73 int parse_crush(iter_t const& i);
74 void dump(iter_t const& i, int ind=1);
9f95a23c 75 std::string consolidate_whitespace(std::string in);
7c673cae
FG
76 int adjust_bucket_item_place(iter_t const &i);
77
78public:
9f95a23c 79 CrushCompiler(CrushWrapper& c, std::ostream& eo, int verbosity=0)
7c673cae
FG
80 : crush(c), err(eo), verbose(verbosity),
81 unsafe_tunables(false) {}
82 ~CrushCompiler() {}
83
84 void enable_unsafe_tunables() {
85 unsafe_tunables = true;
86 }
87
9f95a23c
TL
88 int decompile(std::ostream& out);
89 int compile(std::istream& in, const char *infn=0);
7c673cae
FG
90};
91
92#endif