Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit 1809446

Browse files
committed
Support for min, max bound checking for configuration params
1 parent 73f604e commit 1809446

File tree

7 files changed

+62
-16
lines changed

7 files changed

+62
-16
lines changed

src/include/common/exception.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ class Exception : public std::runtime_error {
7676
"\nMessage :: " + message;
7777
}
7878

79+
std::string GetMessage() {
80+
return exception_message_;
81+
}
82+
7983
std::string ExceptionTypeToString(ExceptionType type) {
8084
switch (type) {
8185
case ExceptionType::INVALID:

src/include/settings/settings.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
SETTING_int(port,
2222
"Peloton port (default: 15721)",
2323
15721,
24+
0, 32000,
2425
false, false)
2526

2627
// Maximum number of connections
2728
SETTING_int(max_connections,
2829
"Maximum number of connections (default: 64)",
2930
64,
31+
0, 512,
3032
true, true)
3133

3234
SETTING_int(rpc_port,
@@ -82,18 +84,22 @@ SETTING_string(root_cert_file,
8284
SETTING_double(bnlj_buffer_size,
8385
"The default buffer size to use for blockwise nested loop joins (default: 1 MB)",
8486
1.0 * 1024.0 * 1024.0,
87+
1.0 * 1024,
88+
1.0 * 1024.0 * 1024.0 * 1024,
8589
true, true)
8690

8791
// Size of the MonoQueue task queue
8892
SETTING_int(monoqueue_task_queue_size,
8993
"MonoQueue Task Queue Size (default: 32)",
90-
32,
94+
32,
95+
8, 128,
9196
false, false)
9297

9398
// Size of the MonoQueue worker pool
9499
SETTING_int(monoqueue_worker_pool_size,
95100
"MonoQueue Worker Pool Size (default: 4)",
96-
4,
101+
4,
102+
1, 32,
97103
false, false)
98104

99105
// Number of connection threads used by peloton
@@ -105,6 +111,7 @@ SETTING_int(connection_thread_count,
105111
SETTING_int(gc_num_threads,
106112
"The number of Garbage collection threads to run",
107113
1,
114+
0, 128,
108115
true, true)
109116

110117
//===----------------------------------------------------------------------===//
@@ -133,6 +140,7 @@ SETTING_bool(display_settings,
133140
SETTING_int(stats_mode,
134141
"Enable statistics collection (default: 0)",
135142
static_cast<int>(peloton::StatsType::INVALID),
143+
0, 16,
136144
true, true)
137145

138146
//===----------------------------------------------------------------------===//
@@ -170,12 +178,14 @@ SETTING_string(peloton_address,
170178
SETTING_int(brain_task_queue_size,
171179
"Brain Task Queue Size (default: 32)",
172180
32,
181+
1, 128,
173182
false, false)
174183

175184
// Size of the brain worker pool
176185
SETTING_int(brain_worker_pool_size,
177186
"Brain Worker Pool Size (default: 1)",
178187
1,
188+
1, 16,
179189
false, false)
180190

181191
//===----------------------------------------------------------------------===//

src/include/settings/settings_macro.h

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@
3333
#ifdef SETTING_string
3434
#undef SETTING_string
3535
#endif
36-
#define SETTING_int(name, description, default_value, is_mutable, is_persistent) \
36+
#define SETTING_int(name, description, default_value, min_value, max_value, is_mutable, is_persistent) \
3737
DEFINE_int32(name, default_value, description);
3838

39-
#define SETTING_double(name, description, default_value, is_mutable, is_persistent) \
39+
#define SETTING_double(name, description, default_value, min_value, max_value, is_mutable, is_persistent) \
4040
DEFINE_double(name, default_value, description);
4141

4242
#define SETTING_bool(name, description, default_value, is_mutable, is_persistent) \
@@ -59,10 +59,10 @@
5959
#ifdef SETTING_string
6060
#undef SETTING_string
6161
#endif
62-
#define SETTING_int(name, description, default_value, is_mutable, is_persistent) \
62+
#define SETTING_int(name, description, default_value, min_value, max_value, is_mutable, is_persistent) \
6363
DECLARE_int32(name);
6464

65-
#define SETTING_double(name, description, default_value, is_mutable, is_persistent) \
65+
#define SETTING_double(name, description, default_value, min_value, max_value, is_mutable, is_persistent) \
6666
DECLARE_double(name);
6767

6868
#define SETTING_bool(name, description, default_value, is_mutable, is_persistent) \
@@ -85,32 +85,40 @@
8585
#ifdef SETTING_string
8686
#undef SETTING_string
8787
#endif
88-
#define SETTING_int(name, description, default_value, is_mutable, is_persistent) \
88+
#define SETTING_int(name, description, default_value, min_value, max_value, is_mutable, is_persistent) \
8989
DefineSetting( \
9090
peloton::settings::SettingId::name, \
9191
#name, type::ValueFactory::GetIntegerValue(FLAGS_##name), \
9292
description, type::ValueFactory::GetIntegerValue(default_value), \
93+
type::ValueFactory::GetIntegerValue(min_value), \
94+
type::ValueFactory::GetIntegerValue(max_value),\
9395
is_mutable, is_persistent);
9496

95-
#define SETTING_double(name, description, default_value, is_mutable, is_persistent) \
97+
#define SETTING_double(name, description, default_value, min_value, max_value, is_mutable, is_persistent) \
9698
DefineSetting( \
9799
peloton::settings::SettingId::name, \
98100
#name, type::ValueFactory::GetDecimalValue(FLAGS_##name), \
99101
description, type::ValueFactory::GetDecimalValue(default_value), \
100-
is_mutable, is_persistent);
102+
type::ValueFactory::GetDecimalValue(min_value), \
103+
type::ValueFactory::GetDecimalValue(max_value),\
104+
is_mutable, is_persistent);\
101105

102106
#define SETTING_bool(name, description, default_value, is_mutable, is_persistent) \
103107
DefineSetting( \
104108
peloton::settings::SettingId::name, \
105109
#name, type::ValueFactory::GetBooleanValue(FLAGS_##name), \
106110
description, type::ValueFactory::GetBooleanValue(default_value), \
111+
type::ValueFactory::GetBooleanValue(default_value), \
112+
type::ValueFactory::GetBooleanValue(default_value),\
107113
is_mutable, is_persistent);
108114

109115
#define SETTING_string(name, description, default_value, is_mutable, is_persistent) \
110116
DefineSetting( \
111117
peloton::settings::SettingId::name, \
112118
#name, type::ValueFactory::GetVarcharValue(FLAGS_##name), \
113119
description, type::ValueFactory::GetVarcharValue(default_value), \
120+
type::ValueFactory::GetVarcharValue(default_value), \
121+
type::ValueFactory::GetVarcharValue(default_value),\
114122
is_mutable, is_persistent);
115123
#endif
116124

@@ -127,10 +135,10 @@
127135
#ifdef SETTING_string
128136
#undef SETTING_string
129137
#endif
130-
#define SETTING_int(name, description, default_value, is_mutable, is_persistent) \
138+
#define SETTING_int(name, description, default_value, min_value, max_value, is_mutable, is_persistent) \
131139
name,
132140

133-
#define SETTING_double(name, description, default_value, is_mutable, is_persistent) \
141+
#define SETTING_double(name, description, default_value, min_value, max_value, is_mutable, is_persistent) \
134142
name,
135143

136144
#define SETTING_bool(name, description, default_value, is_mutable, is_persistent) \

src/include/settings/settings_manager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class SettingsManager : public Printable {
8282
const type::Value &value,
8383
const std::string &description,
8484
const type::Value &default_value,
85+
const type::Value &min_value,
86+
const type::Value &max_value,
8587
bool is_mutable, bool is_persistent);
8688

8789
type::Value GetValue(SettingId id);

src/include/type/value.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,10 @@ class Value : public Printable {
129129
inline CmpBool CompareGreaterThanEquals(const Value &o) const {
130130
return Type::GetInstance(type_id_)->CompareGreaterThanEquals(*this, o);
131131
}
132+
inline bool CompareBetweenInclusive(const Value &a, const Value &b) const {
133+
return Type::GetInstance(type_id_)->CompareGreaterThanEquals(*this, a) == CmpBool::TRUE &&
134+
Type::GetInstance(type_id_)->CompareLessThanEquals(*this, b) == CmpBool::TRUE;
135+
}
132136

133137
// Other mathematical functions
134138
inline Value Add(const Value &o) const {

src/main/peloton/peloton.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,16 @@ int main(int argc, char *argv[]) {
6565
::google::HandleCommandLineHelpFlags();
6666
}
6767

68-
// Print settings
69-
if (peloton::settings::SettingsManager::GetBool(
70-
peloton::settings::SettingId::display_settings)) {
71-
auto &settings = peloton::settings::SettingsManager::GetInstance();
72-
settings.ShowInfo();
68+
try {
69+
// Print settings
70+
if (peloton::settings::SettingsManager::GetBool(
71+
peloton::settings::SettingId::display_settings)) {
72+
auto &settings = peloton::settings::SettingsManager::GetInstance();
73+
settings.ShowInfo();
74+
}
75+
} catch (peloton::SettingsException &exception) {
76+
std::cerr << "Cannot load settings. Failed with " << exception.GetMessage() << std::endl;
77+
return 0; // TODO: Use an enum with exit error codes
7378
}
7479

7580
if (peloton::settings::SettingsManager::GetBool(

src/settings/settings_manager.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include <gflags/gflags.h>
1414

15+
#include "type/type_id.h"
1516
#include "catalog/settings_catalog.h"
1617
#include "common/exception.h"
1718
#include "concurrency/transaction_manager_factory.h"
@@ -127,10 +128,22 @@ void SettingsManager::DefineSetting(SettingId id, const std::string &name,
127128
const type::Value &value,
128129
const std::string &description,
129130
const type::Value &default_value,
131+
const type::Value &min_value,
132+
const type::Value &max_value,
130133
bool is_mutable, bool is_persistent) {
131134
if (settings_.find(id) != settings_.end()) {
132135
throw SettingsException("settings " + name + " already exists");
133136
}
137+
138+
// Only below types support min-max bound checking
139+
if (value.GetTypeId() == type::TypeId::INTEGER ||
140+
value.GetTypeId() == type::TypeId::SMALLINT ||
141+
value.GetTypeId() == type::TypeId::TINYINT ||
142+
value.GetTypeId() == type::TypeId::DECIMAL) {
143+
if (!value.CompareBetweenInclusive(min_value, max_value))
144+
throw SettingsException("Value given for \"" + name + "\" is not in its min-max bounds.");
145+
}
146+
134147
settings_.emplace(id, Param(name, value, description, default_value,
135148
is_mutable, is_persistent));
136149
}

0 commit comments

Comments
 (0)