部分MDS代码流程分析
start from init_mlt_rwlock();
1.初始化mlt表的读写锁。
2.初始化互斥锁Priorty_lock,使rpc线程优先于main函数的thread。
2.5调用init_migrate_ls()函数,将Migrate_ls.state置为1(修改的时候加上互斥锁)
3.得到本地的MDS的id,得到主MDS的id(通过调用conf_get_num()函数)
4.创建添加mds的新线程,线程入口地址是newmdsadd_prc()函数。(ps:如果rpc调用已经存在则无动作,否则是第一次加入mfs,因此创建新线程)
5.摧毁优先锁Priorty_lock(代码中连续两行,
pthread_mutex_lock(&Priorty_lock);
pthread_mutex_unlock(&Priorty_lock);
中间没有语句,没做任何修改,不知道时候我的源码有误?
)
6.对线程初始化,分配空间
7.设置以分离状态启动线程。
8.如果当前id和主id相同,创建新线程,线程入口地址指向setup_kernel_mlt()函数。
9.setup_kernel_mlt函数以读写方式打开getmlt 文件。然后把cmd值,初始为1(表示是生成的主的MDS) 写入getmlt文件。(getmlt文件里到底是什么内容?/proc/fs/spnfs/getmlt) 该函数实际上就是往getmlt文件里写入“1”。
10.调用gen_mlt().生成mlt表?。rrdserver是用来监控负载的服务器。
11.gen_mlt()函数调用mlt_init()对mlt表进行初始化(每台MDS都对应一个mlt表,该函数的作用就是把mlt表的内容都读出来,生成另一个mlt表?如果是第一个MDS,自己生成?)。读出,MLT表的位置,MDS的版本号,数量,然后将加入
MDS监控负载的服务器地址,以及DS上对应在的MDS的ip都分别对应上去,修改。将数据弄完之后,调用
mlt_init(master_id);(mds_state==1的时候表示是主mds)
调用dispatch_dir(dirstr,n%MLT_BUCKET_COUNT)函数,这个函数主要是对Directory进行操作。
12.创建线程,ping_all_tid.这里应该就是我们搭系统的时候一直看到的主MDS一直再ping的样子。
13.当前ID不是主ID的时候。首先调用get_master_ip()函数得到主ID.
14.调用newmdsadd_prog_rpc(master_ip,add_type)。(此函数未找到函数体)
15.如果线程master_ping_test_thread不存在,则创建该线程,入口地址从sub_ping_test_thread()开始执行。
16.调用spnfs_msg_handler(struct spnfs_client *scp, struct spnfs_msg *im)
该函数迎来获取msg的信息,主要是哪种请求操作,是spnfsd_layoutgetget(),spnfsd_layoutcommit(),return
getdeviceiter,getdeviceinfo,move ,setattr,open,close.....etc.
17.调用spnfscb(int fd, short which, void *data) 。这个看不太懂。(程序结构很混乱)
18.mydaemon(int nochdir, int noclose)在父进程和子进程之间创建一个管道文件,当子进程撤销或者往管道里写入“1”的时候,父进程结束等待,否则,父进程将一直等待。
19.release_parent()撤销父进程。
20.read_config()这个函数对应着读取config文件,内容包括条带大小,条带密度,管道文件的目录,等信息。还包括,读取DS的IP地址,端口号,路径DS挂载的目录,保存到DataServers
21.dump_config().输出上面的函数读到的信息,如,Verbosity,条带尺寸,密度,DS数目,,,,
22.do_mounts()。主要做一些挂载的操作。先创建文件 对应 mkdir -p [挂载目录]
mount -t nfs4 192.168.1.27:/ /spnfs/192.168.1.27/ 实现这些操作。
23.Send_invalid_msd(int signum) 读取pipe文件,由pipefspath给出路径,检测是否可以正常读出,atomicio(write, fd, &im, sizeof(im))这个函数上面也出现过,不是太懂,找不到函数原型。