traffic server 5.1.1 源码学习 traffic_cop



源代码位于trafficserver-5.1.1/cmd/traffic_cop/traffic_cop.cc,系统为centos6.4,本着学习的态度,看了代码强迫自己去写点东西,一方面为了记录,另外一方面也强迫自己去搞懂它,从而达到提升自己能力和结合实际应用更好的去使用它。traffic_cop 进程由trafficserver脚本启动

  1. 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);

  2. 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();

  3. init:init_signals 函数

    action.sa_handler = sig_term; //handle 杀死父进程以及所有子进程

    action.sa_handler = sig_child;//handle 获取子进程

    action.sa_sigaction = sig_fatal;//异常终止一个进程

    set_alarm_death();//警报

  4. 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 的信息

  5. init:config_reload_records 函数

    //读取解析records.config  , config_register_variable 回调函数

    if (RecConfigFileParse(config_file, config_register_variable, false)

  6. 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();

  7. 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 是否启动,然后根据相应的状态执行相应的操作

  8. check:check_memory 函数

    内存check

  9. check:TSInit 函数 

    这个函数没太懂

  10. spawn_manager 函数

    启动manager

    err = execv(prog, options);//执行启动命令

  11. server_up 函数

    check  traffic_server 进程是否启动

  12. heartbeat_server 函数

    定时check traffic_server 是否存活

  13. heartbeat_manager 函数

    定时check traffic_manager 是否存活

你可能感兴趣的:(源码,ats)