MXS-2346 Exclude core parameters

Core parameters are not handled by the module but by the core and
must hence be ignored when validating and configuring.
This commit is contained in:
Johan Wikman
2019-04-12 08:53:39 +03:00
parent c381aefefc
commit 0c7a3240bd
4 changed files with 84 additions and 22 deletions

View File

@ -39,6 +39,11 @@ class Type;
class Specification
{
public:
enum Kind
{
FILTER
};
using ParamsByName = std::map<std::string, Param*>;
using const_iterator = ParamsByName::const_iterator;
using value_type = ParamsByName::value_type;
@ -48,9 +53,14 @@ public:
*
* @param zModule The the name of the module, e.g. "cachefilter".
*/
Specification(const char* zModule);
Specification(const char* zModule, Kind kind);
~Specification();
/**
* @return What kind of specification.
*/
Kind kind() const;
/**
* @return The module name of this specification.
*/
@ -133,6 +143,7 @@ private:
private:
std::string m_module;
Kind m_kind;
ParamsByName m_params;
};

View File

@ -16,14 +16,60 @@
using namespace std;
namespace
{
using namespace config;
// TODO: Do not duplicate information from config.cc.
const char* pzCore_filter_params[] = {
CN_TYPE,
CN_MODULE,
nullptr,
};
bool is_core_param(Specification::Kind kind, const std::string& param)
{
bool rv = false;
const char** pzCore_params = nullptr;
switch (kind)
{
case Specification::FILTER:
pzCore_params = pzCore_filter_params;
break;
default:
mxb_assert(!true);
}
if (pzCore_params)
{
while (!rv && *pzCore_params)
{
const char* zCore_param = *pzCore_params;
rv = (param == zCore_param);
++pzCore_params;
}
}
return rv;
}
}
namespace config
{
/**
* class Specification
*/
Specification::Specification(const char* zModule)
Specification::Specification(const char* zModule, Kind kind)
: m_module(zModule)
, m_kind(kind)
{
}
@ -68,16 +114,17 @@ bool Specification::validate(const MXS_CONFIG_PARAMETER& params) const
if (pParam)
{
bool param_valid = true;
string message;
if (!pParam->validate(value.c_str(), &message))
{
valid = false;
param_valid = false;
}
if (!message.empty())
{
if (valid)
if (param_valid)
{
MXS_WARNING("%s: %s", name.c_str(), message.c_str());
}
@ -89,7 +136,7 @@ bool Specification::validate(const MXS_CONFIG_PARAMETER& params) const
provided.insert(name);
}
else
else if (!is_core_param(m_kind, name))
{
MXS_WARNING("%s: The parameter '%s' is unrecognized.", m_module.c_str(), name.c_str());
valid = false;
@ -121,6 +168,9 @@ bool Specification::configure(Configuration& configuration, const MXS_CONFIG_PAR
for (const auto& param : params)
{
const auto& name = param.first;
if (!is_core_param(m_kind, name))
{
const auto& value = param.second;
const Param* pParam = find_param(name.c_str());
@ -143,6 +193,7 @@ bool Specification::configure(Configuration& configuration, const MXS_CONFIG_PAR
configured = false;
}
}
}
if (configured)
{

View File

@ -34,7 +34,7 @@ inline ostream& operator << (ostream& out, const std::chrono::milliseconds& x)
return out;
}
config::Specification specification("test_module");
config::Specification specification("test_module", config::Specification::FILTER);
config::ParamBool
param_bool(&specification,

View File

@ -17,7 +17,7 @@
#define CACHE_ZDEFAULT_STORAGE "\"storage_inmemory\""
config::Specification CacheConfig::s_specification(MXS_MODULE_NAME);
config::Specification CacheConfig::s_specification(MXS_MODULE_NAME, config::Specification::FILTER);
config::ParamString CacheConfig::s_storage(
&s_specification,