实现Chord代码方法
在前面的分析中,漏掉了对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个变量的构造函数进行分析。1succ_list:主要是初始化了一些变量,最后调用locationtable的pin方法2次,目前还是没有明白这个pin是干嘛的,等明白之后应该在详细说明。2pred_list:所做的事情与前面succ_list类似,最后也是用到了pin。只是pred_list的里给pin的参数是负数,猜测可能就是相对于当前节点,正数部分是后继节点,负数部分是前驱节点。3 stabilize_manager:主要也是对类成员的初始化,具体这些成员的用途待用到的时候再进行分析。该类主要是用于稳定方便的管理。在初始化了3个变量之后,调用register_client分别注册了后继和前驱,并增加了vnode数量,然后通过addHandler增加一个处理函数vnode_impl::dispatch。最后就是一些变量的初始化操作。
在vnode_impl初始化完成之后,又调用了finger_table的构造函数来初始化fingers_成员。
本文地址:http://www.45fan.com/bcdm/70671.html