KFS給出的測試程序中,所有的測試都是針對單獨的讀文件操作和單獨的寫文件操作進行的測試,然後讀文件和寫文件交叉進行會出現什麼現象呢?
在讀文件之後馬上進行寫文件,會造成系統阻塞!
測試:
在一個程序中創建一個新文件或者打開一個原有文件,然後對該文件進行以下序列的操作:寫->讀->寫->讀。
運行過程:
GETLAYOUT
SIZE
ALLOCATE
SIZE
WRITE_ID_ALLOC
WRITE_PREPARE
data transfer...
WRITE_SYNC
LEASE_ACQUIRE
READ
WRITE_ID_ALLOC
WRITE_PREPARE
data transfer...
WRITE_SYNC XXX:-1001
結果:
程序在WRITE_SYNC一步出現錯誤,返回值爲-1001。
分析:
libClient程序無論在打開文件或關閉文件時,都不會與服務器進行通信,而只有在讀寫文件的時候才向服務器申請對應的lease。在ALLOCATE一步,服務端會檢查該文件對應的chunk是否有讀寫lease,如果都沒有,則分配寫lease,用於寫文件。而在讀文件時,libClient程序會發送ALLOCATE命令到服務端,此時服務端並不進行任何檢查(檢查是否有寫lease或者讀lease),直接插入讀lease到lease列表中。
這樣,當再次調用寫操作時,由於lease列表中已經存在讀lease(並且這些lease沒有失效),則無法進行下一次的寫操作,返回錯誤。
解決方案之一:
在open和close函數中加入對服務器端狀態進行清空的操作,保證lease及時釋放;對於每一個文件的操作,只能進行讀或寫中的一個,而不能同時進行;當有一個用戶讀取文件時,其他用戶可以進行讀操作,任何用戶不能進行寫操作;有一個用戶進行寫操作時,其他用戶不能進行讀操作。
解決方案二:
在完成每一次的讀操作之後,進行lease的清除操作。
注:還沒有分析完整代碼,可能會有錯誤!僅供參考。