ovsdb <10> Ops-cli结合ovsdb部分流程及接口分析

4.6Ops-cli结合ovsdb部分流程及接口分析
Ops中对于ovsdb的应用主要是基于上述的ovsdb的简单用法上的一个扩展和函数封装,现在就其与之前不同的地方做补充说明并就各个函数的使用做相应的说明。
根据前面的ovsdb的数据结构描述可知,在ops-cli中我们主要是以idl来处理server中的ovsdb的信息,这里简单说明下几个结构挂接的关系:
4.6.1 ovsdb_idl_create
Ovsdb_idl结构的创建和ovsdb相关信息的初始化,这里简要说明该函数接口的用途及功能:
1、初始化其class信息,初始化为全局class;
2、初始化session,供后期transaction时的jsonrpc使用;
3、初始化table_by_name,然后为database中的所有table分配内存,然后将这些ovsdb_idl_table信息以table name(table name在全局定义号的ovsdb_idl_table_class中查找)为hash值add到table_by_name中,这些ovsdb_idl_table中包含了各自的ovsdb_idl_table_class信息,它们和ovsdb_idl_table是一一对应的关系;
4、初始化ovsdb_idl_table中的column项(这里column是根据schema定义好的数组,不用再重新分配内存),将每个ovsdb_idl_table的所有的columns以column name为hash索引add到初始化好的column中;
5、初始化table的row的hmap结构,用于存储ovsdb_idl_row各个节点的hash结构,初始时为null;
6、将每个table的idl值初始化为创建的idl结构,idl与其他所有的table的idl值相同;
7、初始化outstanding_txns,用于transaction操作中的hmap,这里每次transaction一次,就会将txn->hmap_node insert到其中一次,而其他操作比如abort、destroy等均会执行remove操作,这里不涉及到table的操作;

使用说明:该函数需要在最开始的初始化的时候进行调用并得到全局的idl结构和初始化database相关的信息,供后续使用,所需的四个参数分别为db.sock的路径、全局初始好的ovsdb_idl_class(自动创建)、ture(这里可以为true或者false,true表示缺省monitor所有的表项,如果为false,那么我们需要再手动添加部分table和column)、true;另外注意该函数还需要配合ovsdb_idl_run使用(源代码中是使用重新创建一个线程来完成的,下面分析该函数的作用);

4.6.2 ovsdb_idl_txn_create
根据前面初始化好的ovsdb_idl将ovsdb_idl_txn结构进行初始化;
1、为ovsdb_idl_txn分配内存并与ovsdb_idl中的ovsdb_idl_txn关联起来,同时ovsdb_idl_txn中的idl也合ovsdb_idl关联起来;
2、初始化ovsdb_idl_txn中的txn_rows结构;该结构主要用于存储ovsdb_idl_row中的txn_node节点;
3、初始化ovsdb_idl_txn中的inserted_rows,这里只有新的row需要insert到database的时候才会重新分配这个ovsdb_idl_txn_insert,后续会根据transaction返回来的reply结果将inserted_rows中的real uuid值赋值为实际的uuid值;

使用说明:该函数实际上是经过cli_do_config_start进行封装的,使用的时候直接使用cli_do_config_start即可,无需使用参数;

4.6.3 ovsdb_idl_txn_commit
完成ovsdb的transaction操作:
1、创建以database name为第一个参数的json array的operations;
2、根据ovsdb_idl_row中的old和new来需要如何向ovsdb server发送transaction操作,并生成相应的op的json格式,并将该op加入到上面的operations中;
3、如果需要update,此时将上面的operations做transaction操作,transaction成功时会将ovsdb_idl_txn的hmap_node节点存放在ovsdb_idl的outstanding_txns中(当每个ovsdb_idl_txn的transaction完成的时候就会完成上述的hmap_insert操作,当destroy或者abort发生时就会将其remove);
4、transaction之后,我们需要做的事情有:将所有的ovsdb_idl_row的txn_node的节点都从ovsdb_idl_txn中移除(如果old是为null的,那么也需要将ovsdb_idl_row的hmap_node节点从ovsdb_idl_table中移除并将其释放掉);释放ovsdb_idl_txn的txn_rows结构,并重新初始化,为后续的transaction来使用;

使用说明:该函数的参数为ovsdb_idl_txn,即4.6.2中创建的结构,在实际的使用中是cli_do_config_finish封装好的函数;

4.6.4 ovsdb_idl_run
完成ovsdb相关的操作,主要是处理ovsdb server回应给client的消息或者它们之间的信息交互,可能引起本地IDL的内容的改变,改变的内容就是和ovsdb server的内容同步的信息:
1、完成idl中的session的连接(为后续的transaction做准备),注意这里会改变idl中的state_seqno,它和session中的seqno做类比,这里如果不同,那么会重新将state_seqno和seqno做同步,并且开始发送get_schema的request;
2、接收ovsdb server的reply,如果为之前的get_schema的reply那么就会对database发送monitor的request(为后续的表项的变化,server通知client和同步本地、server的database提供了可能),如果为update消息,那么就会根据reply中的result对本地的idl中的内容做变更,这里实际上就是对ovsdb_idl_row中的内容做更新,如果之前该row存在则直接做修改,如果不存在则重新创建ovsdb_idl_row结构并重新insert到table中的rows结构中,如果为monitor消息,同样会和上述一样update本地的idl内容;

使用说明:参见4.6.1的使用说明;

4.6.5 ovsrec_相关函数说明
这一部分函数为python自动生成的函数,这一部分函数实际上是由我们自己设计的schema文件根据规则自动生成的和表项操作相关的函数,均是由ovsrec_开头的函数,一般使用较多的有以下几类;
1、ovsrec_
insert:由txn生成对应的ovsdb_idl_row表项并和相应的table关联起来,最后的返回值为我们定义的table相关的结构体,该结构体可作为后续的命令行对对应的表项的操作的参数;
2、ovsrec
set:用于对对应的table中的各项赋值操作,
3、ovsrec_
delete:用于删除对应的table中的各项操作;
4、ovsrec
*_first:用于查找IDL中是否有table项,返回table中的first row,同时也可以和IDL组合查找其余的row;

使用说明:可以参见ops中命令行处理时的代码;

4.6.6 show running设计方案
这一部分在ops中也提及了一个设计方案,现将设计方案做如下描述:
1、为每一个app执行一个install函数install_show_run_config_context;
2、Show running实现的函数vtysh_sh_run_iteratecontextlist,该函数主要就是完成show running的所有操作,主要的操作都是在1中实现的,包括初始化,show running和exit等;

下面为wuheshi记录:

1:写.ovsschema文件时遇到的问题,自己遇到的问题
Columns 下面的row名称不能有- 平杠,单个类型介绍不需要加点,table之间要加点。

2:在vtysh_ovsdb_if.c中进行ovsdb的初始化工作:ovsdb_init – 把相关表和表条目加入到idl缓存中。

3:DEFUN中命令包裹三层就会出现段错误。
如 : [(a|b|c)]
4:linux下打印64位int型 用’%lld”

5:ovsdb/SPEC文件定义了ovsdb的表规范,创建一个db时,需要预先准备好一个schema文件,该文件是一个JSON格式的字符串,定义了db名字,包含的所有表;每张表都包含一个columns的JSON dict,通过这个schema文件(e.g. vswitchd/vswitch.ovsschema)来创建一个db file。因此ovsdb实际是个文件数据库

6:设计表的时候主要考虑
1:设置是否方便
2:取出来比较是否方便
3:是否节约内存

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值