searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

ovs-dpdk 热升级分析(二)

2023-06-14 12:07:44
121
0
接下来的工作主要是client进程(即新进程)的工作
bridge_run->ndu_client_before_stage2
在stage1阶段,client从server同步完流表后,client->state的状态被置为NDU_CLIENT_STATE_SYNC_DB。
LOOP1:
判断client.idl_seqno==ovsdb_idl_get_seqno(client.idl)
”syncing with db, let main loop run“
当二者不相等时(当每次db变更时,都会使seqno发生变化)
NDU_CLIENT_STATE_SYNC_DB-- >NDU_CLIENT_STATE_PROBE_NETDEV
LOOP2:
  1. 创建netdev设备。
从老进程获取的portno_list的port属性,在本地创建。netdev设备添加到client.probe_netdevs设备中。netdev设备创建会将设备添加到dpdk_list列表中。
调用关系:
netdev_open->netdev_dpdk_construct->common_construct
 
从这理解可知,创建完port后,接下来应该运行bridge_reconfigure.(触发原理:ovsdb改变或是和ovsdb重连接都会导致idl_seqno变化)
NDU_CLIENT_STATE_PROBE_NETDEV-->NDU_CLIENT_STATE_WAIT_NETDEV_DONE
  1. bridge_reconfigure
主要将ovsdb信息同步过来,如对新网桥创建、controller连接等。但进入这个函数的前提是idl_seqno变化(ovsdb改变或是和ovsdb重连接都会导致idl_seqno变化)。
按照此处的理解。应该将设备添加到bridge桥上。(实际效果待验证)

    a.在bridge_run中cfg = ovsrec_open_vswitch_first(idl);获取ovs配置

执行完后可以获取到cfg

    b.bridge_reconfigure->add_del_bridges

  •      将ovsrec_bridge结构体填充到new_br的缓存列表中
for (i = 0; i < cfg->n_bridges; i++)
{
    const struct ovsrec_bridge *br_cfg = cfg->bridges[i];
    shash_add_once(&new_br, br_cfg->name, br_cfg)
}
删除已删除的桥或那些类型已更改的桥。更新仍然存在的桥的cfg。
HMAP_FOR_EACH_SAFE (br, next, node, &all_bridges) {
        br->cfg = shash_find_data(&new_br, br->name);
        if (!br->cfg || strcmp(br->type, ofproto_normalize_type(
                                   br->cfg->datapath_type))) {
            bridge_destroy(br, true);
        }
    }
    
    /* Add new bridges. */
    SHASH_FOR_EACH(node, &new_br) {
        const struct ovsrec_bridge *br_cfg = node->data;
        if (!bridge_lookup(br_cfg->name)) {
            bridge_create(br_cfg);
        }
    }
  • bridge_create(br_cfg);创建br,将br添加到all_bridges中

c. bridge_collect_wanted_ports将port添加到br上。

LOOP3:
  1. ofproto netdev probe complete
NDU_CLIENT_STATE_WAIT_NETDEV_DONE->NDU_CLIENT_STATE_WAIT_STAGE2
  1.  
接收命令行指令如果收到命令行指令,直接执行,没收到会继续等待。(这里可以进行ovs的状态检查等操作)
ndu_cmd_server_run(&client.ndu_cmd);
        if (client.ndu_cmd.start2 != true) {
            ndu_cmd_server_wait(&client.ndu_cmd);
            return 0;
        }
        VLOG_INFO("client stage1: ndu recv cmd, start stage2\n");
        ndu_allow_vhostuser_connect();
        ndu_clear_pmd_pause(NULL);
NDU_CLIENT_STATE_WAIT_STAGE2-》NDU_CLIENT_STATE_FLOW_INSTALL;

3. ndu_install_flows(&client.ndu_flow);

安装dpflow
(此处手续安装rte_flow,ct,dp_flow,foc)
至此流表同步完成。剩余工作既是老进程exit,新进程正常启动。
 
问题:
ukey在热升级时在哪里备份的?
ukey不需要备份,原因是ukey的创建可以交给revalidator线程操作。当client线程备份了flow后,revalidator线程dump流表时会检查流表的ukey是否存在。
ukey_acquire->!ukey_lookup?ukey_create_from_dpif_flow(创建ukey)
问题2:紫金逻辑中,在迁移过程中如果做好关联(原因现在记录的是指针,迁移后地址会发生改变)?
foc与dp流表关联。在dp流表中已记录关联的foc的handleid。由handleid重新关联。
老进程获取dp流表所有关联的foc的index。在同步时一并同步给新进程。
 
0条评论
0 / 1000
吴****华
4文章数
0粉丝数
吴****华
4 文章 | 0 粉丝
吴****华
4文章数
0粉丝数
吴****华
4 文章 | 0 粉丝
原创

