源代码位于trafficserver-5.1.1/cmd/traffic_cop/traffic_cop.cc,系统为centos6.4,本着学习的态度,看了代码强迫自己去写点东西,一方面为了记录,另外一方面也强迫自己去搞懂它,从而达到提升自己能力和结合实际应用更好的去使用它。traffic_cop 进程由trafficserver脚本启动
-
main 函数 主程序入口
//初始化一些版本以及系统信息
//Apache Traffic Server, traffic_cop, 5.1.1, 12月 30 2014, 17:10:25,hostname #uname -n,root
#id -nu appVersionInfo.setup(PACKAGE_NAME, "traffic_cop", PACKAGE_VERSION, __DATE__, __TIME__, BUILD_MACHINE, BUILD_PERSON, "");
// Before accessing file system initialize Layout engine #ats 配置 可执行插件等等位置
Layout::create();
// 初始化 traffic_cop的 help 信息
process_args(argument_descriptions, countof(argument_descriptions), argv);
// Initialize and start it up.
init();
// 检查进程是否启动,如果没有,尝试启动
check(NULL);
-
init 函数
struct stat info;//文件或者目录的详细信息,很详细
cop_log_trace("Entering init()\n");
//存放records配置 容器的初始化
RecConfigFileInit();
//初始化进程信号接受
init_signals();
//初始化程序的系统记录器的连接
init_syslog();
//初始化和check配置文件
init_config_file();
//加载records 配置,初始化一些端口 bin路径 等变量
config_reload_records();
//初始化进程锁文件所在位置
init_lockfiles();
//check
check_lockfile();
-
init:init_signals 函数
action.sa_handler = sig_term; //handle 杀死父进程以及所有子进程
action.sa_handler = sig_child;//handle 获取子进程
action.sa_sigaction = sig_fatal;//异常终止一个进程
set_alarm_death();//警报
-
init:init_config_file 函数
//定位records.config
Layout::relative_to(config_file, sizeof(config_file), config_dir,"records.config");
if (stat(config_file, &info) < 0) {//获取records 的信息
-
init:config_reload_records 函数
//读取解析records.config
, config_register_variable 回调函数 if (RecConfigFileParse(config_file, config_register_variable, false)
-
check 函数
//设置一个预报警
alarm(2 * (sleep_time + manager_timeout * 2 + server_timeout));
//check traffic_cop 是否启动
if (check_no_run() < 0)
// Re-read the config file information
config_reload_records();
// Check to make sure the programs are running
check_programs();
// Check to see if we're running out of free memory
check_memory();
// We do this after the first round of checks, since the first "check" will spawn traffic_manager
TSInit(Layout::get()->runtimedir,static_cast<TSInitOptionT>(TS_MGMT_OPT_NO_EVENTS));
// Done with the mgmt API.
TSTerminate();
-
check:check_programs 函数
//
| state | status | action // --------|---------|----------|---------------
// manager |
up | ok | nothing // server
| up | ok | // --------|---------|----------|---------------
// manager |
up | bad | kill manager // server
| up | ? | // --------|---------|----------|---------------
// manager |
up | ok | kill manager // server
| down | ? | // --------|---------|----------|---------------
// manager |
up | ok | kill server // server
| up | bad | 一个简单的状态机,关于manager,server 当前处于什么状态,然后执行相应的操作,如果manager 没有启动就启动manager,如果manager 启动了,就check server 是否启动,然后根据相应的状态执行相应的操作
-
check:check_memory 函数
内存check
-
check:TSInit 函数
这个函数没太懂
-
spawn_manager 函数
启动manager
err = execv(prog, options);//执行启动命令
-
server_up 函数
check
traffic_server 进程是否启动 -
heartbeat_server 函数
定时check
traffic_server 是否存活 -
heartbeat_manager 函数
定时check traffic_manager 是否存活