diff --git a/server/core/dcb.c b/server/core/dcb.c index 036b75cae..17b1204b8 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -760,134 +760,138 @@ dcb_connect(SERVER *server, SESSION *session, const char *protocol) * the last iteration of while loop. 0 is returned if no data available. */ int dcb_read( - DCB *dcb, - GWBUF **head, - int maxbytes) + DCB *dcb, + GWBUF **head, + int maxbytes) { - GWBUF *buffer = NULL; - int bytesavailable; - int nsingleread = 0; - int nreadtotal = 0; + GWBUF *buffer = NULL; + int bytesavailable; + int nsingleread = 0; + int nreadtotal = 0; - CHK_DCB(dcb); + CHK_DCB(dcb); - if (dcb->fd <= 0) - { - LOGIF(LE, (skygw_log_write_flush( - LOGFILE_ERROR, - "%lu [dcb_read] Error : Read failed, dcb is %s.", - pthread_self(), - dcb->fd == DCBFD_CLOSED ? "closed" : "cloned, not readable"))); - return 0; - } + if (dcb->fd <= 0) + { + /* */ + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "%lu [dcb_read] Error : Read failed, dcb is %s.", + pthread_self(), + dcb->fd == DCBFD_CLOSED ? "closed" : "cloned, not readable"))); + /* */ + return 0; + } - while (0 == maxbytes || nreadtotal < maxbytes) + while (0 == maxbytes || nreadtotal < maxbytes) + { + int bufsize; + + if (-1 == ioctl(dcb->fd, FIONREAD, &bytesavailable)) { - int bufsize; - - if (-1 == ioctl(dcb->fd, FIONREAD, &bytesavailable)) - { - LOGIF(LE, (skygw_log_write_flush( - LOGFILE_ERROR, - "%lu [dcb_read] Error : ioctl FIONREAD for dcb %p in " - "state %s fd %d failed due error %d, %s.", - pthread_self(), - dcb, - STRDCBSTATE(dcb->state), - dcb->fd, - errno, - strerror(errno)))); - return -1; - } + /* */ + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "%lu [dcb_read] Error : ioctl FIONREAD for dcb %p in " + "state %s fd %d failed due error %d, %s.", + pthread_self(), + dcb, + STRDCBSTATE(dcb->state), + dcb->fd, + errno, + strerror(errno)))); + /* */ + return -1; + } - if (bytesavailable == 0 && nreadtotal == 0) - { - /** Handle closed client socket */ - if (dcb_isclient(dcb)) - { - char c; - int l_errno = 0; - int r = -1; + if (bytesavailable == 0) + { + /** Handle closed client socket */ + if (nreadtotal == 0 && dcb_isclient(dcb)) + { + char c; + int l_errno = 0; + int r = -1; - /* try to read 1 byte, without consuming the socket buffer */ - r = recv(dcb->fd, &c, sizeof(char), MSG_PEEK); - l_errno = errno; + /* try to read 1 byte, without consuming the socket buffer */ + r = recv(dcb->fd, &c, sizeof(char), MSG_PEEK); + l_errno = errno; - if (r <= 0 && - l_errno != EAGAIN && - l_errno != EWOULDBLOCK && - l_errno != 0) - { - return -1; - } - } - return 0; - } - else if (bytesavailable == 0) + if (r <= 0 && + l_errno != EAGAIN && + l_errno != EWOULDBLOCK && + l_errno != 0) { - return 0; + return -1; } + } + return 0; + } - dcb->last_read = hkheartbeat; + dcb->last_read = hkheartbeat; - bufsize = MIN(bytesavailable, MAX_BUFFER_SIZE); - if (maxbytes) bufsize = MIN(bufsize, maxbytes); + bufsize = MIN(bytesavailable, MAX_BUFFER_SIZE); + if (maxbytes) bufsize = MIN(bufsize, maxbytes); - if ((buffer = gwbuf_alloc(bufsize)) == NULL) - { - /*< - * This is a fatal error which should cause shutdown. - * Todo shutdown if memory allocation fails. - */ - LOGIF(LE, (skygw_log_write_flush( - LOGFILE_ERROR, - "%lu [dcb_read] Error : Failed to allocate read buffer " - "for dcb %p fd %d, due %d, %s.", - pthread_self(), - dcb, - dcb->fd, - errno, - strerror(errno)))); - - return -1; - } - GW_NOINTR_CALL(nsingleread = read(dcb->fd, GWBUF_DATA(buffer), bufsize); - dcb->stats.n_reads++); + if ((buffer = gwbuf_alloc(bufsize)) == NULL) + { + /*< + * This is a fatal error which should cause shutdown. + * Todo shutdown if memory allocation fails. + */ + /* */ + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "%lu [dcb_read] Error : Failed to allocate read buffer " + "for dcb %p fd %d, due %d, %s.", + pthread_self(), + dcb, + dcb->fd, + errno, + strerror(errno)))); + /* */ + return -1; + } + GW_NOINTR_CALL(nsingleread = read(dcb->fd, GWBUF_DATA(buffer), bufsize); + dcb->stats.n_reads++); - if (nsingleread <= 0) - { - if (errno != 0 && errno != EAGAIN && errno != EWOULDBLOCK) - { - LOGIF(LE, (skygw_log_write_flush( - LOGFILE_ERROR, - "%lu [dcb_read] Error : Read failed, dcb %p in state " - "%s fd %d, due %d, %s.", - pthread_self(), - dcb, - STRDCBSTATE(dcb->state), - dcb->fd, - errno, - strerror(errno)))); - } - gwbuf_free(buffer); - return nsingleread; - } - nreadtotal += nsingleread; - - LOGIF(LD, (skygw_log_write( - LOGFILE_DEBUG, - "%lu [dcb_read] Read %d bytes from dcb %p in state %s " - "fd %d.", + if (nsingleread <= 0) + { + if (errno != 0 && errno != EAGAIN && errno != EWOULDBLOCK) + { + /* */ + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "%lu [dcb_read] Error : Read failed, dcb %p in state " + "%s fd %d, due %d, %s.", pthread_self(), - nsingleread, dcb, STRDCBSTATE(dcb->state), - dcb->fd))); - /*< Append read data to the gwbuf */ - *head = gwbuf_append(*head, buffer); - } /*< while (0 == maxbytes || nreadtotal < maxbytes) */ + dcb->fd, + errno, + strerror(errno)))); + /* */ + } + gwbuf_free(buffer); + return nsingleread; + } + nreadtotal += nsingleread; + /* */ + LOGIF(LD, (skygw_log_write( + LOGFILE_DEBUG, + "%lu [dcb_read] Read %d bytes from dcb %p in state %s " + "fd %d.", + pthread_self(), + nsingleread, + dcb, + STRDCBSTATE(dcb->state), + dcb->fd))); + /* */ + /*< Append read data to the gwbuf */ + *head = gwbuf_append(*head, buffer); + } /*< while (0 == maxbytes || nreadtotal < maxbytes) */ - return nsingleread; + return nsingleread; } /** @@ -1101,6 +1105,7 @@ int dcb_read_SSL( return_n: return nread; } + /** * General purpose routine to write to a DCB *