Skip to content

Commit

Permalink
fix(master): avoid non-atomic remove all
Browse files Browse the repository at this point in the history
Signed-off-by: NaturalSelect <[email protected]>
  • Loading branch information
NaturalSelect authored and leonrayang committed Sep 15, 2023
1 parent b5d56fb commit adc8ecc
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions master/metadata_fsm.go
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ func (mf *MetadataFsm) ApplySnapshot(peers []proto.Peer, iterator proto.SnapIter
}
}
rocksdbOpened := true
removeDir := ""
// open temp rocksdb
tempDb, err := raftstore.NewRocksDBStore(recoveryDir, mf.store.GetLruCacheSize(), mf.store.GetWriteBufferSize())
if err != nil {
Expand All @@ -206,6 +207,13 @@ func (mf *MetadataFsm) ApplySnapshot(peers []proto.Peer, iterator proto.SnapIter
// close rocksdb
mf.store.Close()
rocksdbOpened = false
// remove by rename
removeDir, err = os.MkdirTemp("", "remove_by_rename")
if err != nil {
log.LogErrorf("failed to get temp dir %v", err.Error())
goto errHandler
}
removeDir = fmt.Sprintf("%s/remove", removeDir)
log.LogWarnf(fmt.Sprintf("action[ApplySnapshot] begin,applied[%v]", mf.applied))
for err == nil {
bgTime := stat.BeginStat()
Expand Down Expand Up @@ -236,10 +244,15 @@ func (mf *MetadataFsm) ApplySnapshot(peers []proto.Peer, iterator proto.SnapIter
goto errHandler
}
tempDb.Close()
// commit point
if err = os.RemoveAll(mf.store.GetDir()); err != nil {
// commit point, remove by rename
if err = os.Rename(mf.store.GetDir(), removeDir); err != nil {
goto errHandler
}
if err = os.RemoveAll(removeDir); err != nil {
err = nil
log.LogErrorf("failed to remove directory %v", err.Error())
}
// rename new dir to raft store dir
if err = os.Rename(tempDb.GetDir(), mf.store.GetDir()); err != nil {
goto errHandler
}
Expand Down

0 comments on commit adc8ecc

Please sign in to comment.