2017年3月4日 星期六

Glusterfs Crypt Ftruncate Extend File Size Trace Code Flow



ftruncate expend file fop
  • finodelk (whole file)
  • fgetxattr(get trusted.glusterfs.crypt.att.size value)
  • readv(rmw readv head block)
  • writev(write head block)
  • writev(write full block loop )
  • readv(rmw readv tail block)
  • writev(write tail block)
  • fsetxattr(update new file size)
  • finodelk(unlock file) 



finodelk: lock whole file
  1. Allocate GF_FOP_FTRUNCATE local datastruct
  2. Init local xattr dict
  3. Get inode info
  4. Set crypt algo info
  5. Set lock info (the lock whole file)
    • lock.l_len    = 0;
    • lock.l_start  = 0;
    • lock.l_type   = F_WRLCK;
    • lock.l_whence = SEEK_SET;
  6. 呼叫STACK_WIND finodelk去加鎖整個檔案


2017年3月3日 星期五

Linux 檔案鎖(File Locking)

檔案鎖(File Locking)


兩種不同的檔案鎖API
  • flock(): 對整個檔案上鎖
  • fcntl(): 對檔案區間上鎖
基本上兩種的通用流程都像是這樣
  1. 檔案上鎖
  2. 執行IO
  3. 檔案解鎖


因為stdio函式庫有自己的buffer, 所以搭配file locking要小心使用
  • 使用read()write()取代stdio函式庫的function來執行檔案IO
  • 在lock前先flush stdio stream, 在unlock之前也先flush stdio stream
  • 使用setbuf()來關閉stdio buffer



Flock:

flock()
int flock(int fd, int operation):
  • 會將整個檔案上鎖
  • operation參數有LOCK_SH, LOCK_EX和LOCK_UN, 可以利用OR(|)將LOCK_NB變成nonblock. flock()就不會被blocking, 會回傳-1.

2017年3月2日 星期四

Linux 檔案IO: 深入探討

檔案IO:  深入探討


atomicity and race condition


system call都是atomicity, kernel保證每個步驟在該操作內完成, 而不會受到其他process 或 thread中斷


open(pathname, O_CREAT | O_EXCL):
O_CREATE 和 O_EXCL的open()呼叫保證檢查和建立的步驟是在一個atomic操作中完成. 保證該檔案一定是由呼叫open()的process所建立的


Example:
若不使用O_CAEAT和O_EXCL的open()呼叫, 改使用呼叫兩次open()來執行程式. 第一次open(..., O_WRONLY)用來檢查該檔案存不存在. 第二次open(..., O_WRONLY | O_CREAT)用來建立檔案. 可能會造成以下的race condition.
Process A先呼叫open(.., O_WRONLY)來檢查檔案在不在. 發現檔案不在之後就被切換到Process B. Process B一樣先檢查檔案在不在, 發現不在之後接著就建立了新檔案.在切回Process A執行. Process A呼叫第二個open()就會以為是自己建立了檔案.
open(pathname, O_APPEND):
O_APPEND是指將offset移到檔案尾巴的下一個byte的位置.在寫入資料的時候,會把offset移到檔案尾巴. 基本上類似下面的程式碼

2017年2月27日 星期一

Linux 檔案IO: 通用的IO模型

檔案IO:  通用的IO模型

file descriptor:
全部執行IO操作的系統呼叫都是透過file descriptor去存取. 通常是一個非負的整數.每個process都有一組自己的file descriptor

一般process都會有以下三個file descriptor, 他們由繼承shell而來
file descriptor
用途
POSIX name
stdio stream
0
標準輸入
STDIN_FILENO
stdin
1
標準輸出
STDOUT_FILENO
stdout
2
標準錯誤
STDERR_FILENO
stderr

對於檔案呼叫IO操作有四個主要操作
  • open
  • read
  • write
  • close
這四個操作可以對於所有檔案進行IO操作, 包含terminial之類的裝置


2017年2月3日 星期五

Doxygen簡易使用(畫出c struct關係圖)

安裝Doxygen(ubuntu 14.04):
  • # sudo apt-get install doxygen
安裝web server(因為doxygen檔案以html形式呈現):
  • # sudo apt-get install apache2
    # sudo apt-get install graphviz
使用Doxygen:
  1. # sudo doxygen -g DOXYGEN_CONFIG_FILE
  2. # sudo vim DOXYGEN_CONFIG_FILE
  3. # sudo doxygen DOXYGEN_CONFIG_FILE
     
修改DOXYGEN_CONFIG_FILE內容
  • PROJECT_NAME           = "glusterfs"
  • PROJECT_NUMBER         = 3.8.3
  • OUTPUT_DIRECTORY       = /var/www         //產生文件的folder
  • CREATE_SUBDIRS         = YES
  • ALLOW_UNICODE_NAMES    = YES
  • OUTPUT_LANGUAGE        = English
  • FULL_PATH_NAMES        = YES
  • INPUT                  = /root/glusterfs  //source code的folder
  • RECURSIVE              = YES
  • HAVE_DOT               = YES
  • CALL_GRAPH             = YES
  • CALLER_GRAPH           = YES