這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
從這篇文章開始想寫寫leveldb的小知識。先瞭解manifest檔案,因為這個檔案關係到執行個體的讀取。至於這個檔案的內部結構以及如何來的,等會再聊。
if instances[Name], err = leveldb.OpenFile(Dir, instance); err != nil { return errors.New(fmt.Sprintf(`leveldbs: err while open %s : %s`, Dir, err.Error()))}
這段代碼在manifest檔案損壞的情況下會出現報錯,報錯內容:
ERROR leveldb: manifest corrupted: missing [file=MANIFEST-*******]
報錯原因:leveldb在預存程序中因為一些其他原因導致程式突然的down掉可能導致manifest檔案損害或者丟失。這樣就只能手動repair
下了,打不開一個instance
就沒有辦法執行get
命令。repair
的業務方代碼可以這樣寫,這裡以Golang
代碼來說明:
if instances[cfgIns.Name], err = leveldb.OpenFile(Dir, instance); err != nil { if instances[cfgIns.Name], err = leveldb.RecoverFile(Dir, instance); err != nil { return errors.New(fmt.Sprintf(`err while recoverfile%s : %s`, Dir, err.Error())) }}
RecoverFile
這個API函數的源碼是:
func RecoverFile(path string, o *opt.Options) (db *DB, err error) { stor, err := storage.OpenFile(path) if err != nil { return } db, err = Recover(stor, o) if err != nil { stor.Close() } else { db.closer = stor } return}
manifest檔案損壞或者丟失修複還是蠻簡單的,說明Google的大神早就想到了這些東西。通過上面的例子先感受下manifest檔案的存在,下面我們學習下manifest檔案結構和檔案的由來。檔案結構