Fix bug in persistent connections; add code to check for DCB session pointer in poll loop before invoking processing.
This commit is contained in:
@ -1852,7 +1852,7 @@ dcb_close(DCB *dcb)
|
|||||||
{
|
{
|
||||||
char *user;
|
char *user;
|
||||||
user = session_getUser(dcb->session);
|
user = session_getUser(dcb->session);
|
||||||
dcb->user = strdup(user);
|
if (NULL != user) dcb->user = strdup(user);
|
||||||
/*<
|
/*<
|
||||||
* Add closing dcb to the top of the list, setting zombie marker
|
* Add closing dcb to the top of the list, setting zombie marker
|
||||||
*/
|
*/
|
||||||
|
@ -96,7 +96,7 @@ static simple_mutex_t epoll_wait_mutex; /*< serializes calls to epoll_wait */
|
|||||||
static int n_waiting = 0; /*< No. of threads in epoll_wait */
|
static int n_waiting = 0; /*< No. of threads in epoll_wait */
|
||||||
static int process_pollq(int thread_id);
|
static int process_pollq(int thread_id);
|
||||||
static void poll_add_event_to_dcb(DCB* dcb, GWBUF* buf, __uint32_t ev);
|
static void poll_add_event_to_dcb(DCB* dcb, GWBUF* buf, __uint32_t ev);
|
||||||
|
static bool poll_dcb_session_check(DCB *dcb);
|
||||||
|
|
||||||
DCB *eventq = NULL;
|
DCB *eventq = NULL;
|
||||||
SPINLOCK pollqlock = SPINLOCK_INIT;
|
SPINLOCK pollqlock = SPINLOCK_INIT;
|
||||||
@ -885,7 +885,10 @@ unsigned long qtime;
|
|||||||
dcb,
|
dcb,
|
||||||
&tls_log_info.li_sesid,
|
&tls_log_info.li_sesid,
|
||||||
&tls_log_info.li_enabled_logs)));
|
&tls_log_info.li_enabled_logs)));
|
||||||
|
if (poll_dcb_session_check(dcb))
|
||||||
|
{
|
||||||
dcb->func.write_ready(dcb);
|
dcb->func.write_ready(dcb);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
LOGIF(LD, (skygw_log_write(
|
LOGIF(LD, (skygw_log_write(
|
||||||
LOGFILE_DEBUG,
|
LOGFILE_DEBUG,
|
||||||
@ -915,8 +918,11 @@ unsigned long qtime;
|
|||||||
dcb,
|
dcb,
|
||||||
&tls_log_info.li_sesid,
|
&tls_log_info.li_sesid,
|
||||||
&tls_log_info.li_enabled_logs)));
|
&tls_log_info.li_enabled_logs)));
|
||||||
|
if (poll_dcb_session_check(dcb))
|
||||||
|
{
|
||||||
dcb->func.accept(dcb);
|
dcb->func.accept(dcb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOGIF(LD, (skygw_log_write(
|
LOGIF(LD, (skygw_log_write(
|
||||||
@ -932,9 +938,12 @@ unsigned long qtime;
|
|||||||
dcb,
|
dcb,
|
||||||
&tls_log_info.li_sesid,
|
&tls_log_info.li_sesid,
|
||||||
&tls_log_info.li_enabled_logs)));
|
&tls_log_info.li_enabled_logs)));
|
||||||
|
if (poll_dcb_session_check(dcb))
|
||||||
|
{
|
||||||
dcb->func.read(dcb);
|
dcb->func.read(dcb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (ev & EPOLLERR)
|
if (ev & EPOLLERR)
|
||||||
{
|
{
|
||||||
int eno = gw_getsockerrno(dcb->fd);
|
int eno = gw_getsockerrno(dcb->fd);
|
||||||
@ -967,8 +976,11 @@ unsigned long qtime;
|
|||||||
dcb,
|
dcb,
|
||||||
&tls_log_info.li_sesid,
|
&tls_log_info.li_sesid,
|
||||||
&tls_log_info.li_enabled_logs)));
|
&tls_log_info.li_enabled_logs)));
|
||||||
|
if (poll_dcb_session_check(dcb))
|
||||||
|
{
|
||||||
dcb->func.error(dcb);
|
dcb->func.error(dcb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ev & EPOLLHUP)
|
if (ev & EPOLLHUP)
|
||||||
{
|
{
|
||||||
@ -996,8 +1008,11 @@ unsigned long qtime;
|
|||||||
dcb,
|
dcb,
|
||||||
&tls_log_info.li_sesid,
|
&tls_log_info.li_sesid,
|
||||||
&tls_log_info.li_enabled_logs)));
|
&tls_log_info.li_enabled_logs)));
|
||||||
|
if (poll_dcb_session_check(dcb))
|
||||||
|
{
|
||||||
dcb->func.hangup(dcb);
|
dcb->func.hangup(dcb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
spinlock_release(&dcb->dcb_initlock);
|
spinlock_release(&dcb->dcb_initlock);
|
||||||
}
|
}
|
||||||
@ -1029,8 +1044,11 @@ unsigned long qtime;
|
|||||||
dcb,
|
dcb,
|
||||||
&tls_log_info.li_sesid,
|
&tls_log_info.li_sesid,
|
||||||
&tls_log_info.li_enabled_logs)));
|
&tls_log_info.li_enabled_logs)));
|
||||||
|
if (poll_dcb_session_check(dcb))
|
||||||
|
{
|
||||||
dcb->func.hangup(dcb);
|
dcb->func.hangup(dcb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
spinlock_release(&dcb->dcb_initlock);
|
spinlock_release(&dcb->dcb_initlock);
|
||||||
}
|
}
|
||||||
@ -1098,6 +1116,29 @@ unsigned long qtime;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
*
|
||||||
|
* Check that the DCB has a session link before processing.
|
||||||
|
* If not, log an error. Processing will be bypassed
|
||||||
|
*
|
||||||
|
* @param dcb The DCB to check
|
||||||
|
* @return bool Does the DCB have a non-null session link
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
poll_dcb_session_check(DCB *dcb)
|
||||||
|
{
|
||||||
|
if (dcb->session)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOGIF;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
* Shutdown the polling loop
|
* Shutdown the polling loop
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
|
Reference in New Issue
Block a user