glusterfs客户端创建过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011186959/article/details/77485435
glusterfs客户端的入口在glusterfsd.c中的main函数,由命令mount. glusterfs (里面调用glusterfs命令)创建。
下面是客户端的创建过程:
1. 做一些初始化操作:事件池、内存池、日志等。
2. 在parse_cmdline函数中解析命令行参数。
3. create_fuse_mount函数里
     在函数xlator_set_type里调用dlopen、dlsym、dlclose系列函数加载动态库mount/fuse.so(代码在xlators/mount/fuse/src/fuse-bridge.c中)
在xlator_init函数中调用mount/fuse.so动态库里的init函数
 mount/fuse.so动态库里的init函数做如下操作:
  1) 检查挂载点的有效性,必须是目录并且是存在的。
  2) 根据存储池的属性初始化客户端进程。
  3) 在gf_fuse_mount函数里创建"/dev/fuse"文件,调用mount函数挂载存储池到挂载点上,文件类型为"fuse.glusterfs",通过挂载参数把挂载点和"/dev/fuse"文件关联。
4. 在函数glusterfs_volumes_init调用glusterfs_mgmt_init创建一个tcp socket(客户端),建立与deamon之间的连接,把此socket注册到事件池中
5. 在函数event_dispatch中,创建线程事件池,若有注册的事件发生,就进行相应的处理。
6. 获取配置文件
     Client进程创建的socket连接上deamon(glusterd)进程的socket后,会通过此连接向deamon进程请求获取client配置文件即trusted-datapool.tcp-fuse.vol (通过在mgmt_rpc_notify函数中调用函数glusterfs_volfile_fetch,向deamon的24007 socket发送prognum为GLUSTER_HNDSK_PROGRAM,progver为 GLUSTER_HNDSK_VERSION, procnum为GF_HNDSK_GETSPEC的消息, prog为clnt_handshake_prog)

     收到对方的回应后调用mgmt_getspec_cbk ---> glusterfs_process_volfp --->glusterfs_graph_activate , 函数glusterfs_graph_init 从最顶层到底层依次调用各层模块对应的init函数 初始化各模块, 函数glusterfs_graph_parent_up调用顶层datapool模块的notify函数(debug/io-stats),event为GF_EVENT_PARENT_UP ,datapool模块又会调用它的子模块,层层调用后会调用最底层datapool-client-(id)模块(protocol/client)的notify函数, 在protocol/client中分别连接存储池datapool的四个brick进程的socket。
当client进程的tcp socket第一次收到brick进程发来的数据时会调用socket_event_handler函数,此时,this->private->connected == 0 ,因此会调用socket_connect_finish函数,在此函数里:调用函数rpc_transport_notify(this, RPC_TRANSPORT_CONNECT, this),根据创建socket时的信息,最终会调用client层的parent层(即cluster/replicate、cluster/disperse层、cluster/distribute或cluster/stripe)中的notify ---> afr_notify、ec_notify或stripe.c中的notify ,event为GF_EVENT_CHILD_UP,当此层收到所有子层的状态后, 再调用parent层,即dht层的notify(event为GF_EVENT_CHILD_UP)。当dht层收到所有子层的状态后,调用parent层,这样一层一层向上调用,最后调用到io-stats层的notify ,此层没有parent,所以会调用this->ctx->master,即mount/fuse模块的notify(文件fuse-bridge.c中的notify)。
7. fuse-bridge.c中的notify
      当event为GF_EVENT_CHILD_UP时,创建一个线程,在线程处理函数fuse_thread_proc中用poll监听"/dev/fuse"文件,如果有可读事件发生,就读取这个文件,然后根据数据中的操作码,调用fuse_std_ops数组中的对应函数。处理完后,把结果写入"/dev/fuse"文件中。
展开阅读全文

没有更多推荐了,返回首页