MINOR: ebtree: update the eb32sc parent node's scope on delete

During a delete operation, if the deleted node is above its leaf's
parent, this parent will replace the node and then go up. In this
case it is important to update the new parent's scope to reflect
the presence of other branches.

It's worth noting that in theory we should precisely recompute the
exact node value, but it seems that it's not worth it for the rare
cases there is a mismatch.
This commit is contained in:
Willy Tarreau 2017-11-05 18:06:22 +01:00
parent 5d19fd479a
commit ef8d0dcefd

View File

@ -370,12 +370,14 @@ void eb32sc_delete(struct eb32sc_node *eb32)
/* From now on, <node> and <parent> are necessarily different, and the /* From now on, <node> and <parent> are necessarily different, and the
* <node>'s node part is in use. By definition, <parent> is at least * <node>'s node part is in use. By definition, <parent> is at least
* below <node>, so keeping its key for the bit string is OK. * below <node>, so keeping its key for the bit string is OK. However
* its scope must be enlarged to cover the new branch it absorbs.
*/ */
parent->node_p = node->node_p; parent->node_p = node->node_p;
parent->branches = node->branches; parent->branches = node->branches;
parent->bit = node->bit; parent->bit = node->bit;
container_of(parent, struct eb32sc_node, node)->node_s |= eb32->node_s;
/* We must now update the new node's parent... */ /* We must now update the new node's parent... */
gpside = eb_gettag(parent->node_p); gpside = eb_gettag(parent->node_p);