DAOS 源碼解析之 daos_pool
DAOS (Distributed Asynchronous Object Storage) 是一個開源的對象存儲系統(tǒng),專為大規(guī)模分布式非易失性內(nèi)存設(shè)計,利用了 SCM 和 NVMe 等的下一代 NVM 技術(shù)。 DAOS 同時在硬件之上提供了鍵值存儲接口,提供了諸如事務(wù)性非阻塞 I/O、具有自我修復(fù)的高級數(shù)據(jù)保護(hù)、端到端數(shù)據(jù)完整性、細(xì)粒度數(shù)據(jù)控制和彈性存儲的高級數(shù)據(jù)保護(hù),從而優(yōu)化性能并降低成本。
本文以 Release 1.1.4 版本為標(biāo)準(zhǔn),解析 include/daos_pool.h 中的具體實(shí)現(xiàn)。include/daos_pool.h 包含了 DAOS Stoarge Pool 相關(guān)的類型和函數(shù)。有關(guān) Pool 的具體信息可參考 DAOS 分布式異步對象存儲|存儲模型 DAOS Pool 一節(jié)和 DAOS 分布式異步對象存儲|Pool。
Storage Target
Target 的類型有 4 種:
typedef enum { // 未知 DAOS_TP_UNKNOWN, // 機(jī)械硬盤 DAOS_TP_HDD, // 閃存 DAOS_TP_SSD, // 持久內(nèi)存 DAOS_TP_PM, // 易失性內(nèi)存 DAOS_TP_VM, } daos_target_type_t;
Target 當(dāng)前的狀態(tài)有 6 種:
typedef enum { // 未知 DAOS_TS_UNKNOWN, // 不可用 DAOS_TS_DOWN_OUT, // 不可用,可能需要重建 DAOS_TS_DOWN, // 啟動 DAOS_TS_UP, // 啟動并運(yùn)行 DAOS_TS_UP_IN, // Pool 映射改變導(dǎo)致的中間狀態(tài) DAOS_TS_NEW, // 正在被清空 DAOS_TS_DRAIN, } daos_target_state_t;
結(jié)構(gòu)體daos_target_perf_t 用于描述 Target 的性能:
typedef struct { // TODO: 存儲/網(wǎng)絡(luò)帶寬、延遲等 int foo; } daos_target_perf_t;
結(jié)構(gòu)體 daos_space 表示 Pool Target 的空間使用情況:
struct daos_space { // 全部空間(字節(jié)) uint64_t s_total[DAOS_MEDIA_MAX]; // 空閑空間(字節(jié)) uint64_t s_free[DAOS_MEDIA_MAX]; };
其中,DAOS_MEDIA_MAX 表示存儲空間介質(zhì)的數(shù)量,一共有兩種:
enum { DAOS_MEDIA_SCM = 0, DAOS_MEDIA_NVME, DAOS_MEDIA_MAX };
即 s_total[DAOS_MEDIA_SCM] 和 s_free[DAOS_MEDIA_SCM] 表示 SCM (Storage-Class Memory) 的使用信息,s_total[DAOS_MEDIA_NVME] 和 s_free[DAOS_MEDIA_NVME] 表示 NVMe (Non-Volatile Memory express) 的使用信息。
結(jié)構(gòu)體 daos_target_info_t 表示 Target 的信息:
typedef struct { // 類型 daos_target_type_t ta_type; // 狀態(tài) daos_target_state_t ta_state; // 性能 daos_target_perf_t ta_perf; // 空間使用情況 struct daos_space ta_space; } daos_target_info_t;
Storage Pool
結(jié)構(gòu)體 daos_pool_space 表示 Pool 的空間使用情況:
struct daos_pool_space { // 所有活動的 Target 的聚合空間 struct daos_space ps_space; // 所有 Target 中的最大可用空間(字節(jié)) uint64_t ps_free_min[DAOS_MEDIA_MAX]; // 所有 Target 中的最小可用空間(字節(jié)) uint64_t ps_free_max[DAOS_MEDIA_MAX]; // Target 平均可用空間(字節(jié)) uint64_t ps_free_mean[DAOS_MEDIA_MAX]; // Target(VOS, Versioning Object Store) 數(shù)量 uint32_t ps_ntargets; uint32_t ps_padding; };
結(jié)構(gòu)體 daos_rebuild_status 表示重建狀態(tài):
struct daos_rebuild_status { // Pool 映射在重建過程中的版本或上一個完成重建的版本 uint32_t rs_version; // 重建的時間(秒) uint32_t rs_seconds; // 重建錯誤的錯誤碼 int32_t rs_errno; // 重建是否完成 // 該字段只有在 rs_version 非 0 時有效 int32_t rs_done; // 重建狀態(tài)的填充 int32_t rs_padding32; // 失敗的 rank int32_t rs_fail_rank; // 要重建的對象總數(shù),它不為 0 并且在重建過程中增加 // 當(dāng) rs_done = 1 時,它將不再更改,并且應(yīng)等于 rs_obj_nr // 使用 rs_toberb_obj_nr 和 rs_obj_nr,用戶可以知道重建的進(jìn)度 uint64_t rs_toberb_obj_nr; // 重建的對象數(shù)量,該字段非 0 當(dāng)且僅當(dāng) rs_done = 1 uint64_t rs_obj_nr; // 重建的記錄數(shù)量,該字段非 0 當(dāng)且僅當(dāng) rs_done = 1 uint64_t rs_rec_nr; // 重建的空間開銷 uint64_t rs_size; };
daos_pool_info_bit 表示 Pool 信息查詢位:
enum daos_pool_info_bit { // 如果為真,查詢 Pool 的空間使用情況 DPI_SPACE = 1ULL << 0, // 如果為真,查詢重建狀態(tài) DPI_REBUILD_STATUS = 1ULL << 1, // 查詢所有的可選信息 DPI_ALL = -1, };
結(jié)構(gòu)體 daos_pool_info_t 表示 Pool 的信息:
typedef struct { // UUID uuid_t pi_uuid; // Target 數(shù)量 uint32_t pi_ntargets; // Node 數(shù)量 uint32_t pi_nnodes; // 不活躍的 Target 數(shù)量 uint32_t pi_ndisabled; // 最新的 Pool 映射版本 uint32_t pi_map_ver; // 當(dāng)前的 Raft Leader uint32_t pi_leader; // Pool 信息查詢位,其值為枚舉類型 daos_pool_info_bit uint64_t pi_bits; // 空間使用情況 struct daos_pool_space pi_space; // 重建狀態(tài) struct daos_rebuild_status pi_rebuild_st; } daos_pool_info_t;
對于每個 daos_pool_query() 調(diào)用,將始終查詢基本 Pool 信息,如從 pi_uuid 到 pi_leader 的字段。但是 pi_space 和 pi_rebuild_st 是基于 pi_bits 的可選查詢字段。
結(jié)構(gòu)體 daos_pool_cont_info 表示 Pool Container 的信息:
struct daos_pool_cont_info { // UUID uuid_t pci_uuid; };
daos_pool_connect
daos_pool_connect 函數(shù)連接到由 UUID uuid 標(biāo)識的 DAOS Pool。
成功執(zhí)行后,poh 返回 Pool 句柄,info 返回最新的 Pool 信息。
參數(shù):
uuid [in]:標(biāo)識 Pool 的 UUID。
grp [in]:管理 Pool 的 DAOS 服務(wù)器的進(jìn)程集合名稱。
flags [in]:由 DAOS_PC_ 位表示的連接模式。
poh [out]:返回的打開句柄。
info [in, out]:可選參數(shù),返回的 Pool 信息,參考枚舉類型 daos_pool_info_bit。
ev [in]:結(jié)束事件,該參數(shù)是可選的,可以為 NULL。當(dāng)該參數(shù)為 NULL 時,該函數(shù)在阻塞模式下運(yùn)行。
返回值,在非阻塞模式下會被寫入 ev::ev_error:
如果成功,返回 0。
如果失敗,返回
-DER_INVAL:無效的參數(shù)。
-DER_UNREACH:無法訪問網(wǎng)絡(luò)。
-DER_NO_PERM:沒有訪問權(quán)限。
-DER_NONEXIST:Pool 不存在。
int daos_pool_connect(const uuid_t uuid, const char *grp, unsigned int flags, daos_handle_t *poh, daos_pool_info_t *info, daos_event_t *ev) { daos_pool_connect_t *args; tse_task_t * task; int rc; // 判斷 *args 大小是否與 daos_pool_connect_t 的預(yù)期大小相等 DAOS_API_ARG_ASSERT(*args, POOL_CONNECT); if (!daos_uuid_valid(uuid)) // UUID 無效 return -DER_INVAL; // 創(chuàng)建新任務(wù) dc_pool_connect,并將其與輸入事件 ev 關(guān)聯(lián) // 如果事件 ev 為 NULL,則將獲取私有事件 rc = dc_task_create(dc_pool_connect, NULL, ev, &task); if (rc) // dc_task_create 成功返回 0,失敗返回負(fù)數(shù) return rc; // 從 task 中獲取參數(shù) args = dc_task_get_args(task); args->grp = grp; args->flags = flags; args->poh = poh; args->info = info; uuid_copy((unsigned char *)args->uuid, uuid); // 調(diào)度創(chuàng)建的任務(wù) task // 如果該任務(wù)的關(guān)聯(lián)事件是私有事件,則此函數(shù)將等待任務(wù)完成 // 否則它將立即返回,并通過測試事件或在 EQ 上輪詢找到其完成情況 // // 第二個參數(shù) instant 為 true,表示任務(wù)將立即執(zhí)行 return dc_task_schedule(task, true); }
Pool 的連接模式有三種,由 DAOS_PC_ 位表示:
// 以只讀模式連接 Pool #define DAOS_PC_RO (1U << 0) // 以讀寫模式連接 Pool #define DAOS_PC_RW (1U << 1) // 以獨(dú)占讀寫模式連接到 Pool // 如果當(dāng)前存在獨(dú)占 Pool 句柄,則不允許與 DSM_PC_RW 模式的連接。 #define DAOS_PC_EX (1U << 2) // 表示連接模式的位個數(shù) #define DAOS_PC_NBITS 3 // 連接模式位掩碼 #define DAOS_PC_MASK ((1U << DAOS_PC_NBITS) - 1)
結(jié)構(gòu)體 daos_pool_connect_t 表示 Pool 連接參數(shù):
typedef struct { // Pool 的 UUID uuid_t uuid; // 管理 Pool 的 DAOS 服務(wù)器的進(jìn)程集合名稱。 const char *grp; // 由 DAOS_PC_ 位表示的連接模式 unsigned int flags; // 返回的打開句柄 daos_handle_t *poh; // 可選,返回的 Pool 信息 daos_pool_info_t *info; } daos_pool_connect_t;
daos_pool_disconnect
daos_pool_disconnect 函數(shù)斷開 DAOS Pool 的連接。它應(yīng)該撤銷該 Pool 的所有打開的 Container 句柄。
參數(shù):
poh [in]:連接到 Pool 的句柄。
ev [in]:結(jié)束事件,該參數(shù)是可選的,可以為 NULL。當(dāng)該參數(shù)為 NULL 時,該函數(shù)在阻塞模式下運(yùn)行。
返回值,在非阻塞模式下會被寫入 ev::ev_error:
如果成功,返回 0。
如果失敗,返回
-DER_UNREACH:無法訪問網(wǎng)絡(luò)。
-DER_NO_HDL:Pool 句柄無效。
int daos_pool_disconnect(daos_handle_t poh, daos_event_t *ev) { daos_pool_disconnect_t *args; tse_task_t * task; int rc; // 判斷 *args 大小是否與 daos_pool_disconnect_t 的預(yù)期大小相等 DAOS_API_ARG_ASSERT(*args, POOL_DISCONNECT); // 創(chuàng)建新任務(wù) dc_pool_disconnect,并將其與輸入事件 ev 關(guān)聯(lián) // 如果事件 ev 為 NULL,則將獲取私有事件 rc = dc_task_create(dc_pool_disconnect, NULL, ev, &task); if (rc) // dc_task_create 成功返回 0,失敗返回負(fù)數(shù) return rc; // 從 task 中獲取參數(shù) args = dc_task_get_args(task); args->poh = poh; // 調(diào)度創(chuàng)建的任務(wù) task // 如果該任務(wù)的關(guān)聯(lián)事件是私有事件,則此函數(shù)將等待任務(wù)完成 // 否則它將立即返回,并通過測試事件或在 EQ 上輪詢找到其完成情況 // // 第二個參數(shù) instant 為 true,表示任務(wù)將立即執(zhí)行 return dc_task_schedule(task, true); }
結(jié)構(gòu)體 daos_pool_disconnect_t 表示斷開 Pool 連接到參數(shù):
typedef struct { // 打開的 Pool 句柄 daos_handle_t poh; } daos_pool_disconnect_t;
daos_pool_local2global
daos_pool_local2global 函數(shù)將本地 Pool 連接轉(zhuǎn)換為可與對等進(jìn)程共享的全局表示數(shù)據(jù)。
如果 glob->iov_buf 設(shè)置為 NULL,則通過 glob->iov_buf_len 返回全局句柄的實(shí)際大小。
此功能不涉及任何通信,也不阻塞。
參數(shù):
poh [in]:要共享的打開的 Pool 連接句柄。
glob [out]:指向 IO vector 緩沖區(qū)的指針,用于存儲句柄信息。
返回值,在非阻塞模式下:
如果成功,返回 0。
如果失敗:
-DER_INVAL:無效的參數(shù)。
-DER_NO_HDL:Pool 句柄無效。
-DER_TRUNC:glob 中的緩沖區(qū)過小,要求更大的緩沖區(qū)。在這種情況下,要求的緩沖區(qū)大學(xué)會被寫入 glob->iov_buf_len。
int daos_pool_local2global(daos_handle_t poh, d_iov_t *glob) { return dc_pool_local2global(poh, glob); }
daos_pool_global2local
daos_pool_global2local 函數(shù)為全局表示數(shù)據(jù)創(chuàng)建本地 Pool 連接。
參數(shù):
glob [in]:要提取的集合句柄的全局(共享)表示。
poh [out]:返回的本地 Pool 連接句柄。
返回值,在非阻塞模式下:
如果成功,返回 0。
如果失敗,返回
-DER_INVAL:無效的參數(shù)。
int daos_pool_global2local(d_iov_t glob, daos_handle_t *poh) { return dc_pool_global2local(glob, poh); }
daos_pool_query
daos_pool_query 函數(shù)查詢 Pool 信息。用戶應(yīng)至少提供 info 和 tgts 中的一個作為輸出緩沖區(qū)。
參數(shù):
poh [in]:Pool 連接句柄。
tgts [out]:可選,返回的 Pool 中的 Target。
info [in, out]:可選,返回的 Pool 信息,參考枚舉類型 daos_pool_info_bit。
pool_prop [out]:可選,返回的 Pool 屬性。
如果為空,則不需要查詢屬性。
如果 pool_prop 非空,但其 dpp_entries 為空,則將查詢所有 Pool 屬性,DAOS 在內(nèi)部分配所需的緩沖區(qū),并將指針分配給 dpp_entries。
如果 pool_prop 的 dpp_nr > 0 且 dpp_entries 非空,則會查詢特定的 dpe_type 屬性,DAOS 會在內(nèi)部為 dpe_str 或 dpe_val_ptr 分配所需的緩沖區(qū),如果具有立即數(shù)的 dpe_type 則會直接將其分配給 dpe_val。
用戶可以通過調(diào)用 daos_prop_free() 釋放關(guān)聯(lián)的緩沖區(qū)。
ev [in]:結(jié)束事件,該參數(shù)是可選的,可以為 NULL。當(dāng)該參數(shù)為 NULL 時,該函數(shù)在阻塞模式下運(yùn)行。
返回值,在非阻塞模式下:
如果成功,返回 0。
如果失敗:
-DER_INVAL:無效的參數(shù)。
-DER_UNREACH:無法訪問網(wǎng)絡(luò)。
-DER_NO_HDL:Pool 句柄無效。
int daos_pool_query(daos_handle_t poh, d_rank_list_t *tgts, daos_pool_info_t *info, daos_prop_t *pool_prop, daos_event_t *ev) { daos_pool_query_t *args; tse_task_t * task; int rc; // 判斷 *args 大小是否與 daos_pool_query_t 的預(yù)期大小相等 DAOS_API_ARG_ASSERT(*args, POOL_QUERY); if (pool_prop != NULL && !daos_prop_valid(pool_prop, true, false)) { // 無效輸入 D_ERROR("invalid pool_prop parameter.\n"); return -DER_INVAL; } // 創(chuàng)建新任務(wù) dc_pool_query,并將其與輸入事件 ev 關(guān)聯(lián) // 如果事件 ev 為 NULL,則將獲取私有事件 rc = dc_task_create(dc_pool_query, NULL, ev, &task); if (rc) // dc_task_create 成功返回 0,失敗返回負(fù)數(shù) return rc; // 從 task 中獲取參數(shù) args = dc_task_get_args(task); args->poh = poh; args->tgts = tgts; args->info = info; args->prop = pool_prop; // 調(diào)度創(chuàng)建的任務(wù) task // 如果該任務(wù)的關(guān)聯(lián)事件是私有事件,則此函數(shù)將等待任務(wù)完成 // 否則它將立即返回,并通過測試事件或在 EQ 上輪詢找到其完成情況 // // 第二個參數(shù) instant 為 true,表示任務(wù)將立即執(zhí)行 return dc_task_schedule(task, true); }
結(jié)構(gòu)體 daos_prop_t 表示 DAOS
Pool 或 Container 的屬性:
typedef struct { // 項(xiàng)的數(shù)量 uint32_t dpp_nr; // 保留供將來使用,現(xiàn)在用于 64 位對齊 uint32_t dpp_reserv; // 屬性項(xiàng)數(shù)組 struct daos_prop_entry *dpp_entries; } daos_prop_t;
DAOS Pool 的屬性類型包括:
enum daos_pool_props { // 在 (DAOS_PROP_PO_MIN, DAOS_PROP_PO_MAX) 范圍內(nèi)有效 DAOS_PROP_PO_MIN = 0, // 標(biāo)簽:用戶與 Pool 關(guān)聯(lián)的字符串 // default = "" DAOS_PROP_PO_LABEL, // ACL:Pool 的訪問控制列表 // 詳細(xì)說明用戶和組訪問權(quán)限的訪問控制項(xiàng)的有序列表。 // 期望的主體類型:Owner, User(s), Group(s), Everyone DAOS_PROP_PO_ACL, // 保留空間比例:每個 Target 上為重建目的保留的空間量。 // default = 0%. DAOS_PROP_PO_SPACE_RB, // 自動/手動 自我修復(fù) // default = auto // 自動/手動 排除 // 自動/手動 重建 DAOS_PROP_PO_SELF_HEAL, // 空間回收策略 = time|batched|snapshot // default = snapshot // time:時間間隔 // batched:commits // snapshot:快照創(chuàng)建 DAOS_PROP_PO_RECLAIM, // 充當(dāng) Pool 所有者的用戶 // 格式:user@[domain] DAOS_PROP_PO_OWNER, // 充當(dāng) Pool 所有者的組 // 格式:group@[domain] DAOS_PROP_PO_OWNER_GROUP, // Pool 的 svc rank list DAOS_PROP_PO_SVC_LIST, DAOS_PROP_PO_MAX, }; // Pool 屬性類型數(shù)量 #define DAOS_PROP_PO_NUM (DAOS_PROP_PO_MAX - DAOS_PROP_PO_MIN - 1)
結(jié)構(gòu)體 daos_pool_query_t 表示 Pool 查詢的參數(shù):
typedef struct { // 打開的 Pool 句柄 daos_handle_t poh; // 可選,返回的 Pool 中的 Target d_rank_list_t *tgts; // 可選,返回的 Pool 信息 daos_pool_info_t *info; // 可選,返回的 Pool 屬性 daos_prop_t *prop; } daos_pool_query_t;
daos_pool_query_target
daos_pool_query_target 函數(shù)在 DAOS Pool 中查詢 Target 信息。
參數(shù):
poh [in]:Pool 連接句柄。
tgt [in]:要查詢的單個 Target 的索引。
rank [in]:要查詢的 Target 索引的排名。
info [out]:返回的有關(guān) tgt 的信息。
ev [in]:結(jié)束事件,該參數(shù)是可選的,可以為 NULL。當(dāng)該參數(shù)為 NULL 時,該函數(shù)在阻塞模式下運(yùn)行。
返回值,在非阻塞模式下:
如果成功,返回 0。
如果失敗:
-DER_INVAL:無效的參數(shù)。
-DER_UNREACH:無法訪問網(wǎng)絡(luò)。
-DER_NO_HDL:Pool 句柄無效。
-DER_NONEXIST:指定 Target 上沒有 Pool。
int daos_pool_query_target(daos_handle_t poh, uint32_t tgt, d_rank_t rank, daos_target_info_t *info, daos_event_t *ev) { daos_pool_query_target_t *args; tse_task_t * task; int rc; // 判斷 *args 大小是否與 daos_pool_query_target_t 的預(yù)期大小相等 DAOS_API_ARG_ASSERT(*args, POOL_QUERY_INFO); // 創(chuàng)建新任務(wù) dc_pool_query_target,并將其與輸入事件 ev 關(guān)聯(lián) // 如果事件 ev 為 NULL,則將獲取私有事件 rc = dc_task_create(dc_pool_query_target, NULL, ev, &task); if (rc) // dc_task_create 成功返回 0,失敗返回負(fù)數(shù) return rc; // 從 task 中獲取參數(shù) args = dc_task_get_args(task); args->poh = poh; args->tgt_idx = tgt_idx; args->rank = rank; args->info = info; // 調(diào)度創(chuàng)建的任務(wù) task // 如果該任務(wù)的關(guān)聯(lián)事件是私有事件,則此函數(shù)將等待任務(wù)完成 // 否則它將立即返回,并通過測試事件或在 EQ 上輪詢找到其完成情況 // // 第二個參數(shù) instant 為 true,表示任務(wù)將立即執(zhí)行 return dc_task_schedule(task, true); }
結(jié)構(gòu)體 daos_pool_query_target_t 表示 Pool 的 Target 查詢參數(shù):
typedef struct { // 打開的 Pool 句柄 daos_handle_t poh; // 要查詢的單個 Target uint32_t tgt_idx; // 要查詢的 Target 的等級 d_rank_t rank; // 返回的 Target 信息 daos_target_info_t *info; } daos_pool_query_target_t;
daos_pool_list_attr
daos_pool_list_attr 函數(shù)列出所有用戶定義的 Pool 屬性的名稱。
參數(shù):
poh [in]:Pool 句柄。
buffer [out]:包含所有屬性名的串聯(lián)的緩沖區(qū),每個屬性名以空字符結(jié)尾。不執(zhí)行截斷,只返回全名。允許為 NULL,在這種情況下,只檢索聚合大小。
size [in, out]:
[in]:緩沖區(qū)大小。
[out]:所有屬性名(不包括終止的空字符)的聚合大小,忽略實(shí)際緩沖區(qū)大小。
ev [in]:結(jié)束事件,該參數(shù)是可選的,可以為 NULL。當(dāng)該參數(shù)為 NULL 時,該函數(shù)在阻塞模式下運(yùn)行。
int daos_pool_list_attr(daos_handle_t poh, char *buffer, size_t *size, daos_event_t *ev) { daos_pool_list_attr_t *args; tse_task_t * task; int rc; // 判斷 *args 大小是否與 daos_pool_list_attr_t 的預(yù)期大小相等 DAOS_API_ARG_ASSERT(*args, POOL_LIST_ATTR); // 創(chuàng)建新任務(wù) dc_pool_list_attr,并將其與輸入事件 ev 關(guān)聯(lián) // 如果事件 ev 為 NULL,則將獲取私有事件 rc = dc_task_create(dc_pool_list_attr, NULL, ev, &task); if (rc) // dc_task_create 成功返回 0,失敗返回負(fù)數(shù) return rc; // 從 task 中獲取參數(shù) args = dc_task_get_args(task); args->poh = poh; args->buf = buf; args->size = size; // 調(diào)度創(chuàng)建的任務(wù) task // 如果該任務(wù)的關(guān)聯(lián)事件是私有事件,則此函數(shù)將等待任務(wù)完成 // 否則它將立即返回,并通過測試事件或在 EQ 上輪詢找到其完成情況 // // 第二個參數(shù) instant 為 true,表示任務(wù)將立即執(zhí)行 return dc_task_schedule(task, true); }
結(jié)構(gòu)體 daos_pool_list_attr_t 表示 Pool 列出屬性參數(shù):
typedef struct { // 打開的 Pool 句柄 daos_handle_t poh; // 包含所有屬性名的串聯(lián)的緩沖區(qū) char *buf; // [in]:緩沖區(qū)大小 // [out]:所有屬性名(不包括終止的空字符)的聚合大小 size_t *size; } daos_pool_list_attr_t;
daos_pool_get_attr
daos_pool_get_attr 函數(shù)獲取用戶定義的 Pool 屬性值列表。
參數(shù):
poh [in]:Pool 句柄。
n [in]:屬性的數(shù)量。
names [in]:存儲以空字符結(jié)尾的屬性名的 n 個數(shù)組。
buffer [out]:存儲屬性值的 n 個緩沖區(qū)的數(shù)組。大于相應(yīng)緩沖區(qū)大小的屬性值將被截斷。允許為 NULL,將被視為與零長度緩沖區(qū)相同,在這種情況下,只檢索屬性值的大小。
sizes [in, out]:
[in]:存儲緩沖區(qū)大小的 n 個數(shù)組。
[out]:存儲屬性值實(shí)際大小的 n 個數(shù)組,忽略實(shí)際緩沖區(qū)大小。
ev [in]:結(jié)束事件,該參數(shù)是可選的,可以為 NULL。當(dāng)該參數(shù)為 NULL 時,該函數(shù)在阻塞模式下運(yùn)行。
int daos_pool_get_attr(daos_handle_t poh, int n, char const *const names[], void *const buffers[], size_t sizes[], daos_event_t *ev) { daos_pool_get_attr_t *args; tse_task_t * task; int rc; // 判斷 *args 大小是否與 daos_pool_get_attr_t 的預(yù)期大小相等 DAOS_API_ARG_ASSERT(*args, POOL_GET_ATTR); // 創(chuàng)建新任務(wù) dc_pool_get_attr,并將其與輸入事件 ev 關(guān)聯(lián) // 如果事件 ev 為 NULL,則將獲取私有事件 rc = dc_task_create(dc_pool_get_attr, NULL, ev, &task); if (rc) // dc_task_create 成功返回 0,失敗返回負(fù)數(shù) return rc; // 從 task 中獲取參數(shù) args = dc_task_get_args(task); args->poh = poh; args->n = n; args->names = names; args->values = values; args->sizes = sizes; // 調(diào)度創(chuàng)建的任務(wù) task // 如果該任務(wù)的關(guān)聯(lián)事件是私有事件,則此函數(shù)將等待任務(wù)完成 // 否則它將立即返回,并通過測試事件或在 EQ 上輪詢找到其完成情況 // // 第二個參數(shù) instant 為 true,表示任務(wù)將立即執(zhí)行 return dc_task_schedule(task, true); }
結(jié)構(gòu)體 daos_pool_get_attr_t 表示 Pool 獲取屬性的參數(shù):
typedef struct { // 打開的 Pool 句柄 daos_handle_t poh; // 屬性數(shù)量 int n; // 存儲 n 個以空字符結(jié)尾的屬性名的 char const *const *names; // 存儲 n 個屬性值的緩沖區(qū) void *const *values; // [in]:存儲 n 個緩沖區(qū)大小 // [out]:存儲 n 個屬性值實(shí)際大小 size_t *sizes; } daos_pool_get_attr_t;
daos_pool_set_attr
daos_pool_set_attr 函數(shù)創(chuàng)建或更新用戶定義的 Pool 屬性值列表。
參數(shù):
poh [in]:Pool 句柄。
n [in]:屬性的數(shù)量。
names [in]:存儲以空字符結(jié)尾的屬性名的 n?個數(shù)組。
values [in]:存儲屬性值的 n 個數(shù)組。
sizes [in]:存儲相應(yīng)屬性值大小的 n?個元素的數(shù)組。
ev [in]:結(jié)束事件,該參數(shù)是可選的,可以為 NULL。當(dāng)該參數(shù)為 NULL 時,該函數(shù)在阻塞模式下運(yùn)行。
int daos_pool_set_attr(daos_handle_t poh, int n, char const *const names[], void const *const values[], size_t const sizes[], daos_event_t *ev) { daos_pool_set_attr_t *args; tse_task_t * task; int rc; // 判斷 *args 大小是否與 daos_pool_set_attr_t 的預(yù)期大小相等 DAOS_API_ARG_ASSERT(*args, POOL_SET_ATTR); // 創(chuàng)建新任務(wù) dc_pool_set_attr,并將其與輸入事件 ev 關(guān)聯(lián) // 如果事件 ev 為 NULL,則將獲取私有事件 rc = dc_task_create(dc_pool_set_attr, NULL, ev, &task); if (rc) // dc_task_create 成功返回 0,失敗返回負(fù)數(shù) return rc; // 從 task 中獲取參數(shù) args = dc_task_get_args(task); args->poh = poh; args->n = n; args->names = names; args->values = values; args->sizes = sizes; // 調(diào)度創(chuàng)建的任務(wù) task // 如果該任務(wù)的關(guān)聯(lián)事件是私有事件,則此函數(shù)將等待任務(wù)完成 // 否則它將立即返回,并通過測試事件或在 EQ 上輪詢找到其完成情況 // // 第二個參數(shù) instant 為 true,表示任務(wù)將立即執(zhí)行 return dc_task_schedule(task, true); }
結(jié)構(gòu)體 daos_pool_set_attr_t 表示 Pool 設(shè)置屬性的參數(shù):
typedef struct { // 打開的 Pool 句柄 daos_handle_t poh; // 屬性的數(shù)量 int n; // 存儲 n 個以空字符結(jié)尾的屬性名 char const *const *names; // 存儲 n 個屬性值 void const *const *values; // 存儲 n 個相應(yīng)屬性值的大小。 size_t const *sizes; } daos_pool_set_attr_t;
daos_pool_del_attr
daos_pool_del_attr 函數(shù)刪除用戶定義的 Pool 屬性值列表。
參數(shù):
poh [in]:Pool 句柄。
n [in]:屬性的數(shù)量。
names [in]:存儲以空字符結(jié)尾的屬性名的 n 個數(shù)組。
ev [in]:結(jié)束事件,該參數(shù)是可選的,可以為 NULL。當(dāng)該參數(shù)為 NULL 時,該函數(shù)在阻塞模式下運(yùn)行。
返回值,在非阻塞模式下會被寫入 ev::ev_error:
如果成功,返回 0。
如果失敗,返回
-DER_INVAL:無效的參數(shù)。
-DER_UNREACH:無法訪問網(wǎng)絡(luò)。
-DER_NO_PERM:沒有訪問權(quán)限。
-DER_NO_HDL:無效的 Container 句柄。
-DER_NOMEM:內(nèi)存不足。
int daos_pool_del_attr(daos_handle_t poh, int n, char const *const names[], daos_event_t *ev) { daos_pool_del_attr_t *args; tse_task_t * task; int rc; // 判斷 *args 大小是否與 daos_pool_del_attr_t 的預(yù)期大小相等 DAOS_API_ARG_ASSERT(*args, POOL_DEL_ATTR); // 創(chuàng)建新任務(wù) dc_pool_del_attr,并將其與輸入事件 ev 關(guān)聯(lián) // 如果事件 ev 為 NULL,則將獲取私有事件 rc = dc_task_create(dc_pool_del_attr, NULL, ev, &task); if (rc) // dc_task_create 成功返回 0,失敗返回負(fù)數(shù) return rc; // 從 task 中獲取參數(shù) args = dc_task_get_args(task); args->poh = poh; args->n = n; args->names = names; // 調(diào)度創(chuàng)建的任務(wù) task // 如果該任務(wù)的關(guān)聯(lián)事件是私有事件,則此函數(shù)將等待任務(wù)完成 // 否則它將立即返回,并通過測試事件或在 EQ 上輪詢找到其完成情況 // // 第二個參數(shù) instant 為 true,表示任務(wù)將立即執(zhí)行 return dc_task_schedule(task, true); }
結(jié)構(gòu)體 daos_pool_del_attr_t 表示 Pool 刪除屬性的參數(shù):
typedef struct { // 打開的 Pool 句柄 daos_handle_t poh; // 屬性的數(shù)量 int n; // 存儲 n 個以空字符結(jié)尾的屬性名 char const *const *names; } daos_pool_del_attr_t;
daos_pool_list_cont
daos_pool_list_cont 函數(shù)列出 Pool 的 Container。
參數(shù):
poh [in]:Pool 連接句柄。
ncont [in, out]:
[in]:以元素為單位的 cbuf 長度。
[out]:Pool 中的 Container 數(shù)量。
cbuf [out]:存儲 Container 結(jié)構(gòu)的數(shù)組。允許為 NULL,在這種情況下只會講 Container 的數(shù)量寫入 ncont 返回。
ev [in]:結(jié)束事件,該參數(shù)是可選的,可以為 NULL。當(dāng)該參數(shù)為 NULL 時,該函數(shù)在阻塞模式下運(yùn)行。
返回值:
如果成功,返回 0。
如果失敗,返回
-DER_INVAL:無效的參數(shù)。
-DER_TRUNC:cbuf 沒有足夠的空間存儲 ncont 個元素。
int daos_pool_list_cont(daos_handle_t poh, daos_size_t *ncont, struct daos_pool_cont_info *cbuf, daos_event_t *ev) { daos_pool_list_cont_t *args; tse_task_t * task; int rc; // 判斷 *args 大小是否與 daos_pool_list_cont_t 的預(yù)期大小相等 DAOS_API_ARG_ASSERT(*args, POOL_LIST_CONT); if (ncont == NULL) { // 無效輸入 D_ERROR("ncont must be non-NULL\n"); return -DER_INVAL; } // 創(chuàng)建新任務(wù) dc_pool_list_cont,并將其與輸入事件 ev 關(guān)聯(lián) // 如果事件 ev 為 NULL,則將獲取私有事件 rc = dc_task_create(dc_pool_list_cont, NULL, ev, &task); if (rc) // dc_task_create 成功返回 0,失敗返回負(fù)數(shù) return rc; // 從 task 中獲取參數(shù) args = dc_task_get_args(task); args->poh = poh; args->ncont = ncont; args->cont_buf = cbuf; // 調(diào)度創(chuàng)建的任務(wù) task // 如果該任務(wù)的關(guān)聯(lián)事件是私有事件,則此函數(shù)將等待任務(wù)完成 // 否則它將立即返回,并通過測試事件或在 EQ 上輪詢找到其完成情況 // // 第二個參數(shù) instant 為 true,表示任務(wù)將立即執(zhí)行 return dc_task_schedule(task, true); }
相關(guān)信息
Emai: debugzhang@163.com
DAOS: https://github.com/daos-stack/daos
分布式 存儲 對象存儲服務(wù) OBS
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。