在前面的分析中,漏掉了对
chord
初始化的时候是第三个参数的分析,难怪觉得似乎少了些东西。对于
chord
,第三个参数是一个函数指针
----
fingerroute::produce_vnode
(对此的描述是
use fingers and successors
)原来此方法是用于构建
fingertable
的,对于
chord
算法来说是相当关键的一部分。现在深入该函数进行分析,看看
chord
是如何初始化
fingertable
的。
调用该方法是在
chord
构造函数最后的那个循环里,通过调用函数返回了一个
vnode
。然后我们看到
fingerroute::produce_vnode
只有一句话,返回一个
fingerroute
的类指针,但是函数要求是返回
ref<vnode>
,而
fingerroute
也是被
refcounted
修饰的,因此这
2
者之间可以转化,但是怎么转化还没明白,如果后面需要在去做研究,先着重主要部分,除非遇到瓶颈了。回到代码,现在流程进入到
fingerroute
的构造函数里面,
fingerroute
继承于
vnode_impl
,所以在
fingerroute
的初始化列表里首先调用了
vnode_impl
的构造函数。
vnode_impl
的构造函数里,首先初始化了
3
个变量(
successors
,
predecessors
,
stabilizer
)。在依次对这
3
个变量的构造函数进行分析。
1
succ_list
:主要是初始化了一些变量,最后调用
locationtable
的
pin
方法
2
次,目前还是没有明白这个
pin
是干嘛的,等明白之后应该在详细说明。
2
pred_list
:所做的事情与前面
succ_list
类似,最后也是用到了
pin
。只是
pred_list
的里给
pin
的参数是负数,猜测可能就是相对于当前节点,正数部分是后继节点,负数部分是前驱节点。
3
stabilize_manager
:主要也是对类成员的初始化,具体这些成员的用途待用到的时候再进行分析。该类主要是用于稳定方便的管理。在初始化了
3
个变量之后,调用
register_client
分别注册了后继和前驱,并增加了
vnode
数量,然后通过
addHandler
增加一个处理函数
vnode_impl::dispatch
。最后就是一些变量的初始化操作。
在
vnode_impl
初始化完成之后,又调用了
finger_table
的构造函数来初始化
fingers_
成员。