MXS-1917 Replace HASHTABLE with std::set
This commit is contained in:
@ -34,7 +34,6 @@
|
|||||||
#include <maxscale/adminusers.h>
|
#include <maxscale/adminusers.h>
|
||||||
#include <maxscale/alloc.h>
|
#include <maxscale/alloc.h>
|
||||||
#include <maxscale/clock.h>
|
#include <maxscale/clock.h>
|
||||||
#include <maxscale/hashtable.h>
|
|
||||||
#include <maxscale/housekeeper.h>
|
#include <maxscale/housekeeper.h>
|
||||||
#include <maxscale/http.hh>
|
#include <maxscale/http.hh>
|
||||||
#include <maxscale/json_api.h>
|
#include <maxscale/json_api.h>
|
||||||
@ -182,7 +181,7 @@ extern const char CN_LOG_TO_SHM[] = "log_to_shm";
|
|||||||
|
|
||||||
typedef struct duplicate_context
|
typedef struct duplicate_context
|
||||||
{
|
{
|
||||||
HASHTABLE *hash;
|
std::set<std::string> *sections;
|
||||||
pcre2_code *re;
|
pcre2_code *re;
|
||||||
pcre2_match_data *mdata;
|
pcre2_match_data *mdata;
|
||||||
} DUPLICATE_CONTEXT;
|
} DUPLICATE_CONTEXT;
|
||||||
@ -210,7 +209,7 @@ static int config_get_release_string(char* release);
|
|||||||
bool config_has_duplicate_sections(const char* config, DUPLICATE_CONTEXT* context);
|
bool config_has_duplicate_sections(const char* config, DUPLICATE_CONTEXT* context);
|
||||||
int create_new_service(CONFIG_CONTEXT *obj);
|
int create_new_service(CONFIG_CONTEXT *obj);
|
||||||
int create_new_server(CONFIG_CONTEXT *obj);
|
int create_new_server(CONFIG_CONTEXT *obj);
|
||||||
int create_new_monitor(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj, HASHTABLE* monitorhash);
|
int create_new_monitor(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj, std::set<std::string>& monitored_servers);
|
||||||
int create_new_listener(CONFIG_CONTEXT *obj);
|
int create_new_listener(CONFIG_CONTEXT *obj);
|
||||||
int create_new_filter(CONFIG_CONTEXT *obj);
|
int create_new_filter(CONFIG_CONTEXT *obj);
|
||||||
int configure_new_service(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj);
|
int configure_new_service(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj);
|
||||||
@ -361,18 +360,16 @@ static bool duplicate_context_init(DUPLICATE_CONTEXT* context)
|
|||||||
bool rv = false;
|
bool rv = false;
|
||||||
|
|
||||||
const int table_size = 10;
|
const int table_size = 10;
|
||||||
HASHTABLE *hash = hashtable_alloc(table_size, hashtable_item_strhash, hashtable_item_strcmp);
|
std::set<std::string> *sections = new (std::nothrow) std::set<std::string>;
|
||||||
int errcode;
|
int errcode;
|
||||||
PCRE2_SIZE erroffset;
|
PCRE2_SIZE erroffset;
|
||||||
pcre2_code *re = pcre2_compile((PCRE2_SPTR) "^\\s*\\[(.+)\\]\\s*$", PCRE2_ZERO_TERMINATED,
|
pcre2_code *re = pcre2_compile((PCRE2_SPTR) "^\\s*\\[(.+)\\]\\s*$", PCRE2_ZERO_TERMINATED,
|
||||||
0, &errcode, &erroffset, NULL);
|
0, &errcode, &erroffset, NULL);
|
||||||
pcre2_match_data *mdata = NULL;
|
pcre2_match_data *mdata = NULL;
|
||||||
|
|
||||||
if (hash && re && (mdata = pcre2_match_data_create_from_pattern(re, NULL)))
|
if (sections && re && (mdata = pcre2_match_data_create_from_pattern(re, NULL)))
|
||||||
{
|
{
|
||||||
hashtable_memory_fns(hash, hashtable_item_strdup, NULL, hashtable_item_free, NULL);
|
context->sections = sections;
|
||||||
|
|
||||||
context->hash = hash;
|
|
||||||
context->re = re;
|
context->re = re;
|
||||||
context->mdata = mdata;
|
context->mdata = mdata;
|
||||||
rv = true;
|
rv = true;
|
||||||
@ -381,7 +378,7 @@ static bool duplicate_context_init(DUPLICATE_CONTEXT* context)
|
|||||||
{
|
{
|
||||||
pcre2_match_data_free(mdata);
|
pcre2_match_data_free(mdata);
|
||||||
pcre2_code_free(re);
|
pcre2_code_free(re);
|
||||||
hashtable_free(hash);
|
delete sections;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
@ -396,11 +393,11 @@ static void duplicate_context_finish(DUPLICATE_CONTEXT* context)
|
|||||||
{
|
{
|
||||||
pcre2_match_data_free(context->mdata);
|
pcre2_match_data_free(context->mdata);
|
||||||
pcre2_code_free(context->re);
|
pcre2_code_free(context->re);
|
||||||
hashtable_free(context->hash);
|
delete context->sections;
|
||||||
|
|
||||||
context->mdata = NULL;
|
context->mdata = NULL;
|
||||||
context->re = NULL;
|
context->re = NULL;
|
||||||
context->hash = NULL;
|
context->sections = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1043,14 +1040,7 @@ process_config_context(CONFIG_CONTEXT *context)
|
|||||||
{
|
{
|
||||||
CONFIG_CONTEXT *obj;
|
CONFIG_CONTEXT *obj;
|
||||||
int error_count = 0;
|
int error_count = 0;
|
||||||
HASHTABLE* monitorhash;
|
std::set<std::string> monitored_servers;
|
||||||
|
|
||||||
if ((monitorhash = hashtable_alloc(5, hashtable_item_strhash, hashtable_item_strcmp)) == NULL)
|
|
||||||
{
|
|
||||||
MXS_ERROR("Failed to allocate, monitor configuration check hashtable.");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
hashtable_memory_fns(monitorhash, hashtable_item_strdup, NULL, hashtable_item_free, NULL);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the data and create the services and servers defined
|
* Process the data and create the services and servers defined
|
||||||
@ -1106,7 +1096,7 @@ process_config_context(CONFIG_CONTEXT *context)
|
|||||||
}
|
}
|
||||||
else if (!strcmp(type, CN_MONITOR))
|
else if (!strcmp(type, CN_MONITOR))
|
||||||
{
|
{
|
||||||
error_count += create_new_monitor(context, obj, monitorhash);
|
error_count += create_new_monitor(context, obj, monitored_servers);
|
||||||
}
|
}
|
||||||
else if (strcmp(type, CN_SERVER) != 0 && strcmp(type, CN_FILTER) != 0)
|
else if (strcmp(type, CN_SERVER) != 0 && strcmp(type, CN_FILTER) != 0)
|
||||||
{
|
{
|
||||||
@ -1120,7 +1110,6 @@ process_config_context(CONFIG_CONTEXT *context)
|
|||||||
}
|
}
|
||||||
/** TODO: consistency check function */
|
/** TODO: consistency check function */
|
||||||
|
|
||||||
hashtable_free(monitorhash);
|
|
||||||
/**
|
/**
|
||||||
* error_count += consistency_checks();
|
* error_count += consistency_checks();
|
||||||
*/
|
*/
|
||||||
@ -2858,7 +2847,8 @@ bool config_has_duplicate_sections(const char* filename, DUPLICATE_CONTEXT* cont
|
|||||||
PCRE2_UCHAR section[len];
|
PCRE2_UCHAR section[len];
|
||||||
pcre2_substring_copy_bynumber(context->mdata, 1, section, &len);
|
pcre2_substring_copy_bynumber(context->mdata, 1, section, &len);
|
||||||
|
|
||||||
if (hashtable_add(context->hash, section, (char*)"") == 0)
|
string key(reinterpret_cast<char*>(section), len);
|
||||||
|
if (context->sections->insert(key).second == false)
|
||||||
{
|
{
|
||||||
MXS_ERROR("Duplicate section found: %s", section);
|
MXS_ERROR("Duplicate section found: %s", section);
|
||||||
rval = true;
|
rval = true;
|
||||||
@ -3501,10 +3491,10 @@ int configure_new_service(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj)
|
|||||||
* Create a new monitor
|
* Create a new monitor
|
||||||
* @param context The complete configuration context
|
* @param context The complete configuration context
|
||||||
* @param obj Monitor configuration context
|
* @param obj Monitor configuration context
|
||||||
* @param monitorhash Hashtable containing the servers that are already monitored
|
* @param monitored_servers Set containing the servers that are already monitored
|
||||||
* @return Number of errors
|
* @return Number of errors
|
||||||
*/
|
*/
|
||||||
int create_new_monitor(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj, HASHTABLE* monitorhash)
|
int create_new_monitor(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj, std::set<std::string>& monitored_servers)
|
||||||
{
|
{
|
||||||
int error_count = 0;
|
int error_count = 0;
|
||||||
|
|
||||||
@ -3701,7 +3691,7 @@ int create_new_monitor(CONFIG_CONTEXT *context, CONFIG_CONTEXT *obj, HASHTABLE*
|
|||||||
if (strcmp(trim(s), obj1->object) == 0 && obj->element && obj1->element)
|
if (strcmp(trim(s), obj1->object) == 0 && obj->element && obj1->element)
|
||||||
{
|
{
|
||||||
found = 1;
|
found = 1;
|
||||||
if (hashtable_add(monitorhash, obj1->object, (char*)"") == 0)
|
if (monitored_servers.insert(obj1->object).second == false)
|
||||||
{
|
{
|
||||||
MXS_WARNING("Multiple monitors are monitoring server [%s]. "
|
MXS_WARNING("Multiple monitors are monitoring server [%s]. "
|
||||||
"This will cause undefined behavior.",
|
"This will cause undefined behavior.",
|
||||||
|
Reference in New Issue
Block a user