call trace
以插入一条新的路由为例。
1 | > fib_insert_node |
###trie_rebalance
1 | for_each_node(from current node tn to fib_trie root) |
1 | 986 static void trie_rebalance(struct trie *t, struct tnode *tn) |
rebalance的核心resize函数
inflate和halve
rebalancede核心是resize函数。在该函数里有两种操作inflate和halve,他们是两种相反的操作。
inflate是将当前节点的孩子指针数组的元素个数增加一倍, 同时将尽量将各个子孩子的孩子,直接挂接到新的孩子指针数组上。
最终达到减少树的深度。所以要像执行inflate操作,孙子节点必须足够多。halve将当前节点的孩子指针数组的元素个数减半。
如果第2i和2i+1个孩子都为空,则压缩后的第i个孩子也为空,
如果第2i和2i+1个孩子只有一个为空,则将不非空的孩子作为压缩后的第i个孩子。
如果第2i和2i+1个孩子都不为空,则插入一个新的中间节点。并将第2i和2i+1个孩子分别作为新的中间节点的左右(第0和第1个)孩子。
inflate和halve的执行条件
英文注释说的很清楚了。见下文的翻译。
resize
1 | 523 |
tnode_put_child_reorg
英文注释说的很清楚了,主要有两个工作:
- 更新父节点
tn的full_children和empty_children的统计值。 - 设置
tn节点的第i个子孩子为n。
1 | /* |