github.com/kisexp/xdchain@v0.0.0-20211206025815-490d6b732aa7/raft/persistence.go (about) 1 package raft 2 3 import ( 4 "encoding/binary" 5 6 "github.com/kisexp/xdchain/log" 7 8 "github.com/syndtr/goleveldb/leveldb" 9 "github.com/syndtr/goleveldb/leveldb/errors" 10 "github.com/syndtr/goleveldb/leveldb/opt" 11 ) 12 13 var ( 14 noFsync = &opt.WriteOptions{ 15 NoWriteMerge: false, 16 Sync: false, 17 } 18 ) 19 20 func openQuorumRaftDb(path string) (db *leveldb.DB, err error) { 21 // Open the db and recover any potential corruptions 22 db, err = leveldb.OpenFile(path, &opt.Options{ 23 OpenFilesCacheCapacity: -1, // -1 means 0?? 24 BlockCacheCapacity: -1, 25 }) 26 if _, corrupted := err.(*errors.ErrCorrupted); corrupted { 27 db, err = leveldb.RecoverFile(path, nil) 28 } 29 return 30 } 31 32 func (pm *ProtocolManager) loadAppliedIndex() uint64 { 33 dat, err := pm.quorumRaftDb.Get(appliedDbKey, nil) 34 var lastAppliedIndex uint64 35 if err == errors.ErrNotFound { 36 lastAppliedIndex = 0 37 } else if err != nil { 38 fatalf("loadAppliedIndex error: %s", err) 39 } else { 40 lastAppliedIndex = binary.LittleEndian.Uint64(dat) 41 } 42 43 pm.mu.Lock() 44 pm.appliedIndex = lastAppliedIndex 45 pm.mu.Unlock() 46 47 log.Info("loaded the latest applied index", "lastAppliedIndex", lastAppliedIndex) 48 49 return lastAppliedIndex 50 } 51 52 func (pm *ProtocolManager) writeAppliedIndex(index uint64) { 53 log.Info("persisted the latest applied index", "index", index) 54 buf := make([]byte, 8) 55 binary.LittleEndian.PutUint64(buf, index) 56 pm.quorumRaftDb.Put(appliedDbKey, buf, noFsync) 57 }