Skip to content
This repository was archived by the owner on Feb 20, 2023. It is now read-only.

Commit 0c17df0

Browse files
authored
Add validation check for self-driving knob actions and add dynamic setting to wal_serialization_interval (#1438)
1 parent b7c3234 commit 0c17df0

File tree

15 files changed

+169
-20
lines changed

15 files changed

+169
-20
lines changed

src/include/self_driving/pilot/action/abstract_action.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,15 @@ class AbstractAction {
6868
*/
6969
virtual const std::string &GetSQLCommand() { return sql_command_; }
7070

71+
/**
72+
* Check whether the action is valid to apply.
73+
* Possible scenarios that the action is invalid to apply: the knob setting is out of the valid range, the index
74+
* requires more memory than available in the system, etc.
75+
* TODO(lin): add the available memory as input param
76+
* @return true if the action is valid to apply, false otherwise
77+
*/
78+
virtual bool IsValid() { return true; }
79+
7180
protected:
7281
std::string sql_command_; ///< The SQL commaned used to apply the action
7382

src/include/self_driving/pilot/action/change_knob_action.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,18 @@ class ChangeKnobAction : public AbstractAction {
2626
* @param settings_manager SettingsManager (used to find our the current knob value before applying the change_value)
2727
*/
2828
ChangeKnobAction(settings::Param param, std::string param_name, T change_value,
29-
common::ManagedPointer<settings::SettingsManager> settings_manager)
30-
: AbstractAction(ActionType::CHANGE_KNOB),
31-
param_(param),
32-
param_name_(std::move(param_name)),
33-
change_value_(change_value),
34-
settings_manager_(settings_manager) {}
29+
common::ManagedPointer<settings::SettingsManager> settings_manager);
3530

3631
const std::string &GetSQLCommand() override;
3732

33+
bool IsValid() override;
34+
3835
private:
3936
settings::Param param_;
4037
std::string param_name_;
4138
T change_value_;
39+
T param_min_value_;
40+
T param_max_value_;
4241
common::ManagedPointer<settings::SettingsManager> settings_manager_;
4342
};
4443

src/include/self_driving/pilot/action/change_knob_value_config.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ class ChangeKnobValueConfig {
2222
return common::ManagedPointer(&bool_change_value_map);
2323
}
2424

25+
/** @return Map from a int knob param to the vector of its candidate change values */
26+
static common::ManagedPointer<std::map<settings::Param, std::vector<std::pair<int32_t, int32_t>>>>
27+
GetIntChangeValueMap() {
28+
return common::ManagedPointer(&int_change_value_map);
29+
}
30+
2531
/** @return Map from a int64 knob param to the vector of its candidate change values */
2632
static common::ManagedPointer<std::map<settings::Param, std::vector<std::pair<int64_t, int64_t>>>>
2733
GetInt64ChangeValueMap() {
@@ -30,6 +36,7 @@ class ChangeKnobValueConfig {
3036

3137
private:
3238
static std::map<settings::Param, std::vector<std::pair<bool, bool>>> bool_change_value_map;
39+
static std::map<settings::Param, std::vector<std::pair<int32_t, int32_t>>> int_change_value_map;
3340
static std::map<settings::Param, std::vector<std::pair<int64_t, int64_t>>> int64_change_value_map;
3441
};
3542

src/include/settings/settings_callbacks.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ class Callbacks {
7878
static void WalNumBuffers(void *old_value, void *new_value, DBMain *db_main,
7979
common::ManagedPointer<common::ActionContext> action_context);
8080

81+
/**
82+
* Changes the number of buffers the log manager uses.
83+
* @param old_value old settings value
84+
* @param new_value new settings value
85+
* @param db_main pointer to db_main
86+
* @param action_context pointer to the action context for this settings change
87+
*/
88+
static void WalSerializationInterval(void *old_value, void *new_value, DBMain *db_main,
89+
common::ManagedPointer<common::ActionContext> action_context);
90+
8191
/**
8292
* Enable or disable metrics collection for Logging component
8393
* @param old_value old settings value

src/include/settings/settings_defs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ SETTING_int(
125125
100,
126126
1,
127127
10000,
128-
false,
129-
noisepage::settings::Callbacks::NoOp
128+
true,
129+
noisepage::settings::Callbacks::WalSerializationInterval
130130
)
131131

132132
// Log file persisting interval

src/include/settings/settings_param.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class DBMain;
1313

1414
namespace noisepage::selfdriving::pilot {
1515
class ChangeKnobActionGenerator;
16+
template <class T>
17+
class ChangeKnobAction;
1618
namespace test {
1719
class GenerateChangeKnobAction_GenerateAction_Test;
1820
}
@@ -75,6 +77,9 @@ class ParamInfo {
7577
friend class noisepage::DBMain;
7678
friend class SettingsManager;
7779
friend class selfdriving::pilot::ChangeKnobActionGenerator;
80+
friend class selfdriving::pilot::ChangeKnobAction<bool>;
81+
friend class selfdriving::pilot::ChangeKnobAction<int32_t>;
82+
friend class selfdriving::pilot::ChangeKnobAction<int64_t>;
7883
friend class selfdriving::pilot::test::GenerateChangeKnobAction_GenerateAction_Test;
7984
std::string name_;
8085
parser::ConstantValueExpression value_;

src/include/storage/write_ahead_log/log_manager.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,15 @@ class LogManager : public common::DedicatedThreadOwner {
126126
return false;
127127
}
128128

129+
/**
130+
* Set the new log serialization interval in microseconds.
131+
* @param interval the new serialization interval in microseconds (should > 0)
132+
*/
133+
void SetSerializationInterval(int32_t interval);
134+
135+
/** @return the log serialization interval */
136+
int32_t GetSerializationInterval() { return serialization_interval_.count(); }
137+
129138
private:
130139
// Flag to tell us when the log manager is running or during termination
131140
bool run_log_manager_;
@@ -151,7 +160,7 @@ class LogManager : public common::DedicatedThreadOwner {
151160
// Log serializer task that processes buffers handed over by transactions and serializes them into consumer buffers
152161
common::ManagedPointer<LogSerializerTask> log_serializer_task_ = common::ManagedPointer<LogSerializerTask>(nullptr);
153162
// Interval used by log serialization task
154-
const std::chrono::microseconds serialization_interval_;
163+
std::chrono::microseconds serialization_interval_;
155164

156165
// The log consumer task which flushes filled buffers to the disk
157166
common::ManagedPointer<DiskLogConsumerTask> disk_log_writer_task_ =

src/include/storage/write_ahead_log/log_serializer_task.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,18 @@ class LogSerializerTask : public common::DedicatedThreadTask {
7474
}
7575
}
7676

77+
/**
78+
* Set the new log serialization interval in microseconds.
79+
* @param interval the new serialization interval in microseconds (should > 0)
80+
*/
81+
void SetSerializationInterval(int32_t interval) { serialization_interval_ = std::chrono::microseconds(interval); }
82+
7783
private:
7884
friend class LogManager;
7985
// Flag to signal task to run or stop
8086
bool run_task_;
8187
// Interval for serialization
82-
const std::chrono::microseconds serialization_interval_;
88+
std::chrono::microseconds serialization_interval_;
8389

8490
// Used to release processed buffers
8591
RecordBufferSegmentPool *buffer_pool_;

src/self_driving/pilot/action/change_knob_action.cpp

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,22 @@
55

66
namespace noisepage::selfdriving::pilot {
77

8+
template <class T>
9+
ChangeKnobAction<T>::ChangeKnobAction(settings::Param param, std::string param_name, T change_value,
10+
common::ManagedPointer<settings::SettingsManager> settings_manager)
11+
: AbstractAction(ActionType::CHANGE_KNOB),
12+
param_(param),
13+
param_name_(std::move(param_name)),
14+
change_value_(change_value),
15+
settings_manager_(settings_manager) {
16+
auto param_info = settings_manager_->GetParamInfo(param_);
17+
param_min_value_ = param_info.min_value_;
18+
param_max_value_ = param_info.max_value_;
19+
}
20+
821
template <class T>
922
const std::string &ChangeKnobAction<T>::GetSQLCommand() {
10-
sql_command_ = "set " + param_name_ + " ";
23+
sql_command_ = "set " + param_name_ + " = ";
1124
// Set the new value accordingly based on the param type
1225
if constexpr (std::is_same<T, bool>::value) { // NOLINT
1326
T original_value = settings_manager_->GetBool(param_);
@@ -22,12 +35,30 @@ const std::string &ChangeKnobAction<T>::GetSQLCommand() {
2235
T new_value = original_value + change_value_;
2336
sql_command_ += std::to_string(new_value) + ";";
2437
} else {
25-
throw PILOT_EXCEPTION(fmt::format("Unexpected knob parameter type\"{}\"", param_name_),
38+
throw PILOT_EXCEPTION(fmt::format("Unexpected knob parameter type \"{}\"", param_name_),
2639
common::ErrorCode::ERRCODE_INTERNAL_ERROR);
2740
}
2841
return sql_command_;
2942
}
3043

44+
template <class T>
45+
bool ChangeKnobAction<T>::IsValid() {
46+
if constexpr (std::is_same<T, bool>::value) { // NOLINT
47+
return true;
48+
} else if constexpr (std::is_same<T, int32_t>::value) { // NOLINT
49+
T original_value = settings_manager_->GetInt(param_);
50+
T new_value = original_value + change_value_;
51+
return new_value <= param_max_value_ && new_value >= param_min_value_;
52+
} else if constexpr (std::is_same<T, int64_t>::value) { // NOLINT
53+
T original_value = settings_manager_->GetInt64(param_);
54+
T new_value = original_value + change_value_;
55+
return new_value <= param_max_value_ && new_value >= param_min_value_;
56+
} else {
57+
throw PILOT_EXCEPTION(fmt::format("Unexpected knob parameter type \"{}\"", param_name_),
58+
common::ErrorCode::ERRCODE_INTERNAL_ERROR);
59+
}
60+
}
61+
3162
template class ChangeKnobAction<bool>;
3263
template class ChangeKnobAction<int32_t>;
3364
template class ChangeKnobAction<int64_t>;

src/self_driving/pilot/action/change_knob_value_config.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ std::map<settings::Param, std::vector<std::pair<bool, bool>>> ChangeKnobValueCon
77
{settings::Param::compiled_query_execution, {{true, true}}},
88
};
99

10-
std::map<settings::Param, std::vector<std::pair<int64_t, int64_t>>> ChangeKnobValueConfig::int64_change_value_map = {
11-
{settings::Param::wal_persist_threshold, {{1 << 10, -(1 << 10)}, {1 << 12, -(1 << 12)}}},
10+
std::map<settings::Param, std::vector<std::pair<int32_t, int32_t>>> ChangeKnobValueConfig::int_change_value_map = {
11+
{settings::Param::wal_serialization_interval, {{10, -10}, {100, -100}}},
1212
};
1313

14+
std::map<settings::Param, std::vector<std::pair<int64_t, int64_t>>> ChangeKnobValueConfig::int64_change_value_map = {};
15+
1416
} // namespace noisepage::selfdriving::pilot

0 commit comments

Comments
 (0)