2019年1月26日 星期六

[經驗分享]GitLab Repository 404 無法開啟問題處理



GitLab 是 Git 程式版本控管系統的優質方案,功能強大、介面美觀。

但是自己建置與維護,難免會遇到一些疑難雜症,例如 Project Repository 損毀。




問題狀況

這個問題其實有陣子了,開發人員在 git 提交上 GitLab Server 時,有時候傳到一半這台 GitLab Server 會死當,要強制關機 (Stop) 或重開 (Restart) 才能恢復。

開起來後看似完好,但登入 GitLab 點進去當機時正在提交的 Project Repository,該 Project 就顯示損毀,無法開啟。


Project Repository 無法進入



這可麻煩了,請同事以指令嘗試,也出現這樣的錯誤:

測試 git 指令
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch --prune origin

error: object file ./objects/e6/ec31eecfdfa61e0a4939f0c360f961204e75ff is empty

error: object file ./objects/e6/ec31eecfdfa61e0a4939f0c360f961204e75ff is empty



Completed successfully.





進行排除

從訊息看起來可能是檔案寫入失敗所以成為空檔,從稍早前的整機備份檔去挖這個路徑...沒這個檔案,排除此可能性。

會造成影響的檔案主要在這個路徑底下:
/var/opt/gitlab/git-data/repositories/<namespace>/<reponame>.git/objects

網路上發現也有許多人遇到類似的狀況,其中一篇是我認為可行的方案,作法如下。

切換至損毀 repository 資料夾
# cd gitlab/repositories/<namespace>/<reponame>.git

執行 git 修復指令
# git fsck

刪除無效空白檔案
# find . –size 0 –delete

執行一次 git 修復指令
# git fsck

到這以後,可以先試試 Web 介面是否可以登入 GitLab 去開啟這個 Project Repository,或是以 git 指令 push 或 fetch 看看。

在我的情況是仍然未修復,以指令操作後出現這樣的錯誤:

測試 git 指令結果
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch origin develop:develop

error: refs/heads/develop does not point to a valid object!

fatal: Couldn't find remote ref develop

fatal: The remote end hung up unexpectedly

Completed with errors, see above.


好了,看起來指的是 develop 這個分支有問題,繼續做下一步。

移除 develop 分支對照檔
# mv ./refs/heads/develop ~/

再執行一次 git 修復指令
# git fsck



接下來可以再到 Web 上登入 GitLab,進入這個 Project Repository。


修復完成正常開啟


確認可以正常開啟了,不過因最新的 develop 分支有問題而刪除,所以需要從開發機再次 commit 一次上來即可。





結論

GitLab 很棒,不過常常比較大量提交寫檔時會死掉這件事挺困擾的,當服務重新啟動時的自我檢測與恢復機制又做的不夠完善,導致管理者要較多手工來修復,相信未來的 GitLab 能夠加強這部份的機制。

至於 GitLab 伺服器這端,會先做存取效能改善,擴充儲存設備的高速讀寫能力來減少這樣的情況發生。




參考資料