diff --git a/lightning/checkpoints/checkpoints.go b/lightning/checkpoints/checkpoints.go index 8e6f06f19..f1b66bab2 100644 --- a/lightning/checkpoints/checkpoints.go +++ b/lightning/checkpoints/checkpoints.go @@ -741,7 +741,25 @@ func NewFileCheckpointsDB(path string) *FileCheckpointsDB { // ignore all errors -- file maybe not created yet (and it is fine). content, err := ioutil.ReadFile(path) if err == nil { - cpdb.checkpoints.Unmarshal(content) + err2 := cpdb.checkpoints.Unmarshal(content) + if err2 != nil { + log.L().Error("checkpoint file is broken", zap.String("path", path), zap.Error(err2)) + } + // FIXME: patch for empty map may need initialize manually, because currently + // FIXME: a map of zero size -> marshall -> unmarshall -> become nil, see checkpoint_test.go + if cpdb.checkpoints.Checkpoints == nil { + cpdb.checkpoints.Checkpoints = map[string]*TableCheckpointModel{} + } + for _, table := range cpdb.checkpoints.Checkpoints { + if table.Engines == nil { + table.Engines = map[int32]*EngineCheckpointModel{} + } + for _, engine := range table.Engines { + if engine.Chunks == nil { + engine.Chunks = map[string]*ChunkCheckpointModel{} + } + } + } } else { log.L().Info("open checkpoint file failed, going to create a new one", zap.String("path", path), diff --git a/lightning/checkpoints/checkpoints_test.go b/lightning/checkpoints/checkpoints_test.go index 593085146..95e1a6574 100644 --- a/lightning/checkpoints/checkpoints_test.go +++ b/lightning/checkpoints/checkpoints_test.go @@ -1,6 +1,7 @@ package checkpoints import ( + "path/filepath" "testing" . "github.com/pingcap/check" @@ -288,3 +289,17 @@ func (s *checkpointSuite) TestApplyDiff(c *C) { }, }) } + +func (s *checkpointSuite) TestCheckpointMarshallUnmarshall(c *C) { + path := filepath.Join(c.MkDir(), "filecheckpoint") + fileChkp := NewFileCheckpointsDB(path) + fileChkp.checkpoints.Checkpoints["a"] = &TableCheckpointModel{ + Status: uint32(CheckpointStatusLoaded), + Engines: map[int32]*EngineCheckpointModel{}, + } + fileChkp.Close() + + fileChkp2 := NewFileCheckpointsDB(path) + // if not recover empty map explicitly, it will become nil + c.Assert(fileChkp2.checkpoints.Checkpoints["a"].Engines, NotNil) +} \ No newline at end of file