分析Chord代码介绍
最近在研究Chord算法,需要看看其具体实现,所以就把自己看代码的见解写在这里,一来便于查阅,二来可以得到大家的指正,欢迎讨论
mail:hudaiqian@gmail.com yahoo:hudaiqian@yahoo.com.cn
这是今天完成的第一部分代码的阅读小结,欢迎多指教。
本人所用的代码为包含在SFSNet里的部分,目录为SFSNet/chord,里面包括了chord算法的主要实现。当然,如果要完全看懂代码,尤其是关于里面用到的很多refcounted,list等等,那么必须下载另外一份代码----sfslite2,这里面包括了sfsnet要用到的一些常用函数,具体说明见http://www.okws.org/doku.php?id=sfs:libasync
目前我是从sfsnet里面的一个关于location service daemon,简称为lsd程序,在sfsnet的lsd目录下,它初始化Chord和dhash层,并接受其他客户端的请求。这个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.h。chord初始化的参数包括主机名,端口,modes[mode].producer是用的哪种路由算法,这里为chord,vnodes为虚拟节点的数量,max_loccache为最大缓存位置(?这里还有待考证)
接下来就是chord类的初始化函数,在chord_client.c里面。
首先也是对于配置情况的解释,包括最大virtual node,chord的rpc方式(有tcp和udp2种方式)。之后,根据rpc方式,初始化了一个rpc manager。然后分别初始化了一个tcp和udp的套结字,之后这句locations = New refcounted<locationtable> (max_cache);应该是一个满重要的部分,他针对每个chord node新建了一个locationtable类的locations变量,初步认为是用于定位的算法,因为关于insert,lookup等都是在该类实现。
最后,是一个for循环,循环的计数是vnode的数量,应该是创建每个chord node的finger table的项,即vnode。在循环里,首先根据ip和端口生成了hash id。然后,再通过前面locations变量将新建的vnode插入到finger table里面。通过locationtable的pin方法将新的vnode加入到pin list里。最后,在新建一个vnode节点,将其加入到vnode hash表里。
本文地址:http://www.45fan.com/bcdm/70473.html