dmeventd在thin 裝置自動擴容的作用

2021-09-11 10:46:35 字數 2817 閱讀 4101

註冊事件(register_for_event):

在初始化的時候去註冊乙個事件。包括註冊事件程序id ,q序列號,初始化事件定義為dm_event_cmd_hello。註冊的id和q都是關於程序的 ,是為了作為客戶端的dmevrntd程序在獲取到動態連線庫的呼叫之後,才事件有真正的事件註冊,即:

int _register_for_event(struct message_data *message_data);

函式主要引數struct message_data *message_data,傳遞了

struct message_data ;

events_str表示乙個事件,比如是dm_event_error_mask事件標誌。 dm_event_mask events_field表示事件的某乙個,具體舉例子比如事件 dm_event_mask events_field的值等於

dm_event_error_mask | dm_event_timeout。

該函式實現的功能是註冊乙個事件裝置用於記錄事件的標誌,啟用乙個計時執行緒,用於監控裝置的元資料和資料的讀寫情況和百分比。呼叫到的函式有

_fill_device_data(thread_new)獲取執行緒需要的裝置名device_name,主次裝置號,uuid。_do_register_device(thread_new)獲取裝置的lv和vg名以及最小擴充套件的百分比50%。

metadata_percent_check = check_minimum;

state->data_percent_check = check_minimum;

_create_thread(thread)啟用乙個監控執行緒,用來迴圈等待或解析擴充套件或者縮減事件

登出事件(unregister_for_event)和註冊事件(register_for_event,)事件一起在lvm初始的時候被定義和登出/註冊。

獲取註冊事件的裝置(get_registered_device):

evmask是實踐標誌和程序啟用和關閉情況,從lvchange(struct cmd_context *cmd, int argc, char **ar**)呼叫檢視dmeventd執行緒是否在active或者其他的狀態,以便獲取到裝置事件

裝置事件監督執行緒:

_pthread_create_smallstack(&thread->thread, _monitor_thread, thread);

乙個引數是建立執行緒需要的執行緒id,第二引數是建立執行緒的執行函式,引數是建立執行緒的函式呼叫的傳參。

_monitor_thread執行緒功能:迴圈等待和解析裝置事件。

dmeventd執行緒的工作任務:等待事件(_event_wait)/判斷事件(if.....)/處理事件

1事件等待_event_wait

過程:為事件的task設定task裝置uuid和事件event_nr。

dmt = dm_task_create(dm_device_waitevent)表示建立的事件為裝置迴圈等待事件。

dm_task_set_event_nr(dmt, thread->event_nr)

在裝置元資料或者裝置使用完畢,即裝置元資料和資料的使用率有乙個達到百分之百的時候dm_task_run(dmt)呼叫從核心返回乙個infor事件,設定執行緒事件為thread->current_events |= dm_event_device_error;在正常裝置元資料和裝置寫佔用率未達到百分之百的時候設定當前執行緒thread->current_events |= dm_event_timeout;

在迴圈等待事件之後獲取裝置的狀態

_get_device_status(thread)然後_do_process_event

2處理事件_do_process_event;

thread->current_events |= dm_event_timeout事件超時的時候,等待事件的判斷依據:

ioctl_errno = dm_task_get_errno(dmt);

if (thread->events & dm_event_timeout && ioctl_errno == eintr)

如果是擴充套件失敗:比如儲存池寫滿,就是擴充套件失敗,不能在擴充套件,這個時候的做法就是:

_umount(dmt, device)->_umount_device->execvp(cmd, (char **)ar**).最後的函式就是umount命令的執行函式,找到檔案執行解掛載。

同時設定擴充套件的百分比為0,讓裝置不能再擴充套件。

2>進行擴充套件。

static struct logical_volume *_lvresize_volume 發生擴充套件的地方是:

} else if ((lp->extents > lv->le_count) && /* ensure we extend */

!lv_extend(lv, lp->segtype,

lp->stripes, lp->stripe_size,

lp->mirrors, first_seg(lv)->region_size,

lp->extents - lv->le_count,

return_null;

if (lp->sizeargs &&

!(lock_lv = _lvresize_volume(cmd, lv, lp, pvh)))//精簡卷和精簡池擴充套件

return_0;

if (lp->poolmetadataextents)

ESXi6 在Thin 配置的LUN上釋放儲存空間

下面是具體操作的步驟。nimble 本身支援powershell,所以我可以通過指令碼或者圖形介面來進行對比。首先看看ps的指令碼 connect nsgroup group 10.1.1.23 credential abc admin ignoreservercertificate report ...

ESXi6 在Thin 配置的LUN上釋放儲存空間

下面是具體操作的步驟。nimble 本身支援powershell,所以我可以通過指令碼或者圖形介面來進行對比。首先看看ps的指令碼 connect nsgroup group 10.1.1.23 credential abc admin ignoreservercertificate report ...

RN在裝置上執行

以window android環境為例。啟動手機的 usb除錯 功能 手機與電腦相連,然後執行adb devices來檢查裝置是否連線到了adb上 執行 react native run android 來把應用安裝到手機上。如果要安裝乙個release版的,需要加上引數 variant relea...