mirror of
https://github.com/haproxy/haproxy.git
synced 2026-04-29 18:18:59 -04:00
MINOR: peers: send code factorization.
Implements peer_send_*msg() functions for switch and ack messages which call the already defined peer_prepare_*msg() before calling ci_putblk(). These two new functions are used at three places in the peer_io_handler(). May be backported as far as 1.5.
This commit is contained in:
parent
a8725ec372
commit
ec44ea8692
1 changed files with 72 additions and 81 deletions
153
src/peers.c
153
src/peers.c
|
|
@ -590,6 +590,64 @@ static inline int peer_getline(struct appctx *appctx)
|
|||
return n;
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a message after having called <peer_prepare_msg> to build it.
|
||||
* Return 0 if the message could not be built modifying the appcxt st0 to PEER_SESS_ST_END value.
|
||||
* Returns -1 if there was not enough room left to send the message,
|
||||
* any other negative returned value must be considered as an error with an appcxt st0
|
||||
* returned value equal to PEER_SESS_ST_END.
|
||||
*/
|
||||
static inline int peer_send_msg(struct shared_table *st, struct appctx *appctx,
|
||||
int (*peer_prepare_msg)(struct shared_table *, char *, size_t))
|
||||
{
|
||||
int ret, msglen;
|
||||
struct stream_interface *si = appctx->owner;
|
||||
|
||||
msglen = peer_prepare_msg(st, trash.area, trash.size);
|
||||
if (!msglen) {
|
||||
/* internal error: message does not fit in trash */
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* message to buffer */
|
||||
ret = ci_putblk(si_ic(si), trash.area, msglen);
|
||||
if (ret <= 0) {
|
||||
if (ret == -1) {
|
||||
/* No more write possible */
|
||||
si_rx_room_blk(si);
|
||||
return -1;
|
||||
}
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a stick-table switch message.
|
||||
* Return 0 if the message could not be built modifying the appcxt st0 to PEER_SESS_ST_END value.
|
||||
* Returns -1 if there was not enough room left to send the message,
|
||||
* any other negative returned value must be considered as an error with an appcxt st0
|
||||
* returned value equal to PEER_SESS_ST_END.
|
||||
*/
|
||||
static inline int peer_send_switchmsg(struct shared_table *st, struct appctx *appctx)
|
||||
{
|
||||
return peer_send_msg(st, appctx, peer_prepare_switchmsg);
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a stick-table update acknowledgement message.
|
||||
* Return 0 if the message could not be built modifying the appcxt st0 to PEER_SESS_ST_END value.
|
||||
* Returns -1 if there was not enough room left to send the message,
|
||||
* any other negative returned value must be considered as an error with an appcxt st0
|
||||
* returned value equal to PEER_SESS_ST_END.
|
||||
*/
|
||||
static inline int peer_send_ackmsg(struct shared_table *st, struct appctx *appctx)
|
||||
{
|
||||
return peer_send_msg(st, appctx, peer_prepare_ackmsg);
|
||||
}
|
||||
|
||||
/*
|
||||
* IO Handler to handle message exchance with a peer
|
||||
*/
|
||||
|
|
@ -1440,27 +1498,10 @@ incomplete:
|
|||
|
||||
/* It remains some updates to ack */
|
||||
if (st->last_get != st->last_acked) {
|
||||
int msglen;
|
||||
|
||||
msglen = peer_prepare_ackmsg(st,
|
||||
trash.area,
|
||||
trash.size);
|
||||
if (!msglen) {
|
||||
/* internal error: message does not fit in trash */
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
goto switchstate;
|
||||
}
|
||||
|
||||
/* message to buffer */
|
||||
repl = ci_putblk(si_ic(si),
|
||||
trash.area,
|
||||
msglen);
|
||||
repl = peer_send_ackmsg(st, appctx);
|
||||
if (repl <= 0) {
|
||||
/* no more write possible */
|
||||
if (repl == -1) {
|
||||
goto full;
|
||||
}
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
if (repl == -1)
|
||||
goto out;
|
||||
goto switchstate;
|
||||
}
|
||||
st->last_acked = st->last_get;
|
||||
|
|
@ -1474,29 +1515,11 @@ incomplete:
|
|||
int new_pushed;
|
||||
|
||||
if (st != curpeer->last_local_table) {
|
||||
int msglen;
|
||||
|
||||
msglen = peer_prepare_switchmsg(st,
|
||||
trash.area,
|
||||
trash.size);
|
||||
if (!msglen) {
|
||||
HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock);
|
||||
/* internal error: message does not fit in trash */
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
goto switchstate;
|
||||
}
|
||||
|
||||
/* message to buffer */
|
||||
repl = ci_putblk(si_ic(si),
|
||||
trash.area,
|
||||
msglen);
|
||||
repl = peer_send_switchmsg(st, appctx);
|
||||
if (repl <= 0) {
|
||||
HA_SPIN_UNLOCK(STK_TABLE_LOCK, &st->table->lock);
|
||||
/* no more write possible */
|
||||
if (repl == -1) {
|
||||
goto full;
|
||||
}
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
if (repl == -1)
|
||||
goto out;
|
||||
goto switchstate;
|
||||
}
|
||||
curpeer->last_local_table = st;
|
||||
|
|
@ -1576,29 +1599,13 @@ incomplete:
|
|||
int new_pushed;
|
||||
|
||||
if (st != curpeer->last_local_table) {
|
||||
int msglen;
|
||||
|
||||
msglen = peer_prepare_switchmsg(st,
|
||||
trash.area,
|
||||
trash.size);
|
||||
if (!msglen) {
|
||||
/* internal error: message does not fit in trash */
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
goto switchstate;
|
||||
}
|
||||
|
||||
/* message to buffer */
|
||||
repl = ci_putblk(si_ic(si),
|
||||
trash.area,
|
||||
msglen);
|
||||
repl = peer_send_switchmsg(st, appctx);
|
||||
if (repl <= 0) {
|
||||
/* no more write possible */
|
||||
if (repl == -1) {
|
||||
goto full;
|
||||
}
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
if (repl == -1)
|
||||
goto out;
|
||||
goto switchstate;
|
||||
}
|
||||
|
||||
curpeer->last_local_table = st;
|
||||
}
|
||||
|
||||
|
|
@ -1670,29 +1677,13 @@ incomplete:
|
|||
int new_pushed;
|
||||
|
||||
if (st != curpeer->last_local_table) {
|
||||
int msglen;
|
||||
|
||||
msglen = peer_prepare_switchmsg(st,
|
||||
trash.area,
|
||||
trash.size);
|
||||
if (!msglen) {
|
||||
/* internal error: message does not fit in trash */
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
goto switchstate;
|
||||
}
|
||||
|
||||
/* message to buffer */
|
||||
repl = ci_putblk(si_ic(si),
|
||||
trash.area,
|
||||
msglen);
|
||||
repl = peer_send_switchmsg(st, appctx);
|
||||
if (repl <= 0) {
|
||||
/* no more write possible */
|
||||
if (repl == -1) {
|
||||
goto full;
|
||||
}
|
||||
appctx->st0 = PEER_SESS_ST_END;
|
||||
if (repl == -1)
|
||||
goto out;
|
||||
goto switchstate;
|
||||
}
|
||||
|
||||
curpeer->last_local_table = st;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue