原创 :twemproxy源码分析之二 nc_run

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机制。

时间: 2024-09-30 15:35:06

原创 :twemproxy源码分析之二 nc_run的相关文章

Unity时钟定时器插件——Vision Timer源码分析之二

Unity时钟定时器插件--Vision Timer源码分析之二 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面的已经介绍了vp_Timer(点击前往查看),vp_TimeUtility相对简单很多,vp_TimeUtility定义了个表示时间的结构Units: C#代码   /// <summary> /// represents a time measured in standard units /// </summar

AndroidPn源码分析(二)

接上篇: (一)客户端与服务器建立连接 上一篇写到ClientSession createClientSession这里,创建一个客户端的session.在SessionManager类中创建了session之后,这里拼接了两个xml内容的text.一个是Build the start packet response,创建一个头条包,作为回应.另外一个是:XMPP 1.0 needs stream features,是xmpp1.0所需要的文件结构.两个消息的格式内容如下: <?xml vers

[Android]Volley源码分析(二)

上一篇介绍了Volley的使用,主要接触了Request与RequestQueue这两个类,这篇就来了解一下这两个类的具体实现. Request类图: Request类: Request是一个抽象类,其中的主要属性: mMethod: 请求方法,目前支持GET, POST, PUT, DELETE, HEAD, OPTIONS,TRACE, PATCH方法 mUrl: 请求Url mErrorListener: 错误处理监听器,请求出错时调用 mSequence: 请求的序号,相同优先级的请求在

Cordova Android源码分析系列二(CordovaWebView相关类分析)

本篇文章是Cordova Android源码分析系列文章的第二篇,主要分析CordovaWebView和CordovaWebViewClient类,通过分析代码可以知道Web网页加载的过程,错误出来,多线程处理等. CordovaWebView类分析 CordovaWebView类继承了Android WebView类,这是一个很自然的实现,共1000多行代码.包含了PluginManager pluginManager,BroadcastReceiver receiver,CordovaInt

区块链教程以太坊源码分析core-state-process源码分析(二)

兄弟连区块链教程以太坊源码分析core-state-process源码分析(二):关于g0的计算,在黄皮书上由详细的介绍和黄皮书有一定出入的部分在于if contractCreation && homestead {igas.SetUint64(params.TxGasContractCreation) 这是因为 Gtxcreate+Gtransaction = TxGasContractCreation func IntrinsicGas(data []byte, contractCre

【Spring】Spring&amp;WEB整合原理及源码分析(二)

一.整合过程 Spring&WEB整合,主要介绍的是Jsp/Servlet容器和Spring整合的过程,当然,这个过程是Spring MVC或Strugs2整合Spring的基础. Spring和Jsp/Servlet整合操作很简单,使用也很简单,按部就班花不到2分钟就搞定了,本节只讲操作不讲原理,更多细节.原理及源码分析后续过程陆续涉及. 1. 导入必须的jar包,本例spring-web-x.x.x.RELEASE.jar: 2. 配置web.xml,本例示例如下: <?xml vers

《极简笔记》源码分析(二)

0. 介绍 此文将对Github上lguipeng大神所开发的 极简笔记 v2.0 (点我下载源码)代码进行分析学习. 通过此文你将学到: 应用源码的研读方法 MVP架构模式 Application的应用 Degger2依赖注入框架 搜索控件的使用 ButterKnife库的使用 Material主题 RecyclerView等新控件的用法 Lambda表达式 Java自定义注解 aFinal框架 RxJava框架 EventBus消息框架 布局文件常用技巧 PreferenceFragment

linux调度器源码分析 - 初始化(二)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明调度器在系统启动初始化阶段是如何初始化和工作的.通过上期文章我们知道,在多核CPU和SMP系统中,每个CPU(多核COU中的每个核)都有自己的struct rq队列,而rq队列中又有着自己的struct cfs_rq和struct rt_rq.在初始化时就是对这三个结构进行初始化. init_tas

Spring Developer Tools 源码分析:二、类路径监控

在 Spring Developer Tools 源码分析一中介绍了 devtools 提供的文件监控实现,在第二部分中,我们将会使用第一部分提供的目录监控功能,实现对开发环境中 classpath 的监控. 二.类路径监控 首先看一些这一部分可能涉及到的类图: 在图中,红色斜线左上部分是第一部分中介绍的文件目录监控的类,其中 FileSystemWatcher 会通过独立线程监控指定的目录,当目录内容发生变化时,通过对比快照可以获得所有监控目录变化的文件ChangedFiles,然后将变化通知