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

ovs-dpdk热升级分析(一)

2023-03-29 14:17:20
296
0
stage1:
当ovs进程启动时,ovs进程首先会检测是否有老的ovs进程存在。
  1. 通过读取/usr/local/var/run/openvswitch/ovs-vswitchd.pid文件,获取最新启动的进程号。调用接口get_already_running_pid
  2. 当读取去到进程id时代表有新的ovs进程启动。调用ndu_connect_and_stage1。

1) 与老ovs进程创建连接。

2)创建新ovs进程与老ovs进程数据同步的通道ndu_flow,ndu_sync ,ndu_cmd通道

3)给老ovs进程发送新进程的new_pid rpc消息,通知新进程进入stage1阶段,等待新进程应答。当新进程执行完毕后,返回消息。

4)将新进程的client.state状态置为NDU_STATE_SYNC

5)等待接收老进程发过来的同步消息。

a.向老进程同步老进程的port信息。插入到client.ndu_sync.portno_list列表中。将NDU_STATE_SYNC-->NDU_STATE_FLOW_SYNC

                               b.从老进程获取megaflow插入到client.ndu_flow.megaflows中。(疑问:ukey表未看到同步)

                              c. 回收资源,并将client->state状态置为NDU_CLIENT_STATE_SYNC_DB

新进程(client)启动stage1启动流程:

3.当未读取到进程id时代表ovs第一次启动。调用daemonize_make_pidfile这个接口时monitor进程监控ovs进程时调用。

4.bridge_init(remote)创建与数据库database的idl。创建server的unix域套接字(路径为/usr/local/var/run/openvswitch/ovs-ndu/mypid)以便后续进程启动时连接。client全局变量获取ovsdb的seqno

5.进入ovs循环。

二、ovs新老进程热升级ndu_fsm_run_stage1
  1. ovs进程在每次loop时都会监听是否有新进程与ovs进程创建连接。当存在时进入loop1.创建连接。
  2. Loop2:接收stage1请求,注册ndu_fsm_run_stage1事件,fsm->state =NDU_STATE_IDLE。
  3. 状态LOOP3:执行ndu_fsm_run_stage1 点

                  a.fsm->state=NDU_STATE_IDLE -> NDU_STATE_HWOFFLOAD_OFF

                  b.调用ndu_hwol_off_run

      • 创建hwol_off_thread线程
      • 检测hw_off是否结束,未检测到线程结束返回EAGAIN;结束释放ctx->latch资源。

                c.NDU_STATE_HWOFFLOAD_OFF->NDU_STATE_REVALIDATOR_PAUSE

     4.状态LOOP4:ndu_rv_pause_run

                 a.ndu_rv_pause_run->udpif_pause_revalidators

                 b.将revalidators线程pause住。为后续的流表迁移做准备。

                 c.NDU_STATE_REVALIDATOR_PAUSE-->NDU_STATE_OVSDB_UNLOCK

     5.状态LOOP5:

                 a.ndu_ovsdb_unlock_run释放ovsdb的锁

                 b.NDU_STATE_OVSDB_UNLOCK->NDU_STATE_BR_RM_SRV_AND_SNOOP

    6.状态LOOP6:

                a.ndu_ctx.br_remove_services_and_snoop();

                           1)遍历所有bridge,获取punix:/usr/local/var/run/openvswitch/br-int.mgmt,并删除

                           2)bridge_remove_services_and_snoop ???不清楚作用。

               b.NDU_STATE_BR_RM_SRV_AND_SNOOP->NDU_STATE_PID_FILE

   7.状态LOOP7:

                a.ndu_pid_file_run(&fsm->ctx.pid_ctx); ????(不清楚,从代码理解是为了在exit时,触发删除文件)

                b.NDU_STATE_PID_FILE -> NDU_STATE_SYNC

                c.ndu_sync_trans_connect_and_run(&fsm->ctx.sync_ctx)

    1. NDU_STATE_SYNC-->NDU_STATE_FLOW_SYNC

 8.状态LOOP8:同步流表配置,同步成功后,

               a. ndu_flow_sync_connect_and_run(&fsm->ctx.flow_ctx)

               b. DNU_STATE_FLOW_SYNC->NDU_STATE_PMD_PAUSE

              c. ndu_set_pmd_pause

                   1)设置other_config状态pmd-pause为true

            d. NDU_STATE_PMD_PAUSE->NDU_STATE_VHOST_CONNECT_FORBID

            e. ndu_forbid_vhostuser_connect

            f. NDU_STATE_VHOST_CONNECT_FORBID->NDU_STATE_STAGE1_FINISH

           g. ndu_flow_trans_destroy(&fsm->ctx.flow_ctx.trans);

           h . ndu_sync_trans_destroy(&fsm->ctx.sync_ctx.trans);

 

老进程状态变化。
至此stage1阶段完成。新老进程进入stage2
 
源代码路径:
https://gitlab.ctyun.cn/os/basic/ovs/-/merge_requests/97/diffs#863756805d3d7c670cfa13da511591c2585e635b
0条评论
0 / 1000
吴****华
4文章数
0粉丝数
吴****华
4 文章 | 0 粉丝
吴****华
4文章数
0粉丝数
吴****华
4 文章 | 0 粉丝
原创

