天天看點

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、ovsrecset:用于對對應的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:是否節約記憶體