当前位置: 首页 > news >正文

C++负载均衡远程调用学习之HOOK注册机制

目录

 

1.larV0.7-hook流程的说明

2.larV0.7-TCP_server集成链接HOOK函数

3.larV0.7-TCP_client集成链接HOOK注册功能


 

1.larV0.7-hook流程的说明

### 7.1 数据库表相关查询方法实现

​        我们先实现一些基本的数据表达查询方法:

> lars_dns/src/dns_route.cpp

```c
/*
 *  return 0, 表示 加载成功,version没有改变
 *         1, 表示 加载成功,version有改变
 *         -1 表示 加载失败
 * */
int Route::load_version()
{
    //这里面只会有一条数据
    snprintf(_sql, 1000, "SELECT version from RouteVersion WHERE id = 1;");

    int ret = mysql_real_query(&_db_conn, _sql, strlen(_sql));
    if (ret)
    {
        fprintf(stderr, "load version error: %s\n", mysql_error(&_db_conn));
        return -1;
    }

    MYSQL_RES *result = mysql_store_result(&_db_conn);
    if (!result)
    {
        fprintf(stderr, "mysql store result: %s\n", mysql_error(&_db_conn));
        return -1;
    }

    long line_num = mysql_num_rows(result);
    if (line_num == 0)
    {
        fprintf(stderr, "No version in table RouteVersion: %s\n", mysql_error(&_db_conn));
        return -1;
    }

    MYSQL_ROW row = mysql_fetch_row(result);
    //得到version

    long new_version = atol(row[0]);

    if (new_version == this->_version)
    {
        //加载成功但是没有修改
        return 0;
    }
    this->_version = new_version;
    printf("now route version is %ld\n", this->_version);

    mysql_free_result(result);

    return 1;
}

2.larV0.7-TCP_server集成链接HOOK函数

//加载RouteData到_temp_pointer
int Route::load_route_data() 
{
    _temp_pointer->clear();

    snprintf(_sql, 100, "SELECT * FROM RouteData;");

    int ret = mysql_real_query(&_db_conn, _sql, strlen(_sql));
    if (ret)
    {
        fprintf(stderr, "load version error: %s\n", mysql_error(&_db_conn));
        return -1;
    }

    MYSQL_RES *result = mysql_store_result(&_db_conn);
    if (!result)
    {
        fprintf(stderr, "mysql store result: %s\n", mysql_error(&_db_conn));
        return -1;
    }

    long line_num = mysql_num_rows(result);
    MYSQL_ROW row;
    for (long i = 0;i < line_num; ++i)
    {
        row = mysql_fetch_row(result);
        int modid = atoi(row[1]);
        int cmdid = atoi(row[2]);
        unsigned ip = atoi(row[3]);
        int port = atoi(row[4]);

        uint64_t key = ((uint64_t)modid << 32) + cmdid;
        uint64_t value = ((uint64_t)ip << 32) + port;

        (*_temp_pointer)[key].insert(value);
    }
    printf("load data to tmep succ! size is %lu\n", _temp_pointer->size());

    mysql_free_result(result);

    return 0;
}

3.larV0.7-TCP_client集成链接HOOK注册功能

//将temp_pointer的数据更新到data_pointer
void Route::swap()
{
    pthread_rwlock_wrlock(&_map_lock);
    route_map *temp = _data_pointer;
    _data_pointer = _temp_pointer;
    _temp_pointer = temp;
    pthread_rwlock_unlock(&_map_lock);
}


//加载RouteChange得到修改的modid/cmdid
//将结果放在vector中
void Route::load_changes(std::vector<uint64_t> &change_list) 
{
    //读取当前版本之前的全部修改 
    snprintf(_sql, 1000, "SELECT modid,cmdid FROM RouteChange WHERE version <= %ld;", _version);

    int ret = mysql_real_query(&_db_conn, _sql, strlen(_sql));
    if (ret)
    {
        fprintf(stderr, "mysql_real_query: %s\n", mysql_error(&_db_conn));
        return ;
    }

    MYSQL_RES *result = mysql_store_result(&_db_conn);
    if (!result)
    {
        fprintf(stderr, "mysql_store_result %s\n", mysql_error(&_db_conn));
        return ;
    }

    long lineNum = mysql_num_rows(result);
    if (lineNum == 0)
    {
        fprintf(stderr,  "No version in table ChangeLog: %s\n", mysql_error(&_db_conn));
        return ;
    }
    MYSQL_ROW row;
    for (long i = 0;i < lineNum; ++i)
    {
        row = mysql_fetch_row(result);
        int modid = atoi(row[0]);
        int cmdid = atoi(row[1]);
        uint64_t key = (((uint64_t)modid) << 32) + cmdid;
        change_list.push_back(key);
    }
    mysql_free_result(result);    
}

 

 

相关文章:

  • QT中的QSS---界面美化
  • 蒙特卡罗方法(Monte Carlo Method)​​:基于随机采样的数值计算与模拟技术
  • 《Android 应用开发基础教程》——第十一章:Android 中的图片加载与缓存(Glide 使用详解)
  • 解决“‘mvn‘ 不是内部或外部命令,也不是可运行的程序”错误
  • 一条 SQL 查询语句是如何执行的(MySQL)
  • Redis怎么避免热点数据问题
  • 云原生后端架构的实践与挑战:探索现代后端开发的未来
  • JVM性能调优的基础知识 | JVM内部优化与运行时优化
  • SQL面试题——留存分析之使用bitmap 计算留存
  • d202552-sql
  • PostgreSQL常用函数
  • 个人健康中枢的多元化AI硬件革新与精准健康路径探析
  • PyTorch、Flash-Attn、Transformers与Triton技术全景解析+环境包
  • 融智学数学符号体系的系统解读(之一)
  • 本地大模型编程实战(32)用websocket显示大模型的流式输出
  • 软考 系统架构设计师系列知识点之杂项集萃(51)
  • [学成在线]22-自动部署项目
  • 4.1 模块概述
  • ubuntu22.04安装显卡驱动与cuda+cuDNN
  • BERT+CRF模型在命名实体识别(NER)任务中的应用
  • 港股5月迎开门红,恒生科指涨3%,欧股开盘全线上扬
  • 荆州市委书记汪元程:全市各级干部要做到慎微、慎初、慎独、慎友
  • 广东省副省长刘红兵跨省任湖南省委常委、宣传部部长
  • 《奇袭白虎团》原型人物之一赵顺合辞世,享年95岁
  • “中国游”带火“中国购”,“即买即退”让外国游客购物更丝滑
  • 一张老照片里蕴含的上海文脉