MXS-1929: Add filter deletion entry points

Added the code required to delete a filter via the REST API. The actual
deleting of the filters is still to be implemented.
This commit is contained in:
Markus Mäkelä
2018-07-24 08:12:45 +03:00
parent 5de91e737d
commit e39242d6e5
7 changed files with 111 additions and 0 deletions

View File

@ -1078,6 +1078,26 @@ bool runtime_create_filter(const char *name, const char *module, MXS_CONFIG_PARA
return rval;
}
bool runtime_destroy_filter(MXS_FILTER_DEF* filter)
{
ss_dassert(filter);
bool rval = false;
mxs::SpinLockGuard guard(crt_lock);
if (filter_can_be_destroyed(filter))
{
filter_destroy(filter);
rval = true;
}
else
{
runtime_error("Filter '%s' cannot be destroyed: Remove it from all services "
"first", filter->name);
}
return rval;
}
static bool runtime_create_service(const char *name, const char *router, MXS_CONFIG_PARAMETER* params)
{
mxs::SpinLockGuard guard(crt_lock);

View File

@ -37,6 +37,7 @@
#include "internal/config.h"
#include "internal/modules.h"
#include "internal/service.h"
using std::string;
using std::set;
@ -152,6 +153,17 @@ filter_def_find(const char *name)
return filter;
}
bool filter_can_be_destroyed(MXS_FILTER_DEF *filter)
{
return !service_filter_in_use(filter);
}
void filter_destroy(MXS_FILTER_DEF *filter)
{
ss_dassert(filter_can_be_destroyed(filter));
ss_info_dassert(!true, "Not yet implemented");
}
const char* filter_def_get_name(const MXS_FILTER_DEF* filter_def)
{
return filter_def->name;

View File

@ -205,6 +205,17 @@ bool runtime_create_monitor(const char *name, const char *module);
*/
bool runtime_create_filter(const char *name, const char *module, MXS_CONFIG_PARAMETER* params);
/**
* Destroy a filter
*
* The filter can only be destroyed if no service uses it
*
* @param service Filter to destroy
*
* @return True if filter was destroyed
*/
bool runtime_destroy_filter(MXS_FILTER_DEF* filter);
/**
* @brief Destroy a monitor
*

View File

@ -46,4 +46,23 @@ MXS_UPSTREAM *filter_upstream(MXS_FILTER_DEF *filter_def,
MXS_FILTER_SESSION *fsession,
MXS_UPSTREAM *upstream);
/**
* Check if filter can be destroyed
*
* A filter can be destroyed if no service uses it.
*
* @param filter Filter to check
*
* @return True if filter can be destroyed
*/
bool filter_can_be_destroyed(MXS_FILTER_DEF *filter);
/**
* Destroy a filter
*
* @param filter Filter to destroy
*/
void filter_destroy(MXS_FILTER_DEF *filter);
MXS_END_DECLS

View File

@ -148,6 +148,15 @@ int service_isvalid(SERVICE *service);
*/
bool service_server_in_use(const SERVER *server);
/**
* Check if filter is used by any service
*
* @param filter Filter to inspect
*
* @return True if at least one service uses the filter
*/
bool service_filter_in_use(const MXS_FILTER_DEF *filter);
/** Update the server weights used by services */
void service_update_weights();

View File

@ -484,6 +484,18 @@ HttpResponse cb_delete_service(const HttpRequest& request)
return HttpResponse(MHD_HTTP_FORBIDDEN, runtime_get_json_error());
}
HttpResponse cb_delete_filter(const HttpRequest& request)
{
MXS_FILTER_DEF* filter = filter_def_find(request.uri_part(1).c_str());
ss_dassert(filter);
if (runtime_destroy_filter(filter))
{
return HttpResponse(MHD_HTTP_NO_CONTENT);
}
return HttpResponse(MHD_HTTP_FORBIDDEN, runtime_get_json_error());
}
HttpResponse cb_all_servers(const HttpRequest& request)
{
return HttpResponse(MHD_HTTP_OK, server_list_to_json(request.host()));
@ -957,6 +969,7 @@ public:
m_delete.push_back(SResource(new Resource(cb_delete_server, 2, "servers", ":server")));
m_delete.push_back(SResource(new Resource(cb_delete_monitor, 2, "monitors", ":monitor")));
m_delete.push_back(SResource(new Resource(cb_delete_service, 2, "services", ":service")));
m_delete.push_back(SResource(new Resource(cb_delete_filter, 2, "filters", ":filter")));
m_delete.push_back(SResource(new Resource(cb_delete_user, 3, "users", "inet", ":inetuser")));
m_delete.push_back(SResource(new Resource(cb_delete_user, 3, "users", "unix", ":unixuser")));

View File

@ -2196,6 +2196,33 @@ bool service_server_in_use(const SERVER *server)
return rval;
}
bool service_filter_in_use(const MXS_FILTER_DEF *filter)
{
ss_dassert(filter);
bool rval = false;
spinlock_acquire(&service_spin);
for (SERVICE *service = allServices; service && !rval; service = service->next)
{
spinlock_acquire(&service->spin);
for (int i = 0; i < service->n_filters; i++)
{
if (service->filters[i] == filter)
{
rval = true;
break;
}
}
spinlock_release(&service->spin);
}
spinlock_release(&service_spin);
return rval;
}
/**
* Creates a service configuration at the location pointed by @c filename
*