From 185758ef0657e248070b30ec3ae04ebd0a5635ba Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Mon, 6 Aug 2018 15:16:10 +0300 Subject: [PATCH] MXS-1992 Allow changing the QC cache size --- include/maxscale/json_api.h | 1 + server/core/config_runtime.cc | 56 ++++++++++++++++++++---- server/core/internal/config_runtime.h | 9 ++++ server/core/internal/query_classifier.hh | 10 +++++ server/core/resource.cc | 40 ++++++++++++----- 5 files changed, 97 insertions(+), 19 deletions(-) diff --git a/include/maxscale/json_api.h b/include/maxscale/json_api.h index 8ba70d333..fa0e9c3a3 100644 --- a/include/maxscale/json_api.h +++ b/include/maxscale/json_api.h @@ -35,6 +35,7 @@ MXS_BEGIN_DECLS #define MXS_JSON_API_TASKS "/maxscale/tasks/" #define MXS_JSON_API_MODULES "/maxscale/modules/" #define MXS_JSON_API_QC_STATS "/maxscale/qc_stats/" +#define MXS_JSON_API_QC "/maxscale/query_classifier/" #define MXS_JSON_API_USERS "/users/" /** diff --git a/server/core/config_runtime.cc b/server/core/config_runtime.cc index 78cacc45e..3d7673ce4 100644 --- a/server/core/config_runtime.cc +++ b/server/core/config_runtime.cc @@ -15,14 +15,14 @@ #include "internal/config_runtime.h" -#include -#include -#include -#include -#include #include -#include #include +#include +#include +#include +#include +#include +#include #include #include @@ -31,14 +31,15 @@ #include #include #include +#include #include #include -#include #include "internal/config.hh" -#include "internal/monitor.h" -#include "internal/modules.h" #include "internal/filter.hh" +#include "internal/modules.h" +#include "internal/monitor.h" +#include "internal/query_classifier.hh" typedef std::set StringSet; typedef std::vector StringVector; @@ -2538,3 +2539,40 @@ bool runtime_alter_maxscale_from_json(json_t* new_json) return rval; } + +bool validate_qc_json(json_t* json) +{ + json_t* param = mxs_json_pointer(json, MXS_JSON_PTR_PARAMETERS); + bool rval = false; + + if (param && json_is_object(param)) + { + rval = is_count_or_null(param, "cache_size"); + } + + return rval; +} + +// TODO: Expose everything needed so that this function could be +// TODO: part of the query classifier API. +bool runtime_alter_qc_from_json(json_t* json) +{ + bool rval = false; + + if (validate_qc_json(json)) + { + rval = true; + + json_t* param = mxs_json_pointer(json, MXS_JSON_PTR_PARAMETERS); + json_t* value; + + if ((value = mxs_json_pointer(param, "cache_size"))) + { + QC_CACHE_PROPERTIES cache_properties = { json_integer_value(value) }; + + qc_set_cache_properties(&cache_properties); + } + } + + return rval; +} diff --git a/server/core/internal/config_runtime.h b/server/core/internal/config_runtime.h index 1314b909e..33c00146b 100644 --- a/server/core/internal/config_runtime.h +++ b/server/core/internal/config_runtime.h @@ -389,3 +389,12 @@ bool runtime_remove_user(const char* id, enum user_type type); * @return True if the core parameters are valid and were successfully applied */ bool runtime_alter_maxscale_from_json(json_t* new_json); + +/** + * @brief Alter core query classifier parameters from JSON. + * + * @param new_json JSON defining the new parameters. + * + * @return True if the core parameters are valid and were successfully applied + */ +bool runtime_alter_qc_from_json(json_t* new_json); diff --git a/server/core/internal/query_classifier.hh b/server/core/internal/query_classifier.hh index e641aa84b..f17d510db 100644 --- a/server/core/internal/query_classifier.hh +++ b/server/core/internal/query_classifier.hh @@ -14,6 +14,7 @@ #include #include +#include MXS_BEGIN_DECLS @@ -36,4 +37,13 @@ typedef enum qc_trx_parse_using */ uint32_t qc_get_trx_type_mask_using(GWBUF* stmt, qc_trx_parse_using_t use); +/** + * Generic query classifier information. + * + * @param zHost The MaxScale host. + * + * @return A json object containing information. + */ +std::unique_ptr qc_as_json(const char* zHost); + MXS_END_DECLS diff --git a/server/core/resource.cc b/server/core/resource.cc index ab2adb20c..6a2498e26 100644 --- a/server/core/resource.cc +++ b/server/core/resource.cc @@ -13,29 +13,30 @@ #include "internal/resource.hh" #include -#include #include +#include +#include #include -#include -#include -#include #include #include -#include +#include +#include #include #include #include +#include +#include "internal/config_runtime.h" +#include "internal/filter.hh" #include "internal/httprequest.hh" #include "internal/httpresponse.hh" -#include "internal/session.h" -#include "internal/filter.hh" -#include "internal/monitor.h" -#include "internal/service.hh" -#include "internal/config_runtime.h" #include "internal/modules.h" +#include "internal/monitor.h" +#include "internal/query_classifier.hh" #include "internal/routingworker.hh" +#include "internal/service.hh" +#include "internal/session.h" using std::list; using std::map; @@ -426,6 +427,18 @@ HttpResponse cb_alter_logs(const HttpRequest& request) return HttpResponse(MHD_HTTP_FORBIDDEN, runtime_get_json_error()); } +HttpResponse cb_alter_qc(const HttpRequest& request) +{ + ss_dassert(request.get_json()); + + if (runtime_alter_qc_from_json(request.get_json())) + { + return HttpResponse(MHD_HTTP_NO_CONTENT); + } + + return HttpResponse(MHD_HTTP_FORBIDDEN, runtime_get_json_error()); +} + HttpResponse cb_delete_server(const HttpRequest& request) { SERVER* server = server_find_by_unique_name(request.uri_part(1).c_str()); @@ -626,6 +639,11 @@ HttpResponse cb_all_threads(const HttpRequest& request) return HttpResponse(MHD_HTTP_OK, mxs_rworker_list_to_json(request.host())); } +HttpResponse cb_qc(const HttpRequest& request) +{ + return HttpResponse(MHD_HTTP_OK, qc_as_json(request.host()).release()); +} + HttpResponse cb_thread(const HttpRequest& request) { int id = atoi(request.last_uri_part().c_str()); @@ -889,6 +907,7 @@ public: m_get.push_back(SResource(new Resource(cb_get_session, 2, "sessions", ":session"))); m_get.push_back(SResource(new Resource(cb_maxscale, 1, "maxscale"))); + m_get.push_back(SResource(new Resource(cb_qc, 2, "maxscale", "query_classifier"))); m_get.push_back(SResource(new Resource(cb_all_threads, 2, "maxscale", "threads"))); m_get.push_back(SResource(new Resource(cb_thread, 3, "maxscale", "threads", ":thread"))); m_get.push_back(SResource(new Resource(cb_logs, 2, "maxscale", "logs"))); @@ -936,6 +955,7 @@ public: m_patch.push_back(SResource(new Resource(cb_alter_service, 2, "services", ":service"))); m_patch.push_back(SResource(new Resource(cb_alter_logs, 2, "maxscale", "logs"))); m_patch.push_back(SResource(new Resource(cb_alter_maxscale, 1, "maxscale"))); + m_patch.push_back(SResource(new Resource(cb_alter_qc, 2, "maxscale", "query_classifier"))); /** Update resource relationships directly */ m_patch.push_back(SResource(new Resource(cb_alter_server_service_relationship, 4,