diff --git a/server/core/dcb.c b/server/core/dcb.c index cef229146..dcae2d201 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -95,6 +95,7 @@ DCB *rval; rval->data = NULL; rval->protocol = NULL; rval->session = NULL; + simple_mutex_init(&rval->mutex, "dcb mutex"); memset(&rval->stats, 0, sizeof(DCBSTATS)); // Zero the statistics bitmask_init(&rval->memdata.bitmask); rval->memdata.next = NULL; @@ -342,6 +343,7 @@ GWPROTOCOL *funcs; int dcb_read(DCB *dcb, GWBUF **head) { +<<<<<<< TREE GWBUF *buffer = NULL; int b, n = 0; int rc = 0; @@ -364,6 +366,10 @@ int eno = 0; return -1; } +======= +GWBUF *buffer = NULL; +int b, n = 0; +>>>>>>> MERGE-SOURCE while (b > 0) { int bufsize = b < MAX_BUFFER_SIZE ? b : MAX_BUFFER_SIZE; @@ -472,12 +478,28 @@ int w, saved_errno = 0; saved_errno = errno; if (w < 0) { +<<<<<<< TREE skygw_log_write( LOGFILE_ERROR, "%lu [dcb_write] Write to fd %d failed, errno %d", pthread_self(), dcb->fd, saved_errno); +======= + skygw_log_write( + LOGFILE_ERROR, + "%lu [dcb_write] Write to fd %d failed, errno %d", + pthread_self(), + dcb->fd, + saved_errno); + skygw_log_write( + LOGFILE_TRACE, + "%lu [dcb_write] Write to fd %d failed, errno %d", + pthread_self(), + dcb->fd, + saved_errno); + +>>>>>>> MERGE-SOURCE break; } @@ -547,6 +569,7 @@ int saved_errno = 0; saved_errno = errno; if (w < 0) { +<<<<<<< TREE skygw_log_write( LOGFILE_ERROR, "%lu [dcb_drain_writeq] Write to fd %d failed, " @@ -555,6 +578,24 @@ int saved_errno = 0; dcb->fd, saved_errno); break; +======= + skygw_log_write( + LOGFILE_ERROR, + "%lu [dcb_drain_writeq] Write to fd %d failed, " + "errno %d", + pthread_self(), + dcb->fd, + saved_errno); + skygw_log_write( + LOGFILE_TRACE, + "%lu [dcb_drain_writeq] Write to df %d failed, " + "errno %d", + pthread_self(), + dcb->fd, + saved_errno); + + break; +>>>>>>> MERGE-SOURCE } /* diff --git a/server/core/poll.c b/server/core/poll.c index 839c32f86..5644a9da4 100644 --- a/server/core/poll.c +++ b/server/core/poll.c @@ -195,13 +195,28 @@ bool no_op = FALSE; { DCB *dcb = (DCB *)events[i].data.ptr; __uint32_t ev = events[i].events; +<<<<<<< TREE skygw_log_write( LOGFILE_TRACE, "%lu [poll_waitevents] event %d", pthread_self(), ev); +======= + simple_mutex_t* mutex = &dcb->mutex; +>>>>>>> MERGE-SOURCE +<<<<<<< TREE +======= + simple_mutex_lock(mutex, TRUE); + + skygw_log_write( + LOGFILE_TRACE, + "%lu [poll_waitevents] event %d", + pthread_self(), + ev); +>>>>>>> MERGE-SOURCE if (DCB_ISZOMBIE(dcb)) +<<<<<<< TREE { skygw_log_write( LOGFILE_TRACE, @@ -209,12 +224,27 @@ bool no_op = FALSE; pthread_self()); continue; } +======= + { + skygw_log_write( + LOGFILE_TRACE, + "%lu [poll_waitevents] dcb is zombie", + pthread_self()); + simple_mutex_unlock(mutex); + continue; + } +>>>>>>> MERGE-SOURCE if (ev & EPOLLERR) { atomic_add(&pollStats.n_error, 1); dcb->func.error(dcb); +<<<<<<< TREE if (DCB_ISZOMBIE(dcb)) { +======= + if (DCB_ISZOMBIE(dcb)) { + simple_mutex_unlock(mutex); +>>>>>>> MERGE-SOURCE continue; } } @@ -222,7 +252,12 @@ bool no_op = FALSE; { atomic_add(&pollStats.n_hup, 1); dcb->func.hangup(dcb); +<<<<<<< TREE if (DCB_ISZOMBIE(dcb)) { +======= + if (DCB_ISZOMBIE(dcb)) { + simple_mutex_unlock(mutex); +>>>>>>> MERGE-SOURCE continue; } } @@ -261,8 +296,14 @@ bool no_op = FALSE; dcb->func.read(dcb); } } +<<<<<<< TREE } /**< for */ no_op = FALSE; +======= + simple_mutex_unlock(mutex); + } /**< for */ + no_op = FALSE; +>>>>>>> MERGE-SOURCE } dcb_process_zombies(thread_id); if (shutdown) diff --git a/server/include/dcb.h b/server/include/dcb.h index f55fdb9d0..332bfbf4b 100644 --- a/server/include/dcb.h +++ b/server/include/dcb.h @@ -134,6 +134,7 @@ typedef struct { * gateway may be selected to execute the required actions when a network event occurs. */ typedef struct dcb { + simple_mutex_t mutex; /**< Protects dcb processing. Coarse and temporary? */ int fd; /**< The descriptor */ int state; /**< Current descriptor state */ char *remote; /**< Address of remote end */ diff --git a/server/modules/protocol/mysql_client.c b/server/modules/protocol/mysql_client.c index 2c8316f56..ffda41262 100644 --- a/server/modules/protocol/mysql_client.c +++ b/server/modules/protocol/mysql_client.c @@ -488,6 +488,7 @@ int gw_read_client_event(DCB* dcb) { ROUTER_OBJECT *router = NULL; ROUTER *router_instance = NULL; void *rsession = NULL; +<<<<<<< TREE MySQLProtocol *protocol = NULL; int b = -1; @@ -500,12 +501,17 @@ int gw_read_client_event(DCB* dcb) { spinlock_release(&dcb->writeqlock); return 1; } +======= + MySQLProtocol *protocol = NULL; + int b = -1; +>>>>>>> MERGE-SOURCE if (dcb) { protocol = DCB_PROTOCOL(dcb, MySQLProtocol); } if (ioctl(dcb->fd, FIONREAD, &b)) { +<<<<<<< TREE int eno = errno; errno = 0; skygw_log_write( @@ -520,6 +526,27 @@ int gw_read_client_event(DCB* dcb) { spinlock_release(&dcb->writeqlock); return 1; +======= + int eno = errno; + errno = 0; + skygw_log_write( + LOGFILE_ERROR, + "%lu [gw_read_client_event] Setting FIONREAD for %d failed. " + "errno %d, %s", + pthread_self(), + dcb->fd, + eno , + strerror(eno)); + skygw_log_write( + LOGFILE_TRACE, + "%lu [gw_read_client_event] Setting FIONREAD for %d failed. " + "errno %d, %s", + pthread_self(), + dcb->fd, + eno , + strerror(eno)); + return 1; +>>>>>>> MERGE-SOURCE } else { //fprintf(stderr, "Client IOCTL FIONREAD bytes to read = %i\n", b); }