From d90ea82aaaab5a41e71c9d176724b9e25f420724 Mon Sep 17 00:00:00 2001 From: counterpoint Date: Tue, 26 May 2015 16:31:52 +0100 Subject: [PATCH] Try different code, continue polling while not in use. --- server/core/dcb.c | 58 +++++++++++++++++++++----------------------- server/core/server.c | 2 +- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/server/core/dcb.c b/server/core/dcb.c index f95c776a2..ff2267c42 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -281,32 +281,17 @@ dcb_add_to_zombieslist(DCB *dcb) return; } - char *user; - user = session_getUser(dcb->session); - if (user && dcb->server) - { - dcb->user = strdup(user); - spinlock_acquire(&dcb->server->persistlock); - dcb->nextpersistent = dcb->server->persistent; - dcb->server->persistent = dcb; - spinlock_release(&dcb->server->persistlock); - atomic_add(&dcb->server->stats.n_persistent, 1); - } - - else - { - /*< - * Add closing dcb to the top of the list. - */ - dcb->memdata.next = zombies; - zombies = dcb; - /*< - * Set state which indicates that it has been added to zombies - * list. - */ - succp = dcb_set_state(dcb, DCB_STATE_ZOMBIE, &prev_state); - ss_info_dassert(succp, "Failed to set DCB_STATE_ZOMBIE"); - } + /*< + * Add closing dcb to the top of the list. + */ + dcb->memdata.next = zombies; + zombies = dcb; + /*< + * Set state which indicates that it has been added to zombies + * list. + */ + succp = dcb_set_state(dcb, DCB_STATE_ZOMBIE, &prev_state); + ss_info_dassert(succp, "Failed to set DCB_STATE_ZOMBIE"); spinlock_release(&zombiespin); } @@ -1300,7 +1285,20 @@ dcb_close(DCB *dcb) */ if (dcb->state == DCB_STATE_POLLING) { - rc = poll_remove_dcb(dcb); + char *user; + user = session_getUser(dcb->session); + if (user && dcb->server) + { + dcb->user = strdup(user); + spinlock_acquire(&dcb->server->persistlock); + dcb->nextpersistent = dcb->server->persistent; + dcb->server->persistent = dcb; + spinlock_release(&dcb->server->persistlock); + atomic_add(&dcb->server->stats.n_persistent, 1); + return; + } + + rc = poll_remove_dcb(dcb); if (rc == 0) { LOGIF(LD, (skygw_log_write( @@ -1358,7 +1356,7 @@ printDCB(DCB *dcb) printf("\tUsername to: %s\n", dcb->user); if (dcb->writeq) printf("\tQueued write data: %d\n",gwbuf_length(dcb->writeq)); - char *statusname = server_status(dcb->dcb_server_status); + char *statusname = server_status(dcb->server); if (statusname) { printf("\tServer status: %s\n", statusname); @@ -1450,7 +1448,7 @@ DCB *dcb; if (dcb->writeq) dcb_printf(pdcb, "\tQueued write data: %d\n", gwbuf_length(dcb->writeq)); - char *statusname = server_status(dcb->dcb_server_status); + char *statusname = server_status(dcb->server); if (statusname) { dcb_printf(pdcb, "\tServer status: %s\n", statusname); @@ -1565,7 +1563,7 @@ dprintDCB(DCB *pdcb, DCB *dcb) dcb_printf(pdcb, "\tQueued write data: %d\n", gwbuf_length(dcb->writeq)); if (dcb->delayq) dcb_printf(pdcb, "\tDelayed write data: %d\n", gwbuf_length(dcb->delayq)); - char *statusname = server_status(dcb->dcb_server_status); + char *statusname = server_status(dcb->server); if (statusname) { dcb_printf(pdcb, "\tServer status: %s\n", statusname); diff --git a/server/core/server.c b/server/core/server.c index 9577efc3e..fffa12b1e 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -547,7 +547,7 @@ server_status(SERVER *server) { char *status = NULL; - if ((status = (char *)malloc(256)) == NULL) + if (NULL == server || (status = (char *)malloc(256)) == NULL) return NULL; status[0] = 0; if (server->status & SERVER_MAINT)