流程(待补充)

start from init_mlt_rwlock();

1.初始化mlt表的读写锁。函数体调pthread_rwlock_init(&mlt.mlt_lock,NULL)该函数为C库提供.初始化该锁之后,后面可以加互斥锁修改mlt表的值。

2.初始化互斥锁Priorty_lock,调用pthread_mutex_init(&Priorty_lock,NULL)使rpc线程优先于main函数的thread。

3调用init_migrate_ls()函数,初试化migrate表,将Migrate_ls.state置为1(修改的时候加上互斥锁)

4 设置conf_path的值为”/etc/mlt.conf”应该是mlt表的文件路径。

5 调用conf_init()初始化所有的conf_binding结构体。conf_binding结构体定义如下:

struct conf_binding {

  LIST_ENTRY (conf_binding) link;// 里面存放的有很多的目录,以链表的形式存放

  char *section;  //[MDS]   [RRDSERVER]

  char *tag;  // version,NumMDS,MDS1_IP

  char *value; //  192.168.   或者是1.2.3.4

  int is_default;   //这个字段是什么意思?

};

5.1调用LIST_INIT (&conf_bindings[i]);将conf_binding结构体定义的link链表,也就是存放目录的链表初始化。动作时,将表头节点指向表尾节点。

5.2 调用TAILQ_INIT (&conf_trans_queue);conf_trans_queue是一个链表,链接的是conf_trans类型的结构体,而conf_trans是configure transaction的缩写,里面都是一些事物的。结构体如下:

struct conf_trans {

  TAILQ_ENTRY (conf_trans) link;// TAILQ_ENTRY结构体,里面是conf_trans

  int trans;                   //元素,link是该结构体组成的链表。

  enum conf_op { CONF_SET, CONF_REMOVE, CONF_REMOVE_SECTION } op;

  char *section;

  char *tag;

  char *value;

  int override;

  int is_default;

};

5.3 调用conf_reinit()

重新初始化conf_path,也就是/etc/mlt.conf

5.3.1首先, 做的工作是把之前/etc/mlt.conf文件的内容全部读出来

5.3.2 Trans=conf_begin(),其实就是将seq的值+1,然后返回给Trans。Seq是一个静态变量,初始值为0.该值应该是用来标示不同mlt表的trans号。(函数体内未看到进行匹配的语句)

5.3.3 conf_parse (trans, new_conf_addr, sz); 从读取的内容中提取一些有用信息,去掉一些冗余信息,如注释,以“#”,“;”等开始的东西,如果出现\\n则标示是换行,那就把这些信息用’’空格取代。还有那些无参数的section等。都要做相应处理,得到有用的信息。

5.3.4 conf_load_defaults (trans);函数没有函数体,直接return了。

Free掉可能存在的conf_addr(conf_addr是个静态的字符数组变量,用来存放地址)地址内容。换成新申请的new_conf_addr.

这里的函数,是按照循环从LIST_FIRST元素开始remove,调用conf_remove_now()函数执行remove)

Conf_end(transaction,commit);此时trans的值为1.conf_trans变量表示conf的一些有关事务。Trans值应该是数字0,1,2,3.。。表示是主键,第一个,第二个第三个。。。。。

Commit是1表示是确认,是0则相反。

得到op的操作,{CONF_SET,CONF_REMOVE,CONF_REMOVE_SECTION}

如果是得到op值是 CONF_SET则调用conf_set_now (section, tag, value,

                 override, is_default);

以此类推。。。。

6.得到本地的MDS的id,得到主MDS的id(通过调用conf_get_num()函数)

7.创建添加mds的新线程,线程入口地址是newmdsadd_prc()函数,也是服务器例程启动入口。(ps:如果rpc调用已经存在则无动作,否则是第一次加入mds,因此创建新线程)

该函数就是做一些相应的关联动作,做完之后,启动线程,等待客户端的调用。

这个函数,其实就是由prcgen生成的main函数,改的,因为只能有一个主函数。所以,实际上是换了个名字,给出该线程的入口地址。转到*_svc.c文件里面继续执行。

newmdsadd_rpc()函数的主要操作如下:

①    pmap_unset( prognum ,versnum ),此函数把相应的程序在对应的端口号撤销.

②    SVCXPTR *Svcudp_creat(RPC_ANYSOCK) 创建一个UDP服务句柄。同时将服务传输句柄socket number设置为xptr->xp_sock

③    多次调用svc_register(xptr,prognum,versnum,dispatch,protocol)

该函数将RPC调用和由dispatch指针指向的服务调度过程映射起来。这里实际上把第一步的所有撤销的映射又重新映射起来。同时在调度服务参数里调用子程序

newmdsadd_prog_1(struct svc_req *rqstp, register SVCXPRT *transp)

这些都是封装的。。。不需要了解细节,大致就是做一些对应的映射类工作。

8. pthread_mutex_lock(&Priorty_lock);
  pthread_mutex_unlock(&Priorty_lock);

pthread_mutex_destroy(&Priorty_lock);

 等于设置所在线程优先启动?

9.对线程初始化,然后设置该线程以分离状态(detachestate)启动线程,这个作用是为了避免忙等,从而造成资源浪费,一般线程启动都应该设置以分离态启动线程。

10.如果当前id和主id相同,创建新线程,线程入口地址指向setup_kernel_mlt()函数。

10.1 setup_kernel_mlt函数以读写方式打开getmlt 文件。然后把cmd值,初始为1(表示是生成的主的MDS) 写入getmlt文件。(getmlt文件里到底是什么内容?/proc/fs/spnfs/getmlt) 该函数实际上就是往getmlt文件里写入“1”。

11.调用gen_mlt().生成mlt表?。rrdserver是用来监控负载的服务器。

11.1调用conf_init()功能如5

11.2调用mlt_init()(需要具体细节?)对mlt表进行初始化(每台MDS都对应一个mlt表,该函数的作用就是把mlt表的内容都读出来,生成另一个mlt表?如果是第一个MDS,自己生成?)。读出,MLT表的位置,MDS的版本号,数量,然后将加入MDS监控负载的服务器地址,以及DS上对应在的MDS的ip都分别对应上去,修改。将数据弄完之后,调用

mlt_init(master_id);(mds_state==1的时候表示是主mds,等于0时不是)

该函数把上面一个函数读出的很多信息,放到新的mlt表中

11.3调用dispatch_dir(dirstr,n%MLT_BUCKET_COUNT)函数,这个函数主要是对Directory进行操作。

12.创建线程,ping_all_tid.这里应该就是我们搭系统的时候一直看到的主MDS一直在ping的样子。这里是一个死循环,每次等待10 second后,调用ping_test_all();

13.当前ID不是主ID的时候。首先调用get_master_ip()函数得到主ID.

14.调用newmdsadd_prog_rpc(master_ip,add_type)。

15.如果线程master_ping_test_thread不存在,则创建该线程,入口地址从sub_ping_test_thread()开始执行。

 

 

 

 

 

转载于:https://www.cnblogs.com/xindufresne/p/3427952.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值