2016-10-26 32 views
0

我正在編寫壓力測試套件來測試通過NFS的分佈式文件系統。「過時的文件句柄」錯誤,當進程嘗試讀取文件時,其他進程已經刪除

在某些情況下,當一些進程刪除文件,而另一些進程嘗試從它讀取,我得到「陳舊的文件句柄」錯誤(116)。

在這種情況下,這種錯誤是否可以接受?

測試工作如下:

  1. 啓動客戶機的x個
  2. 每臺客戶端計算機上運行Ÿ處理
  3. 每個進程都可以做任何文件操作STAT /讀/刪除/打開
  4. 提到的文件操作是標準的python方法 - os.stat/read/os.remove/open
  5. 所有文件都爲空0字節數據

文件是存在,爲成功stat運行表明:

controller_debug.log.2:2016年10月26日15:02:30156; INFO - [LG-E27A-LNX:是0xA]:成品640522b4d94c453ea545cb86568320ca,結果: 成功| stat | 35 35 48 012 012 012 012 012 012數據:{} | 2016年10月26日15:02:30.156

過程0x1在客戶端完成CLIENT-A成功刪除:

controller_debug.log.2:2016年10月26日15:02:30164; INFO - [CLIENT-A:0x1]:已完成5f5dfe6a06de495f851745a78857eec1,結果: 成功|刪除| 35 35 48 012 012 012 012 012 012數據:{} | 2016年10月26日15:02:30.161

3毫秒之後,在客戶端CLIENT-B過程0xb失敗 「讀」 OP因 「過時的文件句柄」

controller_debug.log.2 2016 -10-26 15:02:30,164; INFO - [CLIENT-B:0xb]:finished e84e2064ead042099310af1bd44821c0,result: failed |閱讀| /mnt/DIRSPLIT-node0.b27-1/JUyw481MfvsBHOm1KQu7sHRB6ffAXKjwIATlsXmOgWh8XKQaIrPbxLgAo7sucdAM/o6V266xE8bTaUGzk8YDMfDAJp0YIfbT4fIK1oZ2R20tRX3xFCvjISj7WuMEwEV41 | [errno:116] |陳舊的文件句柄| 142 |數據:{} | 2016/10/26 15:02:30.160 controller_debug.log。2:2016年10月26日15:02:30164;錯誤 - 操作中讀取上的文件 JUyw481MfvsBHOm1KQu7sHRB6ffAXKjwIATlsXmOgWh8XKQaIrPbxLgAo7sucdAM/o6V266xE8bTaUGzk8YDMfDAJp0YIfbT4fIK1oZ2R20tRX3xFCvjISj7WuMEwEV41 意外失敗,由於過時的文件句柄

感謝

+2

是的,這是一個可接受的錯誤代碼給出的情況下(請參閱https://access.redhat.com/solutions/29626,條件2),但它可能不是唯一可能的迴應。您必須閱讀規格和來源才能確定。你能澄清一下,如果有什麼,表明這可能不是一個合適的迴應? –

+0

@JakeMitchell感謝您的鏈接傑克。我確實知道ESTALE可以用於目錄,但是可以在文件中找到關於ESTALE的任何信息,並且由於我正在開發測試文件系統,所以我不能相信它如何處理nfs錯誤。你是否也有源碼和規格的鏈接? – Samuel

+0

您正在使用哪種版本的Python,以及如何開始測試流程?它可能與'fork'的行爲有關,因爲文件描述符依賴於POSIX,這不允許使用分叉進程。 –

回答

1

這是完全預料。在對象(不管是文件還是目錄)被刪除之後,NFS規範清楚瞭如何使用文件句柄。 Section 4明確解決這個問題。例如:

當文件系統對象被刪除時,持久性文件句柄將變爲過時或無效。當服務器提供一個引用已刪除對象的持久性文件句柄時,它務必返回一個NFS4ERR_STALE錯誤。

這是這樣一個共同的問題,它甚至在NFS FAQ第A.10其自己的條目,它說ESTALE錯誤的一個常見原因是:

文件句柄指已刪除的文件。在服務器上刪除一個文件之後,客戶端不會發現它們,直到它們嘗試使用它們之前從LOOKUP緩存的文件句柄來訪問該文件。使用rsync或mv替換正在另一個客戶端上使用的文件是導致ESTALE錯誤的常見情況。

預期的解決方案是您的客戶端應用程序必須關閉並重新打開文件以查看發生了什麼。或者,如常見問題解答說:

...從一個ESTALE錯誤中恢復,應用程序必須關閉發生錯誤的文件或目錄,並重新打開它,因此NFS客戶端可以再次解決路徑和檢索新的文件句柄。

相關問題