MXS-1992 Allow changing the QC cache size

This commit is contained in:
Johan Wikman 2018-08-06 15:16:10 +03:00
parent dae6cf0648
commit 185758ef06
5 changed files with 97 additions and 19 deletions

View File

@ -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/"
/**

View File

@ -15,14 +15,14 @@
#include "internal/config_runtime.h"
#include <strings.h>
#include <string>
#include <sstream>
#include <set>
#include <iterator>
#include <algorithm>
#include <tuple>
#include <functional>
#include <iterator>
#include <set>
#include <sstream>
#include <string>
#include <strings.h>
#include <tuple>
#include <vector>
#include <maxscale/atomic.h>
@ -31,14 +31,15 @@
#include <maxscale/json_api.h>
#include <maxscale/paths.h>
#include <maxscale/platform.h>
#include <maxscale/router.h>
#include <maxscale/spinlock.hh>
#include <maxscale/users.h>
#include <maxscale/router.h>
#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<std::string> StringSet;
typedef std::vector<std::string> 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;
}

View File

@ -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);

View File

@ -14,6 +14,7 @@
#include <maxscale/cppdefs.hh>
#include <maxscale/query_classifier.h>
#include <maxscale/jansson.hh>
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<json_t> qc_as_json(const char* zHost);
MXS_END_DECLS

View File

@ -13,29 +13,30 @@
#include "internal/resource.hh"
#include <list>
#include <sstream>
#include <map>
#include <sstream>
#include <maxscale/adminusers.h>
#include <maxscale/alloc.h>
#include <maxscale/jansson.hh>
#include <maxscale/spinlock.hh>
#include <maxscale/json_api.h>
#include <maxscale/housekeeper.h>
#include <maxscale/http.hh>
#include <maxscale/adminusers.h>
#include <maxscale/jansson.hh>
#include <maxscale/json_api.h>
#include <maxscale/modulecmd.h>
#include <maxscale/semaphore.hh>
#include <maxscale/server.hh>
#include <maxscale/spinlock.hh>
#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,