get session transation state from backend via session track mechanism

This commit is contained in:
Dapeng Huang
2018-01-14 12:23:38 +08:00
parent 27e563dcff
commit e1aeac8b07
16 changed files with 231 additions and 32 deletions

View File

@ -147,6 +147,7 @@ const char CN_USER[] = "user";
const char CN_USERS[] = "users";
const char CN_VERSION_STRING[] = "version_string";
const char CN_WEIGHTBY[] = "weightby";
const char CN_SESSION_TRACK_TRX_STATE[] = "session_track_trx_state";
typedef struct duplicate_context
{
@ -233,6 +234,7 @@ const char *config_listener_params[] =
CN_SSL_VERSION,
CN_SSL_CERT_VERIFY_DEPTH,
CN_SSL_VERIFY_PEER_CERTIFICATE,
CN_SESSION_TRACK_TRX_STATE,
NULL
};
@ -3369,7 +3371,7 @@ int create_new_listener(CONFIG_CONTEXT *obj)
char *socket = config_get_value(obj->parameters, CN_SOCKET);
char *authenticator = config_get_value(obj->parameters, CN_AUTHENTICATOR);
char *authenticator_options = config_get_value(obj->parameters, CN_AUTHENTICATOR_OPTIONS);
bool session_track_trx_state = config_get_bool(obj->parameters, CN_SESSION_TRACK_TRX_STATE);
if (raw_service_name && protocol && (socket || port))
{
char service_name[strlen(raw_service_name) + 1];
@ -3391,7 +3393,7 @@ int create_new_listener(CONFIG_CONTEXT *obj)
else
{
serviceCreateListener(service, obj->object, protocol, socket, 0,
authenticator, authenticator_options, ssl_info);
authenticator, authenticator_options, ssl_info, session_track_trx_state);
}
}
@ -3408,7 +3410,7 @@ int create_new_listener(CONFIG_CONTEXT *obj)
else
{
serviceCreateListener(service, obj->object, protocol, address, atoi(port),
authenticator, authenticator_options, ssl_info);
authenticator, authenticator_options, ssl_info, session_track_trx_state);
}
}

View File

@ -795,7 +795,7 @@ bool runtime_create_listener(SERVICE *service, const char *name, const char *add
const char *port, const char *proto, const char *auth,
const char *auth_opt, const char *ssl_key,
const char *ssl_cert, const char *ssl_ca,
const char *ssl_version, const char *ssl_depth)
const char *ssl_version, const char *ssl_depth, bool session_track_trx_state)
{
if (addr == NULL || strcasecmp(addr, CN_DEFAULT) == 0)
@ -842,7 +842,7 @@ bool runtime_create_listener(SERVICE *service, const char *name, const char *add
{
const char *print_addr = addr ? addr : "::";
SERV_LISTENER *listener = serviceCreateListener(service, name, proto, addr,
u_port, auth, auth_opt, ssl);
u_port, auth, auth_opt, ssl, session_track_trx_state);
if (listener && listener_serialize(listener))
{
@ -1961,11 +1961,12 @@ bool runtime_create_listener_from_json(SERVICE* service, json_t* json)
const char* ssl_ca_cert = get_string_or_null(json, MXS_JSON_PTR_PARAM_SSL_CA_CERT);
const char* ssl_version = get_string_or_null(json, MXS_JSON_PTR_PARAM_SSL_VERSION);
const char* ssl_cert_verify_depth = get_string_or_null(json, MXS_JSON_PTR_PARAM_SSL_CERT_VERIFY_DEPTH);
bool session_track_trx_state = is_bool_or_null(json, MXS_JSON_PTR_PARAM_SESSION_TRACK_TRX_STATE);
rval = runtime_create_listener(service, id, address, port.c_str(), protocol,
authenticator, authenticator_options,
ssl_key, ssl_cert, ssl_ca_cert, ssl_version,
ssl_cert_verify_depth);
ssl_cert_verify_depth, session_track_trx_state);
}
return rval;

View File

@ -166,7 +166,8 @@ bool runtime_create_listener(SERVICE *service, const char *name, const char *add
const char *port, const char *proto, const char *auth,
const char *auth_opt, const char *ssl_key,
const char *ssl_cert, const char *ssl_ca,
const char *ssl_version, const char *ssl_depth);
const char *ssl_version, const char *ssl_depth,
bool session_track_trx_state);
/**
* @brief Destroy a listener

View File

@ -84,7 +84,7 @@ bool service_thread_init();
SERV_LISTENER* serviceCreateListener(SERVICE *service, const char *name,
const char *protocol, const char *address,
unsigned short port, const char *authenticator,
const char *options, SSL_LISTENER *ssl);
const char *options, SSL_LISTENER *ssl, bool session_track_trx_state);
void serviceRemoveBackend(SERVICE *service, const SERVER *server);

View File

@ -62,7 +62,7 @@ static RSA *tmp_rsa_callback(SSL *s, int is_export, int keylength);
SERV_LISTENER *
listener_alloc(struct service* service, const char* name, const char *protocol,
const char *address, unsigned short port, const char *authenticator,
const char* auth_options, SSL_LISTENER *ssl)
const char* auth_options, SSL_LISTENER *ssl, bool session_track_trx_state)
{
char *my_address = NULL;
if (address)
@ -135,6 +135,7 @@ listener_alloc(struct service* service, const char* name, const char *protocol,
proto->users = NULL;
proto->next = NULL;
proto->auth_instance = auth_instance;
proto->session_track_trx_state = session_track_trx_state;
spinlock_init(&proto->lock);
return proto;

View File

@ -755,10 +755,10 @@ static void service_add_listener(SERVICE* service, SERV_LISTENER* proto)
*/
SERV_LISTENER* serviceCreateListener(SERVICE *service, const char *name, const char *protocol,
const char *address, unsigned short port, const char *authenticator,
const char *options, SSL_LISTENER *ssl)
const char *options, SSL_LISTENER *ssl, bool session_track_trx_state)
{
SERV_LISTENER *proto = listener_alloc(service, name, protocol, address,
port, authenticator, options, ssl);
port, authenticator, options, ssl, session_track_trx_state);
if (proto)
{

View File

@ -71,7 +71,7 @@ test1()
ss_dfprintf(stderr, "\t..done\nAdding protocol testprotocol.");
set_libdir(MXS_STRDUP_A("../../modules/authenticator/MySQLAuth/"));
ss_info_dassert(serviceCreateListener(service, "TestProtocol", "testprotocol",
"localhost", 9876, "MySQLAuth", NULL, NULL),
"localhost", 9876, "MySQLAuth", NULL, NULL, false),
"Add Protocol should succeed");
ss_info_dassert(0 != serviceHasListener(service, "TestProtocol", "testprotocol", "localhost", 9876),
"Service should have new protocol as requested");