twemproxy源码分析之二 nc_run
2015-07-20 09:56
330 查看
nc_run函数一共没几行。主要的函数有core_start, core_loop以及core_stop.
其中core_start用来初始化conn,mbuf,msg这些重要数据结构的基本参数值,更重要的是根据配置文件以及命令行参数设置该实例中的context变量(上一节我们提到过一个twemproxy实例对应于一个context变量ctx)
core_loop函数主要是在调用event_wait等待io事件的发生。
core_stop则是对于core_start函数的反向操作
1.core_start
core_start的功能有给重要的数据结构conn,mbuf,msg 设置基础参数(比如每个mbuf大小等),另外就是用core_ctx_create给instance的context变量ctx赋值。
这里面我们着重讲一下core_ctx_create
这个函数按照配置文件以及命令行参数,给该contex类型变量ctx 赋值。
赋值中的主要操作有:
1). ctx->cf = conf_create(nci->conf_filename); 这个函数给ctx中的cf变量赋值。
cf变量是conf类型的。之所以有这个类型,本质上是将操作所用的函数以及解析后所获得的的结果都包含在这个结构体中了。conf_create先将cf中的函数指针以及解析类型设定好,然后处理,最后将处理后的结果保存在conf结构体的arg数组中。注意:最后配置文件的内容全部被包含在了conf结构体的arg数组中,还有配置文件中的pool以及每个pool中的server信息均被保存在了conf的pool数组中。
2).server_pool_init(&ctx->pool, &ctx->cf->pool, ctx);这个函数根据ctx->cf->pool(这可是个数组啊不是单个pool类型 )的信息,构建ctx的pool数组(contex的pool类型也是array)。
3).ctx->stats = stats_create(nci->stats_port, nci->stats_addr, nci->stats_interval,nci->hostname, &ctx->pool);
这个函数保证在在ctx->stats->current(或者ctx->stats->shadow或者ctx->stats->sum)上,每一个server_poo都有一个stats_server_pool.而每一个 server都对应一个stats_server。而且(stats_server与stats_server_pool的关系)与(server和server_pool)之间的关系一致。
同样的,所有的stats_server_pool组成了ctx->stats->current(或者ctx->stats->shadow或者ctx->stats->sum)的一个数组(即结构成员stats_pool),就像所有的server_pool组成了ctx中的一个数组(结构成员server_pool)一样。是有点绕哈,不过这个一一对应关系,还是很好理解的。
4). ctx->evb = event_base_create(EVENT_SIZE, &core_core);
这个函数调用event_base_create()之后,我们便得到了一个可以容纳1024个event的event_base
5). status
= server_pool_preconnect(ctx);函数
如果设定了server_pre_connect,则提前建立与后端redisserver的连接
6). status = proxy_init(ctx);
启动监听
2. core_loop
nsd = event_wait(ctx->evb, ctx->timeout);等待事件的发生
3.core_stop
清理进程运行时的参数。
下一章中我们将探讨twemproxy中所用的epoll机制。
其中core_start用来初始化conn,mbuf,msg这些重要数据结构的基本参数值,更重要的是根据配置文件以及命令行参数设置该实例中的context变量(上一节我们提到过一个twemproxy实例对应于一个context变量ctx)
core_loop函数主要是在调用event_wait等待io事件的发生。
core_stop则是对于core_start函数的反向操作
1.core_start
core_start的功能有给重要的数据结构conn,mbuf,msg 设置基础参数(比如每个mbuf大小等),另外就是用core_ctx_create给instance的context变量ctx赋值。
这里面我们着重讲一下core_ctx_create
这个函数按照配置文件以及命令行参数,给该contex类型变量ctx 赋值。
赋值中的主要操作有:
1). ctx->cf = conf_create(nci->conf_filename); 这个函数给ctx中的cf变量赋值。
cf变量是conf类型的。之所以有这个类型,本质上是将操作所用的函数以及解析后所获得的的结果都包含在这个结构体中了。conf_create先将cf中的函数指针以及解析类型设定好,然后处理,最后将处理后的结果保存在conf结构体的arg数组中。注意:最后配置文件的内容全部被包含在了conf结构体的arg数组中,还有配置文件中的pool以及每个pool中的server信息均被保存在了conf的pool数组中。
2).server_pool_init(&ctx->pool, &ctx->cf->pool, ctx);这个函数根据ctx->cf->pool(这可是个数组啊不是单个pool类型 )的信息,构建ctx的pool数组(contex的pool类型也是array)。
3).ctx->stats = stats_create(nci->stats_port, nci->stats_addr, nci->stats_interval,nci->hostname, &ctx->pool);
这个函数保证在在ctx->stats->current(或者ctx->stats->shadow或者ctx->stats->sum)上,每一个server_poo都有一个stats_server_pool.而每一个 server都对应一个stats_server。而且(stats_server与stats_server_pool的关系)与(server和server_pool)之间的关系一致。
同样的,所有的stats_server_pool组成了ctx->stats->current(或者ctx->stats->shadow或者ctx->stats->sum)的一个数组(即结构成员stats_pool),就像所有的server_pool组成了ctx中的一个数组(结构成员server_pool)一样。是有点绕哈,不过这个一一对应关系,还是很好理解的。
4). ctx->evb = event_base_create(EVENT_SIZE, &core_core);
这个函数调用event_base_create()之后,我们便得到了一个可以容纳1024个event的event_base
5). status
= server_pool_preconnect(ctx);函数
如果设定了server_pre_connect,则提前建立与后端redisserver的连接
6). status = proxy_init(ctx);
启动监听
2. core_loop
nsd = event_wait(ctx->evb, ctx->timeout);等待事件的发生
3.core_stop
清理进程运行时的参数。
下一章中我们将探讨twemproxy中所用的epoll机制。
相关文章推荐
- 【PHP学习】函数
- Python标识符
- Mysql 存储引擎中InnoDB与Myisam的主要区别
- HDU 1114
- 进程通信
- Static import
- Android 中的 Service 全面总结
- 查找算法小结
- 设计模式_原型模式
- jsp页面获取路径
- 【PHP学习】数组
- 十五天精通WCF——第七天 Close和Abort到底该怎么用才对得起观众
- 0034 类和对象
- .net 枚举(Enum)使用总结
- 火狐浏览器l无法启动
- 通过网页集中访问Docker容器
- 常用函数(二)在现有元素后插入新的元素
- 微信错误提示code= -4/微信发送被拒绝
- Python的Django框架中从url中捕捉文本的方法
- Twemproxy源码分析之一 入口函数及启动过程