]> git.proxmox.com Git - ceph.git/blame - ceph/src/rocksdb/options/configurable_helper.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / rocksdb / options / configurable_helper.h
CommitLineData
20effc67
TL
1// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2// This source code is licensed under both the GPLv2 (found in the
3// COPYING file in the root directory) and Apache 2.0 License
4// (found in the LICENSE.Apache file in the root directory).
5
6#pragma once
7
8#include <map>
9#include <stdexcept>
10#include <string>
11#include <vector>
12
13#include "rocksdb/configurable.h"
14#include "rocksdb/convenience.h"
15
16namespace ROCKSDB_NAMESPACE {
17// Helper class defining static methods for supporting the Configurable
18// class. The purpose of this class is to keep the Configurable class
19// as tight as possible and provide methods for doing the actual work
20// of configuring the objects.
21class ConfigurableHelper {
22 public:
20effc67
TL
23 // Configures the input Configurable object based on the parameters.
24 // On successful completion, the Configurable is updated with the settings
25 // from the opt_map.
26 //
27 // The acceptable values of the name/value pairs are documented with the
28 // specific class/instance.
29 //
30 // @param config_options Controls how the arguments are processed.
31 // @param opt_map Name/value pairs of the options to update
32 // @param unused If specified, this value will return the name/value
33 // pairs from opt_map that were NotFound for this object.
34 // @return OK If all values in the map were successfully updated
35 // @return NotFound If any of the names in the opt_map were not valid
36 // for this object. If unused is specified, it will contain the
37 // collection of NotFound entries
38 // @return NotSupported If any of the names are valid but the object does
39 // not know how to convert the value. This can happen if, for example,
40 // there is some nested Configurable that cannot be created.
41 // @return InvalidArgument If any of the values cannot be successfully
42 // parsed. This can also be returned if PrepareOptions encounters an
43 // error.
44 static Status ConfigureOptions(
45 const ConfigOptions& config_options, Configurable& configurable,
46 const std::unordered_map<std::string, std::string>& options,
47 std::unordered_map<std::string, std::string>* unused);
48
20effc67
TL
49#ifndef ROCKSDB_LITE
50 // Internal method to configure a set of options for this object.
51 // Classes may override this value to change its behavior.
52 // @param config_options Controls how the options are being configured
53 // @param type_name The name that was registered for this set of options
54 // @param type_map The map of options for this name
55 // @param opt_ptr Pointer to the object being configured for this option set.
56 // @param options The option name/values being updated. On return, any
57 // option that was found is removed from the list.
58 // @return OK If all of the options were successfully updated.
59 // @return InvalidArgument If an option was found but the value could not
60 // be updated.
61 // @return NotFound If an option name was not found in type_mape
62 // @return NotSupported If the option was found but no rule for converting
63 // the value could be found.
64 static Status ConfigureSomeOptions(
65 const ConfigOptions& config_options, Configurable& configurable,
66 const std::unordered_map<std::string, OptionTypeInfo>& type_map,
67 std::unordered_map<std::string, std::string>* options, void* opt_ptr);
68
69 // Configures a single option in the input Configurable.
70 // This method will look through the set of option names for this
71 // Configurable searching for one with the input name. If such an option
72 // is found, it will be configured via the input value.
73 //
74 // @param config_options Controls how the option is being configured
75 // @param configurable The object to configure
76 // @param name For options with sub-options (like Structs or
77 // Configurables),
78 // this value may be the name of the sub-field of the option being
79 // updated. For example, if the option is
80 // "compaction_options_fifo.allow_compaction", then field name would be
81 // "allow_compaction". For most options, field_name and opt_name will be
82 // equivalent.
83 // @param value The new value for this option.
84 // @param See ConfigureOptions for the possible return values
85 static Status ConfigureSingleOption(const ConfigOptions& config_options,
86 Configurable& configurable,
87 const std::string& name,
88 const std::string& value);
89
90 // Configures the option referenced by opt_info for this configurable
91 // This method configures the option based on opt_info for the input
92 // configurable.
93 // @param config_options Controls how the option is being configured
94 // @param configurable The object to configure
95 // @param opt_name The full option name
96 // @param name For options with sub-options (like Structs or
97 // Configurables),
98 // this value may be the name of the sub-field of the option being
99 // updated. For example, if the option is
100 // "compaction_options_fifo.allow_compaction", then field name would be
101 // "allow_compaction". For most options, field_name and opt_name will be
102 // equivalent.
103 // @param value The new value for this option.
104 // @param See ConfigureOptions for the possible return values
105 static Status ConfigureOption(const ConfigOptions& config_options,
106 Configurable& configurable,
107 const OptionTypeInfo& opt_info,
108 const std::string& opt_name,
109 const std::string& name,
110 const std::string& value, void* opt_ptr);
111
112 // Returns the value of the option associated with the input name
113 // This method is the functional inverse of ConfigureOption
114 // @param config_options Controls how the value is returned
115 // @param configurable The object from which to get the option.
116 // @param name The name of the option to return a value for.
117 // @param value The returned value associated with the named option.
118 // Note that value will be only the serialized version
119 // of the option and not "name=value"
120 // @return OK If the named field was successfully updated to value.
121 // @return NotFound If the name is not valid for this object.
122 // @param InvalidArgument If the name is valid for this object but
123 // its value cannot be serialized.
124 static Status GetOption(const ConfigOptions& config_options,
125 const Configurable& configurable,
126 const std::string& name, std::string* value);
127
128 // Serializes the input Configurable into the output result.
129 // This is the inverse of ConfigureOptions
130 // @param config_options Controls how serialization happens.
131 // @param configurable The object to serialize
132 // @param prefix A prefix to add to the each option as it is serialized.
133 // @param result The string representation of the configurable.
134 // @return OK If the options for this object wer successfully serialized.
135 // @return InvalidArgument If one or more of the options could not be
136 // serialized.
137 static Status SerializeOptions(const ConfigOptions& config_options,
138 const Configurable& configurable,
139 const std::string& prefix,
140 std::string* result);
141
142 // Internal method to list the option names for this object.
143 // Classes may override this value to change its behavior.
144 // @see ListOptions for more details
145 static Status ListOptions(const ConfigOptions& config_options,
146 const Configurable& configurable,
147 const std::string& prefix,
148 std::unordered_set<std::string>* result);
149
150 // Checks to see if the two configurables are equivalent to one other.
151 // This method assumes that the two objects are of the same class.
152 // @param config_options Controls how the options are compared.
153 // @param this_one The object to compare to.
154 // @param that_one The other object being compared.
155 // @param mismatch If the objects do not match, this parameter contains
156 // the name of the option that triggered the match failure.
157 // @param True if the objects match, false otherwise.
158 static bool AreEquivalent(const ConfigOptions& config_options,
159 const Configurable& this_one,
160 const Configurable& that_one,
161 std::string* mismatch);
162
163 private:
164 // Looks for the option specified by name in the RegisteredOptions.
165 // This method traverses the types in the input options vector. If an entry
166 // matching name is found, that entry, opt_name, and pointer are returned.
167 // @param options The vector of options to search through
168 // @param name The name of the option to search for in the OptionType map
169 // @param opt_name If the name was found, this value is set to the option name
170 // associated with the input name/type.
171 // @param opt_ptr If the name was found, this value is set to the option
172 // pointer
173 // in the RegisteredOptions vector associated with this entry
174 // @return A pointer to the OptionTypeInfo from the options if found,
175 // nullptr if the name was not found in the input options
176 static const OptionTypeInfo* FindOption(
177 const std::vector<Configurable::RegisteredOptions>& options,
178 const std::string& name, std::string* opt_name, void** opt_ptr);
179
1e59de90
TL
180 static Status ConfigureCustomizableOption(
181 const ConfigOptions& config_options, Configurable& configurable,
182 const OptionTypeInfo& opt_info, const std::string& opt_name,
183 const std::string& name, const std::string& value, void* opt_ptr);
20effc67
TL
184#endif // ROCKSDB_LITE
185};
186
187} // namespace ROCKSDB_NAMESPACE