MXS-1929: Take local filter lists into use
The session creation function now uses the local filter list of the worker. This also removes the need for the has_filters function.
This commit is contained in:
@ -83,16 +83,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
const FilterList& get_filters() const;
|
const FilterList& get_filters() const;
|
||||||
|
|
||||||
inline bool has_filters() const
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Note: Temporarily used to check whether filters are available. This is
|
|
||||||
* not thread-safe but can be replaced with a check to worker local data to
|
|
||||||
* make it so.
|
|
||||||
*/
|
|
||||||
return !m_filters.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reload users for all listeners
|
* Reload users for all listeners
|
||||||
*
|
*
|
||||||
|
|||||||
@ -653,17 +653,14 @@ static int
|
|||||||
session_setup_filters(MXS_SESSION *session)
|
session_setup_filters(MXS_SESSION *session)
|
||||||
{
|
{
|
||||||
Service* service = static_cast<Service*>(session->service);
|
Service* service = static_cast<Service*>(session->service);
|
||||||
MXS_DOWNSTREAM *head;
|
|
||||||
MXS_UPSTREAM *tail;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
if (!service->has_filters())
|
auto filters = service->get_filters();
|
||||||
|
|
||||||
|
if (filters.empty())
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto filters = service->get_filters();
|
|
||||||
|
|
||||||
if ((session->filters = (SESSION_FILTER*)MXS_CALLOC(filters.size(), sizeof(SESSION_FILTER))) == NULL)
|
if ((session->filters = (SESSION_FILTER*)MXS_CALLOC(filters.size(), sizeof(SESSION_FILTER))) == NULL)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -671,38 +668,38 @@ session_setup_filters(MXS_SESSION *session)
|
|||||||
|
|
||||||
session->n_filters = filters.size();
|
session->n_filters = filters.size();
|
||||||
|
|
||||||
for (auto r = filters.rbegin(); r != filters.rend(); r++)
|
for (ssize_t i = (ssize_t)filters.size() - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
if ((head = filter_apply(*r, session, &session->head)) == NULL)
|
MXS_DOWNSTREAM* head = filter_apply(filters[i], session, &session->head);
|
||||||
|
|
||||||
|
if (head == NULL)
|
||||||
{
|
{
|
||||||
MXS_ERROR("Failed to create filter '%s' for service '%s'.\n",
|
MXS_ERROR("Failed to create filter '%s' for service '%s'.\n",
|
||||||
filter_def_get_name(r->get()), service->name);
|
filter_def_get_name(filters[i].get()), service->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
session->filters[i].filter = r->get();
|
|
||||||
|
session->filters[i].filter = filters[i].get();
|
||||||
session->filters[i].session = head->session;
|
session->filters[i].session = head->session;
|
||||||
session->filters[i].instance = head->instance;
|
session->filters[i].instance = head->instance;
|
||||||
i++;
|
|
||||||
session->head = *head;
|
session->head = *head;
|
||||||
MXS_FREE(head);
|
MXS_FREE(head);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto r = filters.begin(); r != filters.end(); r++)
|
for (size_t i = 0; i < filters.size(); i++)
|
||||||
{
|
{
|
||||||
if ((tail = filter_upstream(*r, session->filters[i].session, &session->tail)) == NULL)
|
MXS_UPSTREAM* tail = filter_upstream(filters[i], session->filters[i].session, &session->tail);
|
||||||
|
|
||||||
|
if (tail == NULL)
|
||||||
{
|
{
|
||||||
MXS_ERROR("Failed to create filter '%s' for service '%s'.",
|
MXS_ERROR("Failed to create filter '%s' for service '%s'.",
|
||||||
filter_def_get_name(r->get()),
|
filter_def_get_name(filters[i].get()), service->name);
|
||||||
service->name);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
i--;
|
/**
|
||||||
|
* filter_upstream may simply return the 3 parameter if the filter has no
|
||||||
/*
|
* upstream entry point. So no need to copy the contents or free tail in this case.
|
||||||
* filter_upstream may simply return the 3 parameter if
|
|
||||||
* the filter has no upstream entry point. So no need
|
|
||||||
* to copy the contents or free tail in this case.
|
|
||||||
*/
|
*/
|
||||||
if (tail != &session->tail)
|
if (tail != &session->tail)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user