diff --git a/server/core/dcb.c b/server/core/dcb.c index 25cd5b526..b8d2c9762 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -185,7 +185,7 @@ dcb_free(DCB *dcb) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, - "Error : Attempt to free a DCB via dcb_fee " + "Error : Attempt to free a DCB via dcb_free " "that has been associated with a descriptor."))); } } @@ -287,6 +287,15 @@ DCB_CALLBACK *cb; dcb->state == DCB_STATE_ALLOC, "dcb not in DCB_STATE_DISCONNECTED not in DCB_STATE_ALLOC state."); + if (DCB_POLL_BUSY(dcb)) + { + /* Check if DCB has outstanding poll events */ + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "dcb_final_free: DCB %p has outstanding events", + dcb))); + } + /*< First remove this DCB from the chain */ spinlock_acquire(&dcbspin); if (allDCBs == dcb) @@ -358,6 +367,7 @@ DCB_CALLBACK *cb; } spinlock_release(&dcb->cb_lock); + bitmask_free(&dcb->memdata.bitmask); free(dcb); } @@ -1140,7 +1150,8 @@ dcb_close(DCB *dcb) /*< * Stop dcb's listening and modify state accordingly. */ - rc = poll_remove_dcb(dcb); + if (dcb->fd != -1) + rc = poll_remove_dcb(dcb); ss_dassert(dcb->state == DCB_STATE_NOPOLLING || dcb->state == DCB_STATE_ZOMBIE); @@ -1203,9 +1214,9 @@ printDCB(DCB *dcb) dcb->stats.n_buffered); printf("\t\tNo. of Accepts: %d\n", dcb->stats.n_accepts); - printf("\t\tNo. of High Water Events: %d\n", + printf("\t\tNo. of High Water Events: %d\n", dcb->stats.n_high_water); - printf("\t\tNo. of Low Water Events: %d\n", + printf("\t\tNo. of Low Water Events: %d\n", dcb->stats.n_low_water); } /** diff --git a/server/modules/protocol/mysql_backend.c b/server/modules/protocol/mysql_backend.c index 2772e8e7b..2c2939a40 100644 --- a/server/modules/protocol/mysql_backend.c +++ b/server/modules/protocol/mysql_backend.c @@ -785,6 +785,19 @@ static int gw_error_backend_event(DCB *dcb) */ if (dcb->state != DCB_STATE_POLLING) { + int error, len; + char buf[100]; + + len = sizeof(error); + if (getsockopt(dcb->fd, SOL_SOCKET, SO_ERROR, &error, &len) == 0) + { + strerror_r(error, buf, 100); + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "DCB in state %s got error '%s'.", + gw_dcb_state2string(dcb->state), + buf))); + } return 1; } errbuf = mysql_create_custom_error( @@ -811,6 +824,18 @@ static int gw_error_backend_event(DCB *dcb) if (ses_state != SESSION_STATE_ROUTER_READY) { + int error, len; + char buf[100]; + + len = sizeof(error); + if (getsockopt(dcb->fd, SOL_SOCKET, SO_ERROR, &error, &len) == 0) + { + strerror_r(error, buf, 100); + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "Error '%s' in session that is not ready for routing.", + buf))); + } gwbuf_free(errbuf); goto retblock; } @@ -989,6 +1014,19 @@ gw_backend_hangup(DCB *dcb) if (ses_state != SESSION_STATE_ROUTER_READY) { + int error, len; + char buf[100]; + + len = sizeof(error); + if (getsockopt(dcb->fd, SOL_SOCKET, SO_ERROR, &error, &len) == 0) + { + strerror_r(error, buf, 100); + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "Hangup in session that is not ready for routing, " + "Error reported is '%s'.", + buf))); + } gwbuf_free(errbuf); goto retblock; }