Hi Tim, On Tue, Jun 26, 2018 at 03:57:29PM +0200, Tim Duesterhus wrote: > diff --git a/src/stick_table.c b/src/stick_table.c > index 42946545..8e16830d 100644 > --- a/src/stick_table.c > +++ b/src/stick_table.c > @@ -1596,8 +1596,10 @@ static int sample_conv_table_trackers(const struct arg > *arg_p, struct sample *sm > smp->data.type = SMP_T_SINT; > smp->data.u.sint = 0; > > - if (ts) > - smp->data.u.sint = ts->ref_cnt; > + if (!ts) > + return 1; > + > + smp->data.u.sint = ts->ref_cnt; > > stktable_release(t, ts); > return 1;
Well, I don't understand, this does exactly the same as the current patch (except that your version is not thread safe), given that right now it does this : /* Just decrease the ref_cnt of the current session */ void stktable_release(struct stktable *t, struct stksess *ts) { HA_SPIN_LOCK(STK_TABLE_LOCK, &t->lock); ts->ref_cnt--; HA_SPIN_UNLOCK(STK_TABLE_LOCK, &t->lock); } ... smp->data.type = SMP_T_BOOL; smp->data.u.sint = !!ts; smp->flags = SMP_F_VOL_TEST; if (ts) stktable_release(t, ts); ... So that's in fact : smp->data.type = SMP_T_BOOL; smp->data.u.sint = !!ts; smp->flags = SMP_F_VOL_TEST; if (ts) { HA_SPIN_LOCK(STK_TABLE_LOCK, &t->lock); ts->ref_cnt--; HA_SPIN_UNLOCK(STK_TABLE_LOCK, &t->lock); } Thus, if ts is NULL, we do return immediately with value zero, and if it's not NULL, we properly decrement the refcount. Given that your patch is applied on top of the unfixed version, I suspect that you did a manipulation error and that you tested only this unfixed version instead. Could you please double-check ? Thanks, Willy