Yuntable代码阅读(看到哪,写到哪,有写的不对的,后面回来更正)
Master
Master启动过程
Master调用load_master方法(在master.c中)。Load_master方法先读取基本配置文件,默认的配置文件是conf/master.conf,从中要读出端口号、duplicate_num(replica数量)、check_interval。随后有两个重要的步骤:1)load_table_info_list;2)load_region_info_list。以上得到的所有信息都会添加到Master结构体中,最后update_master_info方法会根据Master中的内容更新Master。
重要步骤:
1.Load_table_info_list
加载yuntable中已有的表。从master.conf文件中读取所有表名,表名间以逗号分隔。对表名列表进行遍列,从master.conf文件中读出所有以表名为前缀的行,根据这些行的内容构造表的信息并放到TableInfo结构体中,string_to_table_info方法完成对TableInfo结构体的构造。所有表的TableInfo被放到一个List中,这个List就是Master结构体中的tableInfoList。
2.load_region_info_list
加载region信息。从master.conf文件中读取所有region的名字,遍列每个region名字。create_region_info会根据名字创建RegionInfo的实例,这些实例最终被放在Master和regionInfoList列表中。
3.Update_master_info
更新master,更新并检查region的信息,把有问题的region挑出来,统一做处理。遍列Master的tableInfoList,调用update_region_info方法对其中的每一个RegionInfo进行检查。检查的过程是一个RPC调用的过程。Master与RegionInfo中的每一个region进行socket连接,并请求region的状态。Master检查region的状态,如果region返回的状态有问题,则调用handle_problem_regions方法去处理,目前0.9版本中该方法并没有做任何事情。
Master后台线程
Master有两个后台线程:1)定期更新region信息的线程;2)等待客户请求的线程
定期更新的时间间隔是在master.conf中设定的,存储在Master结构体中
客户对Master的请求分为以下几类:
1) GET_TABLE_INFO_MASTER_CMD:
#define GET_TABLE_INFO_MASTER_CMD "get_table_info_master"。
客户端传给Master一个表名,Master返回它保存的TableInfo结构体。Master根据客户端请求的表名,在自己的tableInfoList查找该表,并返回结果。
2) ADD_NEW_REGION_MASTER_CMD
#define ADD_NEW_REGION_MASTER_CMD "add_new_region_master"
增加一个region到master中,0.9版本只能增加一个region。Master调用add_new_region_master(char *)方法增加region。它首先在master的region列表中查找该region,如果找不到,则验证要添加的region是否正在运行并且角色是region(这里调用check_node_validity方法,在client添加master时也用该方法)。验证通过以后,把region添加到master的region列表中,更新刚添加的region,并把region写到master的配置文件中。
3) CREATE_NEW_TABLE_MASTER_CMD
#define CREATE_NEW_TABLE_MASTER_CMD "create_new_table_master"
创建新表,master调用create_new_table_master函数创建新表。首先该函数检查表是否已存在。不存在时创建表。首先创建一个tableInfo的结构体,接下来的步骤有0.9版本的局限性。根据master中记录的duplicate_num参数创建相应个数的ReplicaQueue实例和tabletInfo实例。创建tablet时master要请求region,因为tablet的数据在存储在region上的。Master需要传给region新的表名,region的操作参考region的命令处理。0.9版本的局限性就在于它只用了master上前duplicate_num个region,简化实现不考虑负载均衡。几个数据结构的关系:
Master,TableInfo,TabletInfo,RegionInfo,ReplicaQueue。
Master->tableInfoList保存tableInfo
Master->regionInfoList保存regionInfo
tableInfo->replicaQueueList保存replicaQueue
replicaQueue->tabletInfoList保存tabletInfo
tabletInfo->regionInfo保存tablet所在的region
4) CHECK_PROBLEM_REGION_MASTER_CMD
#define CHECK_PROBLEM_REGION_MASTER_CMD "check_problem_region"
检查有问题的region。当客户端添加或删除数据出错时,客户端会向master发送该请求。check_problem_region_master函数负责处理有问题的region。先调用update_region_info函数更新master中保存的region的可用空间大小,该过程是由向region发送AVAILABLE_SPACE_REGION_CMD请求完成的。如果region确实有问题(region_has_problem函数去判断)handle_problem_regions去处理,但是当前0.9版本没有做任何处理就直接调用return语句返回了,原因是"This routine has not been tested, and stops now."。程序后面的内容是调用handle_infected_tablet,继而调用start_sync_job,该方法在region之间数据的同步和转移。
5) GET_METADATA_MASTER_CMD
#define GET_METADATA_MASTER_CMD "get_metadata_master"
得到所有region和table信息,并返回给客户端。示例输出如下:
yuncli:show master
The Master Default Duplication Number: 1
The number of region node: 1.
The information about Region No'0.
The Connection Info: 127.0.0.1:8302.
The Available Size(MB): 0.
Is Connecting Now: false.
Is Serving Now: true.
The number of Tables: 1
Tables are: people
6) GET_ROLE_CMD
#define GET_ROLE_CMD "get_role"
直接返回master进程的角色是"master"
当前用到的数据结构:Master,TableInfo,Tokens,ReplicaQueue,RegionInfo,RPCRequest,RPCResponse