Merge branch '2.1' into develop
This commit is contained in:
@ -1931,8 +1931,9 @@ check_config_objects(CONFIG_CONTEXT *context)
|
||||
if (mod == NULL ||
|
||||
!config_param_is_valid(mod->parameters, params->name, params->value, context))
|
||||
{
|
||||
MXS_ERROR("Unexpected parameter '%s' or parameter value for object '%s' of type '%s'.",
|
||||
params->name, obj->object, type);
|
||||
MXS_ERROR("Unexpected parameter '%s' for object '%s' of type '%s', "
|
||||
"or '%s' is an invalid value for parameter '%s'.",
|
||||
params->name, obj->object, type, params->value, params->name);
|
||||
rval = false;
|
||||
}
|
||||
else if (is_path_parameter(mod->parameters, params->name))
|
||||
|
@ -429,13 +429,13 @@ dcb_free_all_memory(DCB *dcb)
|
||||
gwbuf_free(dcb->dcb_fakequeue);
|
||||
dcb->dcb_fakequeue = NULL;
|
||||
}
|
||||
spinlock_acquire(&dcb->cb_lock);
|
||||
|
||||
while ((cb_dcb = dcb->callbacks) != NULL)
|
||||
{
|
||||
dcb->callbacks = cb_dcb->next;
|
||||
MXS_FREE(cb_dcb);
|
||||
}
|
||||
spinlock_release(&dcb->cb_lock);
|
||||
|
||||
if (dcb->ssl)
|
||||
{
|
||||
SSL_free(dcb->ssl);
|
||||
@ -757,10 +757,6 @@ dcb_connect(SERVER *server, MXS_SESSION *session, const char *protocol)
|
||||
*/
|
||||
dcb->server = server;
|
||||
|
||||
/** Copy status field to DCB */
|
||||
dcb->dcb_server_status = server->status;
|
||||
dcb->dcb_port = server->port;
|
||||
|
||||
dcb->was_persistent = false;
|
||||
|
||||
/**
|
||||
@ -1721,13 +1717,13 @@ dcb_maybe_add_persistent(DCB *dcb)
|
||||
session_put_ref(local_session);
|
||||
}
|
||||
}
|
||||
spinlock_acquire(&dcb->cb_lock);
|
||||
|
||||
while ((loopcallback = dcb->callbacks) != NULL)
|
||||
{
|
||||
dcb->callbacks = loopcallback->next;
|
||||
MXS_FREE(loopcallback);
|
||||
}
|
||||
spinlock_release(&dcb->cb_lock);
|
||||
|
||||
dcb->nextpersistent = dcb->server->persistent[dcb->thread.id];
|
||||
dcb->server->persistent[dcb->thread.id] = dcb;
|
||||
atomic_add(&dcb->server->stats.n_persistent, 1);
|
||||
@ -2070,20 +2066,7 @@ dprintDCB(DCB *pdcb, DCB *dcb)
|
||||
{
|
||||
dcb_printf(pdcb, "\t\tDCB is a clone.\n");
|
||||
}
|
||||
#if SPINLOCK_PROFILE
|
||||
dcb_printf(pdcb, "\tInitlock Statistics:\n");
|
||||
spinlock_stats(&dcb->dcb_initlock, spin_reporter, pdcb);
|
||||
dcb_printf(pdcb, "\tWrite Queue Lock Statistics:\n");
|
||||
spinlock_stats(&dcb->writeqlock, spin_reporter, pdcb);
|
||||
dcb_printf(pdcb, "\tDelay Queue Lock Statistics:\n");
|
||||
spinlock_stats(&dcb->delayqlock, spin_reporter, pdcb);
|
||||
dcb_printf(pdcb, "\tPollin Lock Statistics:\n");
|
||||
spinlock_stats(&dcb->pollinlock, spin_reporter, pdcb);
|
||||
dcb_printf(pdcb, "\tPollout Lock Statistics:\n");
|
||||
spinlock_stats(&dcb->polloutlock, spin_reporter, pdcb);
|
||||
dcb_printf(pdcb, "\tCallback Lock Statistics:\n");
|
||||
spinlock_stats(&dcb->cb_lock, spin_reporter, pdcb);
|
||||
#endif
|
||||
|
||||
if (dcb->persistentstart)
|
||||
{
|
||||
char buff[20];
|
||||
@ -2337,8 +2320,8 @@ dcb_add_callback(DCB *dcb,
|
||||
ptr->cb = callback;
|
||||
ptr->userdata = userdata;
|
||||
ptr->next = NULL;
|
||||
spinlock_acquire(&dcb->cb_lock);
|
||||
cb = dcb->callbacks;
|
||||
|
||||
while (cb)
|
||||
{
|
||||
if (cb->reason == reason && cb->cb == callback &&
|
||||
@ -2346,7 +2329,6 @@ dcb_add_callback(DCB *dcb,
|
||||
{
|
||||
/* Callback is a duplicate, abandon it */
|
||||
MXS_FREE(ptr);
|
||||
spinlock_release(&dcb->cb_lock);
|
||||
return 0;
|
||||
}
|
||||
lastcb = cb;
|
||||
@ -2360,7 +2342,7 @@ dcb_add_callback(DCB *dcb,
|
||||
{
|
||||
lastcb->next = ptr;
|
||||
}
|
||||
spinlock_release(&dcb->cb_lock);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -2384,9 +2366,8 @@ dcb_remove_callback(DCB *dcb,
|
||||
{
|
||||
DCB_CALLBACK *cb, *pcb = NULL;
|
||||
int rval = 0;
|
||||
|
||||
spinlock_acquire(&dcb->cb_lock);
|
||||
cb = dcb->callbacks;
|
||||
|
||||
if (cb == NULL)
|
||||
{
|
||||
rval = 0;
|
||||
@ -2407,7 +2388,7 @@ dcb_remove_callback(DCB *dcb,
|
||||
{
|
||||
dcb->callbacks = cb->next;
|
||||
}
|
||||
spinlock_release(&dcb->cb_lock);
|
||||
|
||||
MXS_FREE(cb);
|
||||
rval = 1;
|
||||
break;
|
||||
@ -2416,10 +2397,7 @@ dcb_remove_callback(DCB *dcb,
|
||||
cb = cb->next;
|
||||
}
|
||||
}
|
||||
if (!rval)
|
||||
{
|
||||
spinlock_release(&dcb->cb_lock);
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
@ -2433,22 +2411,19 @@ static void
|
||||
dcb_call_callback(DCB *dcb, DCB_REASON reason)
|
||||
{
|
||||
DCB_CALLBACK *cb, *nextcb;
|
||||
|
||||
spinlock_acquire(&dcb->cb_lock);
|
||||
cb = dcb->callbacks;
|
||||
|
||||
while (cb)
|
||||
{
|
||||
if (cb->reason == reason)
|
||||
{
|
||||
nextcb = cb->next;
|
||||
spinlock_release(&dcb->cb_lock);
|
||||
|
||||
MXS_DEBUG("%lu [dcb_call_callback] %s",
|
||||
pthread_self(),
|
||||
STRDCBREASON(reason));
|
||||
|
||||
cb->cb(dcb, reason, cb->userdata);
|
||||
spinlock_acquire(&dcb->cb_lock);
|
||||
cb = nextcb;
|
||||
}
|
||||
else
|
||||
@ -2456,7 +2431,6 @@ dcb_call_callback(DCB *dcb, DCB_REASON reason)
|
||||
cb = cb->next;
|
||||
}
|
||||
}
|
||||
spinlock_release(&dcb->cb_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2488,13 +2462,11 @@ dcb_hangup_foreach(struct server* server)
|
||||
|
||||
for (DCB *dcb = all_dcbs[i]; dcb; dcb = dcb->thread.next)
|
||||
{
|
||||
spinlock_acquire(&dcb->dcb_initlock);
|
||||
if (dcb->state == DCB_STATE_POLLING && dcb->server &&
|
||||
dcb->server == server)
|
||||
{
|
||||
poll_fake_hangup_event(dcb);
|
||||
}
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
}
|
||||
|
||||
spinlock_release(&all_dcbs_lock[i]);
|
||||
|
@ -25,7 +25,7 @@ MXS_BEGIN_DECLS
|
||||
#define MXS_UPSTREAM_INIT {0}
|
||||
#define SESSION_FILTER_INIT {0}
|
||||
|
||||
#define SESSION_INIT {.ses_chk_top = CHK_NUM_SESSION, .ses_lock = SPINLOCK_INIT, \
|
||||
#define SESSION_INIT {.ses_chk_top = CHK_NUM_SESSION, \
|
||||
.stats = SESSION_STATS_INIT, .head = MXS_DOWNSTREAM_INIT, .tail = MXS_UPSTREAM_INIT, \
|
||||
.state = SESSION_STATE_ALLOC, .ses_chk_tail = CHK_NUM_SESSION}
|
||||
|
||||
|
@ -337,7 +337,6 @@ int poll_add_dcb(DCB *dcb)
|
||||
/*<
|
||||
* Choose new state according to the role of dcb.
|
||||
*/
|
||||
spinlock_acquire(&dcb->dcb_initlock);
|
||||
if (dcb->dcb_role == DCB_ROLE_CLIENT_HANDLER || dcb->dcb_role == DCB_ROLE_BACKEND_HANDLER)
|
||||
{
|
||||
new_state = DCB_STATE_POLLING;
|
||||
@ -388,7 +387,6 @@ int poll_add_dcb(DCB *dcb)
|
||||
}
|
||||
|
||||
dcb->thread.id = owner;
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
|
||||
dcb_add_to_list(dcb);
|
||||
|
||||
@ -396,7 +394,6 @@ int poll_add_dcb(DCB *dcb)
|
||||
|
||||
if (dcb->dcb_role == DCB_ROLE_SERVICE_LISTENER)
|
||||
{
|
||||
spinlock_acquire(&dcb->dcb_initlock);
|
||||
/** Listeners are added to all epoll instances */
|
||||
int nthr = config_threadcount();
|
||||
|
||||
@ -413,7 +410,6 @@ int poll_add_dcb(DCB *dcb)
|
||||
break;
|
||||
}
|
||||
}
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -448,12 +444,10 @@ int poll_remove_dcb(DCB *dcb)
|
||||
struct epoll_event ev;
|
||||
CHK_DCB(dcb);
|
||||
|
||||
spinlock_acquire(&dcb->dcb_initlock);
|
||||
/*< It is possible that dcb has already been removed from the set */
|
||||
if (dcb->state == DCB_STATE_NOPOLLING ||
|
||||
dcb->state == DCB_STATE_ZOMBIE)
|
||||
{
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
return 0;
|
||||
}
|
||||
if (DCB_STATE_POLLING != dcb->state
|
||||
@ -478,7 +472,6 @@ int poll_remove_dcb(DCB *dcb)
|
||||
* DCB_STATE_NOPOLLING.
|
||||
*/
|
||||
dcbfd = dcb->fd;
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
|
||||
if (dcbfd > 0)
|
||||
{
|
||||
@ -486,7 +479,6 @@ int poll_remove_dcb(DCB *dcb)
|
||||
|
||||
if (dcb->dcb_role == DCB_ROLE_SERVICE_LISTENER)
|
||||
{
|
||||
spinlock_acquire(&dcb->dcb_initlock);
|
||||
/** Listeners are added to all epoll instances */
|
||||
int nthr = config_threadcount();
|
||||
|
||||
@ -502,7 +494,6 @@ int poll_remove_dcb(DCB *dcb)
|
||||
ss_dassert(error_num);
|
||||
}
|
||||
}
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -925,15 +916,12 @@ process_pollq(int thread_id, struct epoll_event *event)
|
||||
thread_data[thread_id].event = ev;
|
||||
}
|
||||
|
||||
ss_debug(spinlock_acquire(&dcb->dcb_initlock));
|
||||
ss_dassert(dcb->state != DCB_STATE_ALLOC);
|
||||
/* It isn't obvious that this is impossible */
|
||||
/* ss_dassert(dcb->state != DCB_STATE_DISCONNECTED); */
|
||||
if (DCB_STATE_DISCONNECTED == dcb->state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
ss_debug(spinlock_release(&dcb->dcb_initlock));
|
||||
|
||||
MXS_DEBUG("%lu [poll_waitevents] event %d dcb %p "
|
||||
"role %s",
|
||||
@ -1059,11 +1047,10 @@ process_pollq(int thread_id, struct epoll_event *event)
|
||||
eno,
|
||||
strerror_r(eno, errbuf, sizeof(errbuf)));
|
||||
ts_stats_increment(pollStats.n_hup, thread_id);
|
||||
spinlock_acquire(&dcb->dcb_initlock);
|
||||
if ((dcb->flags & DCBF_HUNG) == 0)
|
||||
{
|
||||
dcb->flags |= DCBF_HUNG;
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
|
||||
/** Read session id to thread's local storage */
|
||||
dcb_get_ses_log_info(dcb,
|
||||
&mxs_log_tls.li_sesid,
|
||||
@ -1074,10 +1061,6 @@ process_pollq(int thread_id, struct epoll_event *event)
|
||||
dcb->func.hangup(dcb);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef EPOLLRDHUP
|
||||
@ -1094,11 +1077,11 @@ process_pollq(int thread_id, struct epoll_event *event)
|
||||
eno,
|
||||
strerror_r(eno, errbuf, sizeof(errbuf)));
|
||||
ts_stats_increment(pollStats.n_hup, thread_id);
|
||||
spinlock_acquire(&dcb->dcb_initlock);
|
||||
|
||||
if ((dcb->flags & DCBF_HUNG) == 0)
|
||||
{
|
||||
dcb->flags |= DCBF_HUNG;
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
|
||||
/** Read session id to thread's local storage */
|
||||
dcb_get_ses_log_info(dcb,
|
||||
&mxs_log_tls.li_sesid,
|
||||
@ -1109,10 +1092,6 @@ process_pollq(int thread_id, struct epoll_event *event)
|
||||
dcb->func.hangup(dcb);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
spinlock_release(&dcb->dcb_initlock);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -31,7 +31,6 @@
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <maxscale/spinlock.h>
|
||||
#include <maxscale/random_jkiss.h>
|
||||
|
||||
/* Public domain code for JKISS RNG - Comment header added */
|
||||
@ -42,8 +41,6 @@
|
||||
static unsigned int x = 123456789, y = 987654321, z = 43219876, c = 6543217; /* Seed variables */
|
||||
static bool init = false;
|
||||
|
||||
static SPINLOCK random_jkiss_spinlock = SPINLOCK_INIT;
|
||||
|
||||
static unsigned int random_jkiss_devrand(void);
|
||||
static void random_init_jkiss(void);
|
||||
|
||||
@ -60,14 +57,11 @@ random_jkiss(void)
|
||||
unsigned long long t;
|
||||
unsigned int result;
|
||||
|
||||
spinlock_acquire(&random_jkiss_spinlock);
|
||||
if (!init)
|
||||
{
|
||||
/* Must set init first because initialisation calls this function */
|
||||
init = true;
|
||||
spinlock_release(&random_jkiss_spinlock);
|
||||
random_init_jkiss();
|
||||
spinlock_acquire(&random_jkiss_spinlock);
|
||||
}
|
||||
x = 314527869 * x + 1234567;
|
||||
y ^= y << 5;
|
||||
@ -77,7 +71,6 @@ random_jkiss(void)
|
||||
c = t >> 32;
|
||||
z = t;
|
||||
result = x + y + z;
|
||||
spinlock_release(&random_jkiss_spinlock);
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -120,7 +113,6 @@ random_init_jkiss(void)
|
||||
{
|
||||
int newrand, i;
|
||||
|
||||
spinlock_acquire(&random_jkiss_spinlock);
|
||||
if ((newrand = random_jkiss_devrand()) != 0)
|
||||
{
|
||||
x = newrand;
|
||||
@ -140,7 +132,6 @@ random_init_jkiss(void)
|
||||
{
|
||||
c = newrand % 698769068 + 1; /* Should be less than 698769069 */
|
||||
}
|
||||
spinlock_release(&random_jkiss_spinlock);
|
||||
|
||||
/* "Warm up" our random number generator */
|
||||
for (i = 0; i < 100; i++)
|
||||
|
@ -230,7 +230,6 @@ session_set_dummy(DCB *client_dcb)
|
||||
session->ses_chk_top = CHK_NUM_SESSION;
|
||||
session->ses_chk_tail = CHK_NUM_SESSION;
|
||||
session->ses_is_child = false;
|
||||
spinlock_init(&session->ses_lock);
|
||||
session->service = NULL;
|
||||
session->client_dcb = NULL;
|
||||
session->n_filters = 0;
|
||||
@ -285,20 +284,17 @@ void session_disable_log_priority(MXS_SESSION* session, int priority)
|
||||
bool
|
||||
session_link_dcb(MXS_SESSION *session, DCB *dcb)
|
||||
{
|
||||
spinlock_acquire(&session->ses_lock);
|
||||
ss_info_dassert(session->state != SESSION_STATE_FREE,
|
||||
"If session->state is SESSION_STATE_FREE then this attempt to "
|
||||
"access freed memory block.");
|
||||
if (session->state == SESSION_STATE_FREE)
|
||||
{
|
||||
spinlock_release(&session->ses_lock);
|
||||
return false;
|
||||
}
|
||||
atomic_add(&session->refcount, 1);
|
||||
dcb->session = session;
|
||||
/** Move this DCB under the same thread */
|
||||
dcb->thread.id = session->client_dcb->thread.id;
|
||||
spinlock_release(&session->ses_lock);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user