From 95203f2185cd289fb55eadd13ed17b9467b55947 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= Date: Wed, 23 Jan 2019 19:38:11 +0100 Subject: [PATCH] MINOR: peers: Move high level receive code to reduce the size of I/O handler. Implement a new function to read incoming stick-table messages. May be backported as far as 1.5. --- src/peers.c | 159 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 92 insertions(+), 67 deletions(-) diff --git a/src/peers.c b/src/peers.c index c9389e3480..1378852fc6 100644 --- a/src/peers.c +++ b/src/peers.c @@ -1249,6 +1249,92 @@ static inline int peer_treat_definemsg(struct appctx *appctx, struct peer *p, return 0; } +/* + * Receive a stick-table message. + * Returns 1 if there was no error, if not, returns 0 if not enough data were available, + * -1 if there was an error updating the appctx state st0 accordingly. + */ +static inline int peer_recv_msg(struct appctx *appctx, char *msg_head, size_t msg_head_sz, + uint32_t *msg_len, int *totl) +{ + int reql; + struct stream_interface *si = appctx->owner; + + reql = co_getblk(si_oc(si), msg_head, 2 * sizeof(char), *totl); + if (reql <= 0) /* closed or EOL not found */ + goto incomplete; + + *totl += reql; + + if ((unsigned int)msg_head[1] < 128) + return 1; + + /* Read and Decode message length */ + reql = co_getblk(si_oc(si), &msg_head[2], sizeof(char), *totl); + if (reql <= 0) /* closed */ + goto incomplete; + + *totl += reql; + + if ((unsigned int)msg_head[2] < 240) { + *msg_len = msg_head[2]; + } + else { + int i; + char *cur; + char *end; + + for (i = 3 ; i < msg_head_sz ; i++) { + reql = co_getblk(si_oc(si), &msg_head[i], sizeof(char), *totl); + if (reql <= 0) /* closed */ + goto incomplete; + + *totl += reql; + + if (!(msg_head[i] & 0x80)) + break; + } + + if (i == msg_head_sz) { + /* malformed message */ + appctx->st0 = PEER_SESS_ST_ERRPROTO; + return -1; + } + end = msg_head + msg_head_sz; + cur = &msg_head[2]; + *msg_len = intdecode(&cur, end); + if (!cur) { + /* malformed message */ + appctx->st0 = PEER_SESS_ST_ERRPROTO; + return -1; + } + } + + /* Read message content */ + if (*msg_len) { + if (*msg_len > trash.size) { + /* Status code is not success, abort */ + appctx->st0 = PEER_SESS_ST_ERRSIZE; + return -1; + } + + reql = co_getblk(si_oc(si), trash.area, *msg_len, *totl); + if (reql <= 0) /* closed */ + goto incomplete; + *totl += reql; + } + + return 1; + + incomplete: + if (reql < 0) { + /* there was an error */ + appctx->st0 = PEER_SESS_ST_END; + return -1; + } + + return 0; +} /* * IO Handler to handle message exchance with a peer */ @@ -1579,76 +1665,15 @@ switchstate: } } - reql = co_getblk(si_oc(si), (char *)msg_head, 2*sizeof(unsigned char), totl); - if (reql <= 0) /* closed or EOL not found */ + reql = peer_recv_msg(appctx, (char *)msg_head, sizeof msg_head, &msg_len, &totl); + if (reql <= 0) { + if (reql == -1) + goto switchstate; goto incomplete; - - totl += reql; - - if (msg_head[1] >= 128) { - /* Read and Decode message length */ - reql = co_getblk(si_oc(si), (char *)&msg_head[2], sizeof(unsigned char), totl); - if (reql <= 0) /* closed */ - goto incomplete; - - totl += reql; - - if (msg_head[2] < 240) { - msg_len = msg_head[2]; - } - else { - int i; - char *cur; - char *end; - - for (i = 3 ; i < sizeof(msg_head) ; i++) { - reql = co_getblk(si_oc(si), (char *)&msg_head[i], sizeof(char), totl); - if (reql <= 0) /* closed */ - goto incomplete; - - totl += reql; - - if (!(msg_head[i] & 0x80)) - break; - } - - if (i == sizeof(msg_head)) { - /* malformed message */ - appctx->st0 = PEER_SESS_ST_ERRPROTO; - goto switchstate; - - } - end = (char *)msg_head + sizeof(msg_head); - cur = (char *)&msg_head[2]; - msg_len = intdecode(&cur, end); - if (!cur) { - /* malformed message */ - appctx->st0 = PEER_SESS_ST_ERRPROTO; - goto switchstate; - } - } - - - /* Read message content */ - if (msg_len) { - if (msg_len > trash.size) { - /* Status code is not success, abort */ - appctx->st0 = PEER_SESS_ST_ERRSIZE; - goto switchstate; - } - - reql = co_getblk(si_oc(si), - trash.area, - msg_len, - totl); - if (reql <= 0) /* closed */ - goto incomplete; - totl += reql; - - msg_end += msg_len; - } } + msg_end += msg_len; + if (msg_head[0] == PEER_MSG_CLASS_CONTROL) { if (msg_head[1] == PEER_MSG_CTRL_RESYNCREQ) { struct shared_table *st; -- 2.39.5