Skip to content

Commit d2b2dfb

Browse files
authored
‎mpt/internal/pmem: set Mem.id on Open (#81)
Leaving this as all zeroes when opening an existing tree for writes can lead to a situation where the tree is corrupted and can no longer be opened.
1 parent 8069247 commit d2b2dfb

2 files changed

Lines changed: 31 additions & 0 deletions

File tree

mpt/internal/pmem/pmem.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ func open(magic string, file1, file2, disk File) (_ *Mem, err error) {
380380
if r1.id != r2.id {
381381
return nil, fmt.Errorf("inconsistent pmem files: mismatched IDs")
382382
}
383+
m.id = r1.id
383384
if r1.seq == r2.seq {
384385
return nil, fmt.Errorf("inconsistent pmem files: identical sequence numbers (%#x == %#x)", r1.seq, r2.seq)
385386
}

mpt/internal/pmem/pmem_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,36 @@ func testRecovery(t *testing.T) {
101101
check(t, mem.UnsafeUnmap())
102102
}
103103

104+
func TestOpenPopulatesID(t *testing.T) {
105+
tt := &tester{t: t}
106+
for i := range tt.file {
107+
tt.file[i].tester = tt
108+
}
109+
110+
m, err := Create("magic", &tt.file[0], &tt.file[1], nil)
111+
if err != nil {
112+
t.Fatal(err)
113+
}
114+
tt.setMem(m)
115+
createdID := m.id
116+
if createdID == [16]byte{} {
117+
t.Fatal("created ID is zero")
118+
}
119+
m.Release()
120+
m.UnsafeUnmap()
121+
122+
m2, err := Open("magic", tt.file[0].clone(), tt.file[1].clone(), nil)
123+
if err != nil {
124+
t.Fatal(err)
125+
}
126+
defer m2.Release()
127+
defer m2.UnsafeUnmap()
128+
129+
if m2.id != createdID {
130+
t.Errorf("opened ID %x != created ID %x", m2.id, createdID)
131+
}
132+
}
133+
104134
func randFill(b []byte) []byte {
105135
for i := range b {
106136
b[i] = byte(rand.N(256))

0 commit comments

Comments
 (0)