flow-manager: fix off-by-one in flow_hash row allocation

The current code doesn't cover all rows when more than one flow manager is
used. It leaves a single row between ftd->max and ftd->min of the next
manager orphaned. As an example:

    hash_size=1000
    flowmgr_number=3
    range=333

    instance  ftd->min  ftd->max
    0         0         333
    1         334       666
    2         667       1000

    Rows not covered: 333, 666
pull/7187/head
Arne Welzel 3 years ago committed by Victor Julien
parent 9537d119b9
commit 8ef066318d

@ -667,14 +667,13 @@ static TmEcode FlowManagerThreadInit(ThreadVars *t, const void *initdata, void *
/* set the min and max value used for hash row walking
* each thread has it's own section of the flow hash */
uint32_t range = flow_config.hash_size / flowmgr_number;
if (ftd->instance == 0)
ftd->max = range;
else if ((ftd->instance + 1) == flowmgr_number) {
ftd->min = (range * ftd->instance) + 1;
ftd->min = ftd->instance * range;
ftd->max = (ftd->instance + 1) * range;
/* last flow-manager takes on hash_size % flowmgr_number extra rows */
if ((ftd->instance + 1) == flowmgr_number) {
ftd->max = flow_config.hash_size;
} else {
ftd->min = (range * ftd->instance) + 1;
ftd->max = (range * (ftd->instance + 1));
}
BUG_ON(ftd->min > flow_config.hash_size || ftd->max > flow_config.hash_size);

Loading…
Cancel
Save