ovs-dpdk 热升级分析(二)

2023-06-14 12:07:44
121
0
接下来的工作主要是client进程(即新进程)的工作
bridge_run->ndu_client_before_stage2
在stage1阶段,client从server同步完流表后,client->state的状态被置为NDU_CLIENT_STATE_SYNC_DB。
LOOP1:
判断client.idl_seqno==ovsdb_idl_get_seqno(client.idl)
”syncing with db, let main loop run“
当二者不相等时(当每次db变更时,都会使seqno发生变化)
NDU_CLIENT_STATE_SYNC_DB-- >NDU_CLIENT_STATE_PROBE_NETDEV
LOOP2:
  1. 创建netdev设备。
从老进程获取的portno_list的port属性,在本地创建。netdev设备添加到client.probe_netdevs设备中。netdev设备创建会将设备添加到dpdk_list列表中。
调用关系:
netdev_open->netdev_dpdk_construct->common_construct
 
从这理解可知,创建完port后,接下来应该运行bridge_reconfigure.(触发原理:ovsdb改变或是和ovsdb重连接都会导致idl_seqno变化)
NDU_CLIENT_STATE_PROBE_NETDEV-->NDU_CLIENT_STATE_WAIT_NETDEV_DONE
  1. bridge_reconfigure
主要将ovsdb信息同步过来,如对新网桥创建、controller连接等。但进入这个函数的前提是idl_seqno变化(ovsdb改变或是和ovsdb重连接都会导致idl_seqno变化)。
按照此处的理解。应该将设备添加到bridge桥上。(实际效果待验证)

    a.在bridge_run中cfg = ovsrec_open_vswitch_first(idl);获取ovs配置

执行完后可以获取到cfg

    b.bridge_reconfigure->add_del_bridges

  •      将ovsrec_bridge结构体填充到new_br的缓存列表中
for (i = 0; i < cfg->n_bridges; i++)
{
    const struct ovsrec_bridge *br_cfg = cfg->bridges[i];
    shash_add_once(&new_br, br_cfg->name, br_cfg)
}
删除已删除的桥或那些类型已更改的桥。更新仍然存在的桥的cfg。
HMAP_FOR_EACH_SAFE (br, next, node, &all_bridges) {
        br->cfg = shash_find_data(&new_br, br->name);
        if (!br->cfg || strcmp(br->type, ofproto_normalize_type(
                                   br->cfg->datapath_type))) {
            bridge_destroy(br, true);
        }
    }
    
    /* Add new bridges. */
    SHASH_FOR_EACH(node, &new_br) {
        const struct ovsrec_bridge *br_cfg = node->data;
        if (!bridge_lookup(br_cfg->name)) {
            bridge_create(br_cfg);
        }
    }
  • bridge_create(br_cfg);创建br,将br添加到all_bridges中

c. bridge_collect_wanted_ports将port添加到br上。

LOOP3:
  1. ofproto netdev probe complete
NDU_CLIENT_STATE_WAIT_NETDEV_DONE->NDU_CLIENT_STATE_WAIT_STAGE2
  1.  
接收命令行指令如果收到命令行指令,直接执行,没收到会继续等待。(这里可以进行ovs的状态检查等操作)
ndu_cmd_server_run(&client.ndu_cmd);
        if (client.ndu_cmd.start2 != true) {
            ndu_cmd_server_wait(&client.ndu_cmd);
            return 0;
        }
        VLOG_INFO("client stage1: ndu recv cmd, start stage2\n");
        ndu_allow_vhostuser_connect();
        ndu_clear_pmd_pause(NULL);
NDU_CLIENT_STATE_WAIT_STAGE2-》NDU_CLIENT_STATE_FLOW_INSTALL;

3. ndu_install_flows(&client.ndu_flow);

安装dpflow
(此处手续安装rte_flow,ct,dp_flow,foc)
至此流表同步完成。剩余工作既是老进程exit,新进程正常启动。
 
问题:
ukey在热升级时在哪里备份的?
ukey不需要备份,原因是ukey的创建可以交给revalidator线程操作。当client线程备份了flow后,revalidator线程dump流表时会检查流表的ukey是否存在。
ukey_acquire->!ukey_lookup?ukey_create_from_dpif_flow(创建ukey)
问题2:紫金逻辑中,在迁移过程中如果做好关联(原因现在记录的是指针,迁移后地址会发生改变)?
foc与dp流表关联。在dp流表中已记录关联的foc的handleid。由handleid重新关联。
老进程获取dp流表所有关联的foc的index。在同步时一并同步给新进程。
 
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
1
0