MXS-1725 Provide mech. for short-circuiting req. processing
Filter that terminate the response processing now have a mechanism using which a response can be provided in such a way that previous filters will see the response.
This commit is contained in:
@ -195,9 +195,25 @@ typedef struct session
|
||||
} stmt; /**< Current statement being executed */
|
||||
bool qualifies_for_pooling; /**< Whether this session qualifies for the connection pool */
|
||||
SessionVarsByName* variables; /*< @maxscale variables associated with this session */
|
||||
struct
|
||||
{
|
||||
MXS_UPSTREAM up; /*< Upward component to receive buffer. */
|
||||
GWBUF* buffer; /*< Buffer to deliver to up. */
|
||||
} response; /*< Shortcircuited response */
|
||||
skygw_chk_t ses_chk_tail;
|
||||
} MXS_SESSION;
|
||||
|
||||
/**
|
||||
* A filter that terminates the request processing and delivers a response
|
||||
* directly should specify the response using this function. After having
|
||||
* called this function, the module must not deliver the request further
|
||||
* in the request processing pipeline.
|
||||
*
|
||||
* @param session The session.
|
||||
* @param up The filter that should receive the response.
|
||||
* @param buffer The response.
|
||||
*/
|
||||
void session_set_response(MXS_SESSION *session, MXS_UPSTREAM *up, GWBUF *buffer);
|
||||
|
||||
/**
|
||||
* Function to be used by protocol module for routing incoming data
|
||||
|
@ -62,6 +62,7 @@ static MXS_SESSION *session_find_free();
|
||||
static void session_final_free(MXS_SESSION *session);
|
||||
static MXS_SESSION* session_alloc_body(SERVICE* service, DCB* client_dcb,
|
||||
MXS_SESSION* session);
|
||||
static void session_deliver_response(MXS_SESSION* session);
|
||||
|
||||
/**
|
||||
* The clientReply of the session.
|
||||
@ -720,6 +721,10 @@ bool session_route_query(MXS_SESSION* session, GWBUF* buffer)
|
||||
rv = false;
|
||||
}
|
||||
|
||||
// In case some filter has short-circuited the request processing we need
|
||||
// to deliver that now to the client.
|
||||
session_deliver_response(session);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@ -1223,3 +1228,51 @@ bool session_remove_variable(MXS_SESSION* session,
|
||||
|
||||
return removed;
|
||||
}
|
||||
|
||||
void session_set_response(MXS_SESSION *session, MXS_UPSTREAM *up, GWBUF *buffer)
|
||||
{
|
||||
// Valid arguments.
|
||||
ss_dassert(session && up && buffer);
|
||||
|
||||
// Valid state. Only one filter may terminate the execution and exactly once.
|
||||
ss_dassert(!session->response.up.instance &&
|
||||
!session->response.up.session &&
|
||||
!session->response.buffer);
|
||||
|
||||
session->response.up = *up;
|
||||
session->response.buffer = buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delivers a provided response to the upstream filter that should
|
||||
* receive it.
|
||||
*
|
||||
* @param session The session.
|
||||
*/
|
||||
static void session_deliver_response(MXS_SESSION* session)
|
||||
{
|
||||
MXS_FILTER* filter_instance = session->response.up.instance;
|
||||
|
||||
if (filter_instance)
|
||||
{
|
||||
MXS_FILTER_SESSION* filter_session = session->response.up.session;
|
||||
GWBUF* buffer = session->response.buffer;
|
||||
|
||||
ss_dassert(filter_session);
|
||||
ss_dassert(buffer);
|
||||
|
||||
session->response.up.clientReply(filter_instance, filter_session, buffer);
|
||||
|
||||
session->response.up.instance = NULL;
|
||||
session->response.up.session = NULL;
|
||||
session->response.up.clientReply = NULL;
|
||||
session->response.up.error = NULL;
|
||||
session->response.buffer = NULL;
|
||||
}
|
||||
|
||||
ss_dassert(!session->response.up.instance);
|
||||
ss_dassert(!session->response.up.session);
|
||||
ss_dassert(!session->response.up.clientReply);
|
||||
ss_dassert(!session->response.up.error);
|
||||
ss_dassert(!session->response.buffer);
|
||||
}
|
||||
|
Reference in New Issue
Block a user