Skip to content
This repository has been archived by the owner on Dec 8, 2021. It is now read-only.

Commit

Permalink
manually cherry-pick for #237
Browse files Browse the repository at this point in the history
  • Loading branch information
lance6716 committed Sep 6, 2019
1 parent f010cd8 commit 7710c10
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
24 changes: 24 additions & 0 deletions lightning/restore/checkpoint_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package restore

import (
. "github.com/pingcap/check"
"path/filepath"
)

var _ = Suite(&checkpointSuite{})

type checkpointSuite struct{}

func (s *splitKVSuite) 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)
}
20 changes: 19 additions & 1 deletion lightning/restore/checkpoints.go
Original file line number Diff line number Diff line change
Expand Up @@ -654,7 +654,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 {
common.AppLogger.Errorf("checkpoint file is broken %s, error: %v", path, err)
}
// 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 {
common.AppLogger.Warnf("failed to open checkpoint file %s, going to create a new one: %v", path, err)
}
Expand Down

0 comments on commit 7710c10

Please sign in to comment.