MINOR: applet: define applet_putchk_stress() alternative

Previous patch introduced stress mode to be able to easily test
alternative code paths.

The first point would be to force interruption of stats dump on every
line and check reentrant patchs, in particular while adding and removing
servers instances.

The purpose of this patch is to be able to use applet_putchk_stress()
during stats dump while not impacting other applets. To support this,
extract applet_putchk() into an internal _applet_putchk() which have a
new argument stress. Define two helpers applet_putchk() and
applet_putchk_stress(), the latter to set the stress argument to true.

For the moment, applet_putchk_stress() is not used. This will be the
subject of the next patch.
This commit is contained in:
Amaury Denoyelle 2024-11-07 17:15:15 +01:00
parent 9d19fc4cf7
commit 1f458b3ea8

View File

@ -279,16 +279,16 @@ static inline void applet_expect_data(struct appctx *appctx)
se_fl_clr(appctx->sedesc, SE_FL_EXP_NO_DATA); se_fl_clr(appctx->sedesc, SE_FL_EXP_NO_DATA);
} }
/* writes chunk <chunk> into the input channel of the stream attached to this /* Should only be used via wrappers applet_putchk() / applet_putchk_stress(). */
* appctx's endpoint, and marks the SC_FL_NEED_ROOM on a channel full error. static inline int _applet_putchk(struct appctx *appctx, struct buffer *chunk,
* See ci_putchk() for the list of return codes. int stress)
*/
static inline int applet_putchk(struct appctx *appctx, struct buffer *chunk)
{ {
int ret; int ret;
if (appctx->flags & APPCTX_FL_INOUT_BUFS) { if (appctx->flags & APPCTX_FL_INOUT_BUFS) {
if (b_data(chunk) > b_room(&appctx->outbuf)) { if (unlikely(stress) ?
b_data(&appctx->outbuf) :
b_data(chunk) > b_room(&appctx->outbuf)) {
applet_fl_set(appctx, APPCTX_FL_OUTBLK_FULL); applet_fl_set(appctx, APPCTX_FL_OUTBLK_FULL);
ret = -1; ret = -1;
} }
@ -300,8 +300,8 @@ static inline int applet_putchk(struct appctx *appctx, struct buffer *chunk)
else { else {
struct sedesc *se = appctx->sedesc; struct sedesc *se = appctx->sedesc;
ret = ci_putchk(sc_ic(se->sc), chunk); if ((unlikely(stress) && ci_data(sc_ic(se->sc))) ||
if (ret < 0) { (ret = ci_putchk(sc_ic(se->sc), chunk)) < 0) {
/* XXX: Handle all errors as a lack of space because callers /* XXX: Handle all errors as a lack of space because callers
* don't handles other cases for now. So applets must be * don't handles other cases for now. So applets must be
* careful to handles shutdown (-2) and invalid calls (-3) by * careful to handles shutdown (-2) and invalid calls (-3) by
@ -311,9 +311,25 @@ static inline int applet_putchk(struct appctx *appctx, struct buffer *chunk)
ret = -1; ret = -1;
} }
} }
return ret; return ret;
} }
/* writes chunk <chunk> into the input channel of the stream attached to this
* appctx's endpoint, and marks the SC_FL_NEED_ROOM on a channel full error.
* See ci_putchk() for the list of return codes.
*/
static inline int applet_putchk(struct appctx *appctx, struct buffer *chunk)
{
return _applet_putchk(appctx, chunk, 0);
}
/* Equivalent of applet_putchk() but with stress condition alternatives activated. */
static inline int applet_putchk_stress(struct appctx *appctx, struct buffer *chunk)
{
return _applet_putchk(appctx, chunk, 1);
}
/* writes <len> chars from <blk> into the input channel of the stream attached /* writes <len> chars from <blk> into the input channel of the stream attached
* to this appctx's endpoint, and marks the SC_FL_NEED_ROOM on a channel full * to this appctx's endpoint, and marks the SC_FL_NEED_ROOM on a channel full
* error. See ci_putblk() for the list of return codes. * error. See ci_putblk() for the list of return codes.