Chord实现代码分析(一)

来源:互联网 发布:淘宝到家入驻收费 编辑:程序博客网 时间:2024/05/04 15:51

最近工作需要研究chord代码实现,干脆就把我的理解发到blog上,希望大家能指教错误和不足之处! 

本人所用的代码为包含在SFSNet里的部分,目录为SFSNet/chord,里面包括了chord算法的主要实现。当然,如果要完全看懂代码,尤其是关于里面用到的很多refcountedlist等等,那么必须下载另外一份代码----sfslite2,这里面包括了sfsnet要用到的一些常用函数,具体说明见http://www.okws.org/doku.php?id=sfs:libasync
目前我是从sfsnet里面的一个关于location service daemon,简称为lsd程序,在sfsnetlsd目录下,它初始化Chorddhash层,并接受其他客户端的请求。这个lsd算是chord实际应用的一个完整流程,顺着它的运行路线,我想可以研究好Chord算法的实现。
Lsd程序启动是在lsd.C文件里的main函数,程序的开始进行的是对命令行参数的解析,具体可以看代码,这部分对于我们的研究不是很主要,可以快速略过。最后在快要结束的时候,程序进入了最关键的地方,代码如下:
chordnode = New refcounted<chord> (my_name,
                                 myport,
                                 modes[mode].producer,
                                 vnodes,
                     max_loccache);
这里应该是初始化了一个Chord节点,其中的chord是在chord.h文件中定义的chord类,refcounted应该是类似于智能指针一类的东东,具体实现在refcnt.hchord初始化的参数包括主机名,端口,modes[mode].producer是用的哪种路由算法,这里为chordvnodes为虚拟节点的数量,max_loccache为最大缓存位置(?这里还有待考证)
接下来就是chord类的初始化函数,在chord_client.c里面。
首先也是对于配置情况的解释,包括最大virtual nodechordrpc方式(有tcpudp2种方式)。之后,根据rpc方式,初始化了一个rpc manager。然后分别初始化了一个tcpudp的套结字,之后这句locations = New refcounted<locationtable> (max_cache);应该是一个满重要的部分,他针对每个chord node新建了一个locationtable类的locations变量,初步认为是用于定位的算法,因为关于insert,lookup等都是在该类实现。
最后,是一个for循环,循环的计数是vnode的数量,应该是创建每个chord nodefinger table的项,即vnode。在循环里,首先根据ip和端口生成了hash id。然后,再通过前面locations变量将新建的vnode插入到finger table里面。通过locationtablepin方法将新的vnode加入到pin list里。最后,在新建一个vnode节点,将其加入到vnodehash表里。