From 4a0925f33deaacb48ad57fa4800dbf31fdbc5248 Mon Sep 17 00:00:00 2001 From: counterpoint Date: Sat, 18 Jul 2015 16:21:29 +0100 Subject: [PATCH 1/3] Correct mistake in dcb_read; use larger integer to accomodate three byte length in modutil. --- server/core/dcb.c | 2 +- server/core/modutil.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/core/dcb.c b/server/core/dcb.c index 46e0b1555..9cf3c77df 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -831,7 +831,7 @@ int dcb_read( dcb->last_read = hkheartbeat; bufsize = MIN(bytesavailable, MAX_BUFFER_SIZE); - if (maxbytes) bufsize = MIN(bufsize, maxbytes); + if (maxbytes) bufsize = MIN(bufsize, maxbytes-nreadtotal); if ((buffer = gwbuf_alloc(bufsize)) == NULL) { diff --git a/server/core/modutil.c b/server/core/modutil.c index 6fa7b3c8b..860f93cc9 100644 --- a/server/core/modutil.c +++ b/server/core/modutil.c @@ -540,7 +540,7 @@ GWBUF* modutil_get_complete_packets(GWBUF** p_readbuf) { GWBUF *buff = NULL, *packet; uint8_t *ptr; - int len,blen,total = 0; + uint32_t len,blen,total = 0; if(p_readbuf == NULL || (*p_readbuf) == NULL || gwbuf_length(*p_readbuf) < 3) From bb1f26eda50c0b936ad418f404217ad59983ff42 Mon Sep 17 00:00:00 2001 From: Martin Brampton Date: Sun, 19 Jul 2015 16:48:24 +0100 Subject: [PATCH 2/3] Fixes for maintainability of dcb.c; error in persistent connections. --- server/core/dcb.c | 29 +++++++++++++------------- server/modules/protocol/mysql_client.c | 4 +++- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/server/core/dcb.c b/server/core/dcb.c index 9cf3c77df..d23a5d947 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -1152,8 +1152,12 @@ int below_water; if (w < 0) { dcb_log_write_failure(dcb, queue, errno); + /*< + * What wasn't successfully written is stored to write queue + * for suspended write. + */ atomic_add(&dcb->writeqlen, gwbuf_length(queue)); - dcb->writeq = queue; + dcb->writeq = queue; dcb->stats.n_buffered++; spinlock_release(&dcb->writeqlock); return 0; @@ -1173,11 +1177,6 @@ int below_water; STRDCBSTATE(dcb->state), dcb->fd))); } /*< while (queue != NULL) */ - /*< - * What wasn't successfully written is stored to write queue - * for suspended write. - */ - dcb->writeq = queue; } /* if (dcb->writeq) */ @@ -1188,11 +1187,10 @@ int below_water; #if defined(FAKE_CODE) /** - * Check the parameters for dcb_write + * Fake code for dcb_write + * (Should have fuller description) * * @param dcb The DCB of the client - * @param queue Queue of buffers to write - * @return true if parameters acceptable, false otherwise */ static inline void dcb_write_fake_code(DCB *dcb) @@ -1227,17 +1225,18 @@ dcb_write_fake_code(DCB *dcb) static inline bool dcb_write_parameter_check(DCB *dcb, GWBUF *queue) { + if (queue == NULL) return false; + if (dcb->fd <= 0) { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, "Error : Write failed, dcb is %s.", dcb->fd == DCBFD_CLOSED ? "closed" : "cloned, not writable"))); - return false; + gwbuf_free(queue); + return false; } - if (queue == NULL) return false; - if (dcb->session == NULL || dcb->session->state != SESSION_STATE_STOPPING) { /** @@ -1265,7 +1264,7 @@ dcb_write_parameter_check(DCB *dcb, GWBUF *queue) dcb, STRDCBSTATE(dcb->state), dcb->fd))); - //ss_dassert(false); + gwbuf_free(queue); return false; } } @@ -1309,7 +1308,7 @@ dcb_write_when_already_queued(DCB *dcb, GWBUF *queue) * * @param dcb The DCB of the client * @param queue Queue of buffers to write - * @return 0 on failure, 1 on success + * @param eno Error number for logging */ static void dcb_log_write_failure(DCB *dcb, GWBUF *queue, int eno) @@ -1385,7 +1384,7 @@ dcb_log_write_failure(DCB *dcb, GWBUF *queue, int eno) } /** - * Handle writing when there is already queued data + * Last few things to do at end of a write * * @param dcb The DCB of the client * @param below_water A boolean diff --git a/server/modules/protocol/mysql_client.c b/server/modules/protocol/mysql_client.c index 9046c503d..e5fa7fbc7 100644 --- a/server/modules/protocol/mysql_client.c +++ b/server/modules/protocol/mysql_client.c @@ -1115,7 +1115,9 @@ int gw_read_client_event( * send redundant COM_QUIT. */ /* Temporarily suppressed: SESSION_ROUTE_QUERY(session, read_buffer); */ - /** + /* Replaced with freeing the read buffer. */ + gwbuf_free(read_buffer); + /** * Close router session which causes closing of backends. */ dcb_close(dcb); From edd2688e71c67fdb319919afed249cfc82d497a2 Mon Sep 17 00:00:00 2001 From: Martin Brampton Date: Sun, 19 Jul 2015 16:54:13 +0100 Subject: [PATCH 3/3] Fix memory leak in MySQL monitor. --- server/modules/monitor/mysql_mon.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/modules/monitor/mysql_mon.c b/server/modules/monitor/mysql_mon.c index a37526bb5..e31f2d57a 100644 --- a/server/modules/monitor/mysql_mon.c +++ b/server/modules/monitor/mysql_mon.c @@ -310,7 +310,7 @@ static inline bool connect_to_db(MONITOR* mon,MONITOR_SERVERS *database) mysql_options(database->con, MYSQL_OPT_READ_TIMEOUT, (void *)&read_timeout); mysql_options(database->con, MYSQL_OPT_WRITE_TIMEOUT, (void *)&write_timeout); - return (mysql_real_connect(database->con, + bool result = (mysql_real_connect(database->con, database->server->name, uname, dpwd, @@ -318,6 +318,8 @@ static inline bool connect_to_db(MONITOR* mon,MONITOR_SERVERS *database) database->server->port, NULL, 0) != NULL); + free(dpwd); + return result; } static inline void monitor_mysql100_db(MONITOR_SERVERS* database)