MXS-1220: Only process updated server parameters

The alteration function is only called when the value of a parameter
changes. This removes some of the redundant logging that was caused by
calling the alteration function with the same values.
This commit is contained in:
Markus Mäkelä
2017-04-21 10:11:12 +03:00
committed by Markus Mäkelä
parent 84d085ef39
commit bab7957952
2 changed files with 46 additions and 30 deletions

View File

@ -14,12 +14,13 @@
#include <maxscale/cppdefs.hh> #include <maxscale/cppdefs.hh>
#include <string>
#include <sstream> #include <sstream>
#include <string>
#include <maxscale/alloc.h>
#include <maxscale/debug.h>
#include <maxscale/jansson.h> #include <maxscale/jansson.h>
#include <maxscale/utils.hh> #include <maxscale/utils.hh>
#include <maxscale/alloc.h>
namespace maxscale namespace maxscale
{ {
@ -83,29 +84,35 @@ static inline std::string json_to_string(json_t* json)
{ {
std::stringstream ss; std::stringstream ss;
if (json_is_string(json)) switch (json_typeof(json))
{ {
case JSON_STRING:
ss << json_string_value(json); ss << json_string_value(json);
} break;
else if (json_is_boolean(json))
{ case JSON_INTEGER:
ss << (json_boolean_value(json) ? "true" : "false");
}
else if (json_is_real(json))
{
ss << json_real_value(json);
}
else if (json_is_number(json))
{
ss << json_number_value(json);
}
else if (json_is_integer(json))
{
ss << json_integer_value(json); ss << json_integer_value(json);
} break;
else if (json_is_null(json))
{ case JSON_REAL:
ss << ""; ss << json_real_value(json);
break;
case JSON_TRUE:
ss << "true";
break;
case JSON_FALSE:
ss << "false";
break;
case JSON_NULL:
break;
default:
ss_dassert(false);
break;
} }
return ss.str(); return ss.str();

View File

@ -831,15 +831,13 @@ SERVER* runtime_create_server_from_json(json_t* json)
return rval; return rval;
} }
bool handle_alter_server_relations(SERVER* server, json_t* new_json) bool handle_alter_server_relations(SERVER* server, json_t* old_json, json_t* new_json)
{ {
bool rval = false; bool rval = false;
set<string> old_relations; set<string> old_relations;
set<string> new_relations; set<string> new_relations;
Closer<json_t*> old_json(server_to_json(server, ""));
ss_dassert(old_json.get());
if (extract_relations(old_json.get(), old_relations, server_relation_types, server_relation_is_valid) && if (extract_relations(old_json, old_relations, server_relation_types, server_relation_is_valid) &&
extract_relations(new_json, new_relations, server_relation_types, server_relation_is_valid)) extract_relations(new_json, new_relations, server_relation_types, server_relation_is_valid))
{ {
set<string> removed_relations; set<string> removed_relations;
@ -866,20 +864,31 @@ bool handle_alter_server_relations(SERVER* server, json_t* new_json)
bool runtime_alter_server_from_json(SERVER* server, json_t* new_json) bool runtime_alter_server_from_json(SERVER* server, json_t* new_json)
{ {
bool rval = false; bool rval = false;
Closer<json_t*> old_json(server_to_json(server, ""));
ss_dassert(old_json.get());
if (handle_alter_server_relations(server, new_json)) if (handle_alter_server_relations(server, old_json.get(), new_json))
{ {
json_t* parameters = json_object_get(new_json, CN_PARAMETERS); json_t* parameters = json_object_get(new_json, CN_PARAMETERS);
json_t* old_parameters = json_object_get(old_json.get(), CN_PARAMETERS);;
ss_dassert(old_parameters);
if (parameters) if (parameters)
{ {
rval = true; rval = true;
const char *key; const char* key;
json_t *value; json_t* value;
json_object_foreach(parameters, key, value) json_object_foreach(parameters, key, value)
{ {
if (!runtime_alter_server(server, key, mxs::json_to_string(value).c_str())) json_t* new_val = json_object_get(parameters, key);
json_t* old_val = json_object_get(old_parameters, key);
if (old_val && new_val && mxs::json_to_string(new_val) == mxs::json_to_string(old_val))
{
/** No change in values */
}
else if (!runtime_alter_server(server, key, mxs::json_to_string(value).c_str()))
{ {
rval = false; rval = false;
} }