]>
Commit | Line | Data |
---|---|---|
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 | |
13 | class 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 | ||
78 | public: | |
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 |