ovs-dpdk热升级分析(一)

2023-03-29 14:17:20
296
0
stage1:
当ovs进程启动时,ovs进程首先会检测是否有老的ovs进程存在。
  1. 通过读取/usr/local/var/run/openvswitch/ovs-vswitchd.pid文件,获取最新启动的进程号。调用接口get_already_running_pid
  2. 当读取去到进程id时代表有新的ovs进程启动。调用ndu_connect_and_stage1。

1) 与老ovs进程创建连接。

2)创建新ovs进程与老ovs进程数据同步的通道ndu_flow,ndu_sync ,ndu_cmd通道

3)给老ovs进程发送新进程的new_pid rpc消息,通知新进程进入stage1阶段,等待新进程应答。当新进程执行完毕后,返回消息。

4)将新进程的client.state状态置为NDU_STATE_SYNC

5)等待接收老进程发过来的同步消息。

a.向老进程同步老进程的port信息。插入到client.ndu_sync.portno_list列表中。将NDU_STATE_SYNC-->NDU_STATE_FLOW_SYNC

                               b.从老进程获取megaflow插入到client.ndu_flow.megaflows中。(疑问:ukey表未看到同步)

                              c. 回收资源,并将client->state状态置为NDU_CLIENT_STATE_SYNC_DB

新进程(client)启动stage1启动流程:

3.当未读取到进程id时代表ovs第一次启动。调用daemonize_make_pidfile这个接口时monitor进程监控ovs进程时调用。

4.bridge_init(remote)创建与数据库database的idl。创建server的unix域套接字(路径为/usr/local/var/run/openvswitch/ovs-ndu/mypid)以便后续进程启动时连接。client全局变量获取ovsdb的seqno

5.进入ovs循环。

二、ovs新老进程热升级ndu_fsm_run_stage1
  1. ovs进程在每次loop时都会监听是否有新进程与ovs进程创建连接。当存在时进入loop1.创建连接。
  2. Loop2:接收stage1请求,注册ndu_fsm_run_stage1事件,fsm->state =NDU_STATE_IDLE。
  3. 状态LOOP3:执行ndu_fsm_run_stage1 点

                  a.fsm->state=NDU_STATE_IDLE -> NDU_STATE_HWOFFLOAD_OFF

                  b.调用ndu_hwol_off_run

      • 创建hwol_off_thread线程
      • 检测hw_off是否结束,未检测到线程结束返回EAGAIN;结束释放ctx->latch资源。

                c.NDU_STATE_HWOFFLOAD_OFF->NDU_STATE_REVALIDATOR_PAUSE

     4.状态LOOP4:ndu_rv_pause_run

                 a.ndu_rv_pause_run->udpif_pause_revalidators

                 b.将revalidators线程pause住。为后续的流表迁移做准备。

                 c.NDU_STATE_REVALIDATOR_PAUSE-->NDU_STATE_OVSDB_UNLOCK

     5.状态LOOP5:

                 a.ndu_ovsdb_unlock_run释放ovsdb的锁

                 b.NDU_STATE_OVSDB_UNLOCK->NDU_STATE_BR_RM_SRV_AND_SNOOP

    6.状态LOOP6:

                a.ndu_ctx.br_remove_services_and_snoop();

                           1)遍历所有bridge,获取punix:/usr/local/var/run/openvswitch/br-int.mgmt,并删除

                           2)bridge_remove_services_and_snoop ???不清楚作用。

               b.NDU_STATE_BR_RM_SRV_AND_SNOOP->NDU_STATE_PID_FILE

   7.状态LOOP7:

                a.ndu_pid_file_run(&fsm->ctx.pid_ctx); ????(不清楚,从代码理解是为了在exit时,触发删除文件)

                b.NDU_STATE_PID_FILE -> NDU_STATE_SYNC

                c.ndu_sync_trans_connect_and_run(&fsm->ctx.sync_ctx)

    1. NDU_STATE_SYNC-->NDU_STATE_FLOW_SYNC

 8.状态LOOP8:同步流表配置,同步成功后,

               a. ndu_flow_sync_connect_and_run(&fsm->ctx.flow_ctx)

               b. DNU_STATE_FLOW_SYNC->NDU_STATE_PMD_PAUSE

              c. ndu_set_pmd_pause

                   1)设置other_config状态pmd-pause为true

            d. NDU_STATE_PMD_PAUSE->NDU_STATE_VHOST_CONNECT_FORBID

            e. ndu_forbid_vhostuser_connect

            f. NDU_STATE_VHOST_CONNECT_FORBID->NDU_STATE_STAGE1_FINISH

           g. ndu_flow_trans_destroy(&fsm->ctx.flow_ctx.trans);

           h . ndu_sync_trans_destroy(&fsm->ctx.sync_ctx.trans);

 

老进程状态变化。
至此stage1阶段完成。新老进程进入stage2
 
源代码路径:
https://gitlab.ctyun.cn/os/basic/ovs/-/merge_requests/97/diffs#863756805d3d7c670cfa13da511591c2585e635b
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
1
0