Skip to content
This repository was archived by the owner on Aug 13, 2019. It is now read-only.

Commit 22fd3ef

Browse files
author
Fabian Reinartz
committed
Deal with zero-length segments
Signed-off-by: Fabian Reinartz <[email protected]>
1 parent 92e1b20 commit 22fd3ef

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

repair_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func TestRepairBadIndexVersion(t *testing.T) {
7676
}
7777

7878
// On DB opening all blocks in the base dir should be repaired.
79-
db, _ := Open("testdata/repair_index_version", nil, nil, nil)
79+
db, err := Open("testdata/repair_index_version", nil, nil, nil)
8080
if err != nil {
8181
t.Fatal(err)
8282
}

wal.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,6 +1214,9 @@ func (r *walReader) decodeDeletes(flag byte, b []byte, res *[]Stone) error {
12141214

12151215
// MigrateWAL rewrites the deprecated write ahead log into the new format.
12161216
func MigrateWAL(logger log.Logger, dir string) (err error) {
1217+
if logger == nil {
1218+
logger = log.NewNopLogger()
1219+
}
12171220
// Detect whether we still have the old WAL.
12181221
fns, err := sequenceFiles(dir)
12191222
if err != nil && !os.IsNotExist(err) {
@@ -1222,21 +1225,23 @@ func MigrateWAL(logger log.Logger, dir string) (err error) {
12221225
if len(fns) == 0 {
12231226
return nil // No WAL at all yet.
12241227
}
1225-
// Check header of first segment.
1228+
// Check header of first segment to see whether we are still dealing with an
1229+
// old WAL.
12261230
f, err := os.Open(fns[0])
12271231
if err != nil {
12281232
return errors.Wrap(err, "check first existing segment")
12291233
}
12301234
defer f.Close()
12311235

12321236
var hdr [4]byte
1233-
if n, err := f.Read(hdr[:]); err != nil {
1237+
if _, err := f.Read(hdr[:]); err != nil && err != io.EOF {
12341238
return errors.Wrap(err, "read header from first segment")
1235-
} else if n != 4 {
1236-
return errors.New("could not read full header from segment")
12371239
}
1240+
// If we cannot read the magic header for segments of the old WAL, abort.
1241+
// Either it's migrated already or there's a corruption issue with which
1242+
// we cannot deal here anyway. Subsequent attempts to open the WAL will error in that case.
12381243
if binary.BigEndian.Uint32(hdr[:]) != WALMagic {
1239-
return nil // Not the old WAL anymore.
1244+
return nil
12401245
}
12411246

12421247
level.Info(logger).Log("msg", "migrating WAL format")

wal_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,23 @@ func TestWALRestoreCorrupted(t *testing.T) {
434434
}
435435
}
436436

437+
func TestMigrateWAL_Empty(t *testing.T) {
438+
// The migration proecedure must properly deal with a zero-length segment,
439+
// which is valid in the new format.
440+
dir, err := ioutil.TempDir("", "walmigrate")
441+
testutil.Ok(t, err)
442+
defer os.RemoveAll(dir)
443+
444+
wdir := path.Join(dir, "wal")
445+
446+
// Initialize empty WAL.
447+
w, err := wal.New(nil, nil, wdir)
448+
testutil.Ok(t, err)
449+
testutil.Ok(t, w.Close())
450+
451+
testutil.Ok(t, MigrateWAL(nil, wdir))
452+
}
453+
437454
func TestMigrateWAL_Fuzz(t *testing.T) {
438455
dir, err := ioutil.TempDir("", "walmigrate")
439456
testutil.Ok(t, err)

0 commit comments

Comments
 (0)