Remove the DCB write queue locking
Since only one thread can append to the DCBs write queue at a time, there is no need to lock it.
This commit is contained in:
@ -1122,19 +1122,14 @@ dcb_basic_read_SSL(DCB *dcb, int *nsingleread)
|
|||||||
*nsingleread = -1;
|
*nsingleread = -1;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
spinlock_acquire(&dcb->writeqlock);
|
|
||||||
/* If we were in a retry situation, need to clear flag and attempt write */
|
/* If we were in a retry situation, need to clear flag and attempt write */
|
||||||
if (dcb->ssl_read_want_write || dcb->ssl_read_want_read)
|
if (dcb->ssl_read_want_write || dcb->ssl_read_want_read)
|
||||||
{
|
{
|
||||||
dcb->ssl_read_want_write = false;
|
dcb->ssl_read_want_write = false;
|
||||||
dcb->ssl_read_want_read = false;
|
dcb->ssl_read_want_read = false;
|
||||||
spinlock_release(&dcb->writeqlock);
|
|
||||||
dcb_drain_writeq(dcb);
|
dcb_drain_writeq(dcb);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
spinlock_release(&dcb->writeqlock);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SSL_ERROR_ZERO_RETURN:
|
case SSL_ERROR_ZERO_RETURN:
|
||||||
@ -1153,10 +1148,8 @@ dcb_basic_read_SSL(DCB *dcb, int *nsingleread)
|
|||||||
pthread_self(),
|
pthread_self(),
|
||||||
__func__
|
__func__
|
||||||
);
|
);
|
||||||
spinlock_acquire(&dcb->writeqlock);
|
|
||||||
dcb->ssl_read_want_write = false;
|
dcb->ssl_read_want_write = false;
|
||||||
dcb->ssl_read_want_read = true;
|
dcb->ssl_read_want_read = true;
|
||||||
spinlock_release(&dcb->writeqlock);
|
|
||||||
*nsingleread = 0;
|
*nsingleread = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1166,10 +1159,8 @@ dcb_basic_read_SSL(DCB *dcb, int *nsingleread)
|
|||||||
pthread_self(),
|
pthread_self(),
|
||||||
__func__
|
__func__
|
||||||
);
|
);
|
||||||
spinlock_acquire(&dcb->writeqlock);
|
|
||||||
dcb->ssl_read_want_write = true;
|
dcb->ssl_read_want_write = true;
|
||||||
dcb->ssl_read_want_read = false;
|
dcb->ssl_read_want_read = false;
|
||||||
spinlock_release(&dcb->writeqlock);
|
|
||||||
*nsingleread = 0;
|
*nsingleread = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1253,7 +1244,6 @@ dcb_write(DCB *dcb, GWBUF *queue)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
spinlock_acquire(&dcb->writeqlock);
|
|
||||||
empty_queue = (dcb->writeq == NULL);
|
empty_queue = (dcb->writeq == NULL);
|
||||||
/*
|
/*
|
||||||
* Add our data to the write queue. If the queue already had data,
|
* Add our data to the write queue. If the queue already had data,
|
||||||
@ -1261,10 +1251,10 @@ dcb_write(DCB *dcb, GWBUF *queue)
|
|||||||
* If it did not already have data, we call the drain write queue
|
* If it did not already have data, we call the drain write queue
|
||||||
* function immediately to attempt to write the data.
|
* function immediately to attempt to write the data.
|
||||||
*/
|
*/
|
||||||
atomic_add(&dcb->writeqlen, gwbuf_length(queue));
|
dcb->writeqlen += gwbuf_length(queue);
|
||||||
dcb->writeq = gwbuf_append(dcb->writeq, queue);
|
dcb->writeq = gwbuf_append(dcb->writeq, queue);
|
||||||
spinlock_release(&dcb->writeqlock);
|
|
||||||
dcb->stats.n_buffered++;
|
dcb->stats.n_buffered++;
|
||||||
|
|
||||||
MXS_DEBUG("%lu [dcb_write] Append to writequeue. %d writes "
|
MXS_DEBUG("%lu [dcb_write] Append to writequeue. %d writes "
|
||||||
"buffered for dcb %p in state %s fd %d",
|
"buffered for dcb %p in state %s fd %d",
|
||||||
pthread_self(),
|
pthread_self(),
|
||||||
@ -1494,7 +1484,6 @@ dcb_drain_writeq(DCB *dcb)
|
|||||||
*/
|
*/
|
||||||
if (stop_writing)
|
if (stop_writing)
|
||||||
{
|
{
|
||||||
spinlock_acquire(&dcb->writeqlock);
|
|
||||||
dcb->writeq = gwbuf_append(local_writeq, dcb->writeq);
|
dcb->writeq = gwbuf_append(local_writeq, dcb->writeq);
|
||||||
|
|
||||||
if (dcb->drain_called_while_busy)
|
if (dcb->drain_called_while_busy)
|
||||||
@ -1502,13 +1491,11 @@ dcb_drain_writeq(DCB *dcb)
|
|||||||
local_writeq = dcb->writeq;
|
local_writeq = dcb->writeq;
|
||||||
dcb->writeq = NULL;
|
dcb->writeq = NULL;
|
||||||
dcb->drain_called_while_busy = false;
|
dcb->drain_called_while_busy = false;
|
||||||
spinlock_release(&dcb->writeqlock);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dcb->draining_flag = false;
|
dcb->draining_flag = false;
|
||||||
spinlock_release(&dcb->writeqlock);
|
|
||||||
goto wrap_up;
|
goto wrap_up;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1532,7 +1519,7 @@ wrap_up:
|
|||||||
*/
|
*/
|
||||||
if (total_written)
|
if (total_written)
|
||||||
{
|
{
|
||||||
atomic_add(&dcb->writeqlen, -total_written);
|
dcb->writeqlen -= total_written;
|
||||||
|
|
||||||
/* Check if the draining has taken us from above water to below water */
|
/* Check if the draining has taken us from above water to below water */
|
||||||
if (above_water && dcb->writeqlen < dcb->low_water)
|
if (above_water && dcb->writeqlen < dcb->low_water)
|
||||||
@ -1566,7 +1553,6 @@ static GWBUF *
|
|||||||
dcb_grab_writeq(DCB *dcb, bool first_time)
|
dcb_grab_writeq(DCB *dcb, bool first_time)
|
||||||
{
|
{
|
||||||
GWBUF *local_writeq = NULL;
|
GWBUF *local_writeq = NULL;
|
||||||
spinlock_acquire(&dcb->writeqlock);
|
|
||||||
|
|
||||||
if (first_time && dcb->ssl_read_want_write)
|
if (first_time && dcb->ssl_read_want_write)
|
||||||
{
|
{
|
||||||
@ -1583,7 +1569,7 @@ dcb_grab_writeq(DCB *dcb, bool first_time)
|
|||||||
dcb->draining_flag = local_writeq ? true : false;
|
dcb->draining_flag = local_writeq ? true : false;
|
||||||
dcb->writeq = NULL;
|
dcb->writeq = NULL;
|
||||||
}
|
}
|
||||||
spinlock_release(&dcb->writeqlock);
|
|
||||||
return local_writeq;
|
return local_writeq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -884,13 +884,11 @@ static int gw_write_backend_event(DCB *dcb)
|
|||||||
uint8_t* data = NULL;
|
uint8_t* data = NULL;
|
||||||
bool com_quit = false;
|
bool com_quit = false;
|
||||||
|
|
||||||
spinlock_acquire(&dcb->writeqlock);
|
|
||||||
if (dcb->writeq)
|
if (dcb->writeq)
|
||||||
{
|
{
|
||||||
data = (uint8_t *) GWBUF_DATA(dcb->writeq);
|
data = (uint8_t *) GWBUF_DATA(dcb->writeq);
|
||||||
com_quit = MYSQL_IS_COM_QUIT(data);
|
com_quit = MYSQL_IS_COM_QUIT(data);
|
||||||
}
|
}
|
||||||
spinlock_release(&dcb->writeqlock);
|
|
||||||
|
|
||||||
if (data)
|
if (data)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user