Skip to content

Commit 2e6df57

Browse files
authored
Add page flags to LTX, bump to version 3 (#67)
1 parent 2af9b0c commit 2e6df57

File tree

5 files changed

+69
-57
lines changed

5 files changed

+69
-57
lines changed

compactor_test.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ func TestCompactor_Compact(t *testing.T) {
1313
t.Run("SingleFilePageDataOnly", func(t *testing.T) {
1414
input := &ltx.FileSpec{
1515
Header: ltx.Header{
16-
Version: 2,
16+
Version: ltx.Version,
1717
PageSize: 512,
1818
Commit: 1,
1919
MinTXID: 1,
@@ -61,7 +61,7 @@ func TestCompactor_Compact(t *testing.T) {
6161
spec, err := compactFileSpecs(t,
6262
&ltx.FileSpec{
6363
Header: ltx.Header{
64-
Version: 2,
64+
Version: ltx.Version,
6565
PageSize: 1024,
6666
Commit: 3,
6767
MinTXID: 1,
@@ -79,7 +79,7 @@ func TestCompactor_Compact(t *testing.T) {
7979
},
8080
&ltx.FileSpec{
8181
Header: ltx.Header{
82-
Version: 2,
82+
Version: ltx.Version,
8383
PageSize: 1024,
8484
Commit: 3,
8585
MinTXID: 2,
@@ -102,7 +102,7 @@ func TestCompactor_Compact(t *testing.T) {
102102

103103
assertFileSpecEqual(t, spec, &ltx.FileSpec{
104104
Header: ltx.Header{
105-
Version: 2,
105+
Version: ltx.Version,
106106
PageSize: 1024,
107107
Commit: 3,
108108
MinTXID: 1,
@@ -116,15 +116,15 @@ func TestCompactor_Compact(t *testing.T) {
116116
},
117117
Trailer: ltx.Trailer{
118118
PostApplyChecksum: 0x8a249272ad9f7dea,
119-
FileChecksum: 0xae0ae2e4c2df6049,
119+
FileChecksum: 0xe836ad7ac0be7594,
120120
},
121121
})
122122
})
123123
t.Run("NonSnapshotPageDataOnly", func(t *testing.T) {
124124
spec, err := compactFileSpecs(t,
125125
&ltx.FileSpec{
126126
Header: ltx.Header{
127-
Version: 2,
127+
Version: ltx.Version,
128128
PageSize: 1024,
129129
Commit: 3,
130130
MinTXID: 2,
@@ -141,7 +141,7 @@ func TestCompactor_Compact(t *testing.T) {
141141
},
142142
&ltx.FileSpec{
143143
Header: ltx.Header{
144-
Version: 2,
144+
Version: ltx.Version,
145145
PageSize: 1024,
146146
Commit: 3,
147147
MinTXID: 4,
@@ -158,7 +158,7 @@ func TestCompactor_Compact(t *testing.T) {
158158
},
159159
&ltx.FileSpec{
160160
Header: ltx.Header{
161-
Version: 2,
161+
Version: ltx.Version,
162162
PageSize: 1024,
163163
Commit: 5,
164164
MinTXID: 6,
@@ -182,7 +182,7 @@ func TestCompactor_Compact(t *testing.T) {
182182

183183
assertFileSpecEqual(t, spec, &ltx.FileSpec{
184184
Header: ltx.Header{
185-
Version: 2,
185+
Version: ltx.Version,
186186
PageSize: 1024,
187187
Commit: 5,
188188
MinTXID: 2,
@@ -198,22 +198,22 @@ func TestCompactor_Compact(t *testing.T) {
198198
},
199199
Trailer: ltx.Trailer{
200200
PostApplyChecksum: ltx.ChecksumFlag | 9,
201-
FileChecksum: 0x8da4b823aca2e8d7,
201+
FileChecksum: 0xc08218012f50038e,
202202
},
203203
})
204204
})
205205

206206
t.Run("Shrinking", func(t *testing.T) {
207207
spec, err := compactFileSpecs(t,
208208
&ltx.FileSpec{
209-
Header: ltx.Header{Version: 2, PageSize: 1024, Commit: 3, MinTXID: 2, MaxTXID: 3, Timestamp: 1000, PreApplyChecksum: ltx.ChecksumFlag | 2},
209+
Header: ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 3, MinTXID: 2, MaxTXID: 3, Timestamp: 1000, PreApplyChecksum: ltx.ChecksumFlag | 2},
210210
Pages: []ltx.PageSpec{
211211
{Header: ltx.PageHeader{Pgno: 3}, Data: bytes.Repeat([]byte{0x83}, 1024)},
212212
},
213213
Trailer: ltx.Trailer{PostApplyChecksum: ltx.ChecksumFlag | 3},
214214
},
215215
&ltx.FileSpec{
216-
Header: ltx.Header{Version: 2, PageSize: 1024, Commit: 2, MinTXID: 4, MaxTXID: 5, Timestamp: 2000, PreApplyChecksum: ltx.ChecksumFlag | 4},
216+
Header: ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 2, MinTXID: 4, MaxTXID: 5, Timestamp: 2000, PreApplyChecksum: ltx.ChecksumFlag | 4},
217217
Pages: []ltx.PageSpec{
218218
{Header: ltx.PageHeader{Pgno: 1}, Data: bytes.Repeat([]byte{0x91}, 1024)},
219219
},
@@ -226,7 +226,7 @@ func TestCompactor_Compact(t *testing.T) {
226226

227227
assertFileSpecEqual(t, spec, &ltx.FileSpec{
228228
Header: ltx.Header{
229-
Version: 2,
229+
Version: ltx.Version,
230230
PageSize: 1024,
231231
Commit: 2,
232232
MinTXID: 2,
@@ -239,7 +239,7 @@ func TestCompactor_Compact(t *testing.T) {
239239
},
240240
Trailer: ltx.Trailer{
241241
PostApplyChecksum: ltx.ChecksumFlag | 5,
242-
FileChecksum: 0xa6246dd737ab66ca,
242+
FileChecksum: 0x83c62dde98efed0f,
243243
},
244244
})
245245
})
@@ -256,12 +256,12 @@ func TestCompactor_Compact(t *testing.T) {
256256
t.Run("ErrPageSizeMismatch", func(t *testing.T) {
257257
_, err := compactFileSpecs(t,
258258
&ltx.FileSpec{
259-
Header: ltx.Header{Version: 2, PageSize: 512, Commit: 1, MinTXID: 1, MaxTXID: 1, Timestamp: 1000},
259+
Header: ltx.Header{Version: ltx.Version, PageSize: 512, Commit: 1, MinTXID: 1, MaxTXID: 1, Timestamp: 1000},
260260
Pages: []ltx.PageSpec{{Header: ltx.PageHeader{Pgno: 1}, Data: bytes.Repeat([]byte{0x81}, 512)}},
261261
Trailer: ltx.Trailer{PostApplyChecksum: ltx.ChecksumFlag | 1},
262262
},
263263
&ltx.FileSpec{
264-
Header: ltx.Header{Version: 2, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 1, Timestamp: 1000},
264+
Header: ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 1, Timestamp: 1000},
265265
Pages: []ltx.PageSpec{{Header: ltx.PageHeader{Pgno: 1}, Data: bytes.Repeat([]byte{0x91}, 1024)}},
266266
Trailer: ltx.Trailer{PostApplyChecksum: ltx.ChecksumFlag | 1},
267267
},
@@ -273,12 +273,12 @@ func TestCompactor_Compact(t *testing.T) {
273273
t.Run("ErrNonContiguousTXID", func(t *testing.T) {
274274
_, err := compactFileSpecs(t,
275275
&ltx.FileSpec{
276-
Header: ltx.Header{Version: 2, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 2, Timestamp: 1000},
276+
Header: ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 2, Timestamp: 1000},
277277
Pages: []ltx.PageSpec{{Header: ltx.PageHeader{Pgno: 1}, Data: bytes.Repeat([]byte{0x81}, 1024)}},
278278
Trailer: ltx.Trailer{PostApplyChecksum: ltx.ChecksumFlag | 1},
279279
},
280280
&ltx.FileSpec{
281-
Header: ltx.Header{Version: 2, PageSize: 1024, Commit: 1, MinTXID: 4, MaxTXID: 4, Timestamp: 1000, PreApplyChecksum: ltx.ChecksumFlag | 2},
281+
Header: ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 1, MinTXID: 4, MaxTXID: 4, Timestamp: 1000, PreApplyChecksum: ltx.ChecksumFlag | 2},
282282
Pages: []ltx.PageSpec{{Header: ltx.PageHeader{Pgno: 1}, Data: bytes.Repeat([]byte{0x91}, 1024)}},
283283
Trailer: ltx.Trailer{PostApplyChecksum: ltx.ChecksumFlag | 1},
284284
},
@@ -290,13 +290,13 @@ func TestCompactor_Compact(t *testing.T) {
290290
t.Run("AllowNonContiguousTXID", func(t *testing.T) {
291291
bufs := make([]bytes.Buffer, 2)
292292
writeFileSpec(t, &bufs[0], &ltx.FileSpec{
293-
Header: ltx.Header{Version: 2, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 2, Timestamp: 1000},
293+
Header: ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 2, Timestamp: 1000},
294294
Pages: []ltx.PageSpec{{Header: ltx.PageHeader{Pgno: 1}, Data: bytes.Repeat([]byte{0x81}, 1024)}},
295295
Trailer: ltx.Trailer{PostApplyChecksum: 0xeb953fc47685d740},
296296
})
297297

298298
writeFileSpec(t, &bufs[1], &ltx.FileSpec{
299-
Header: ltx.Header{Version: 2, PageSize: 1024, Commit: 1, MinTXID: 4, MaxTXID: 4, Timestamp: 1000, PreApplyChecksum: ltx.ChecksumFlag | 2},
299+
Header: ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 1, MinTXID: 4, MaxTXID: 4, Timestamp: 1000, PreApplyChecksum: ltx.ChecksumFlag | 2},
300300
Pages: []ltx.PageSpec{{Header: ltx.PageHeader{Pgno: 1}, Data: bytes.Repeat([]byte{0x91}, 1024)}},
301301
Trailer: ltx.Trailer{PostApplyChecksum: ltx.ChecksumFlag | 1},
302302
})

decoder_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
func TestDecoder(t *testing.T) {
1313
spec := &ltx.FileSpec{
1414
Header: ltx.Header{
15-
Version: 2,
15+
Version: ltx.Version,
1616
PageSize: 1024,
1717
Commit: 2,
1818
MinTXID: 1,
@@ -66,8 +66,8 @@ func TestDecoder(t *testing.T) {
6666
// Verify page index.
6767
index := dec.PageIndex()
6868
if got, want := index, map[uint32]ltx.PageIndexElem{
69-
1: {MinTXID: 1, MaxTXID: 1, Offset: 100, Size: 49},
70-
2: {MinTXID: 1, MaxTXID: 1, Offset: 149, Size: 49},
69+
1: {MinTXID: 1, MaxTXID: 1, Offset: 100, Size: 51},
70+
2: {MinTXID: 1, MaxTXID: 1, Offset: 151, Size: 51},
7171
}; !reflect.DeepEqual(got, want) {
7272
t.Fatalf("page index mismatch:\ngot=%#v\nwant=%#v", got, want)
7373
}
@@ -82,7 +82,7 @@ func TestDecoder(t *testing.T) {
8282
}
8383

8484
// Read page 2 by offset.
85-
if hdr, data, err := ltx.DecodePageData(fileSpecData[149:]); err != nil {
85+
if hdr, data, err := ltx.DecodePageData(fileSpecData[151:]); err != nil {
8686
t.Fatal(err)
8787
} else if got, want := hdr, (ltx.PageHeader{Pgno: 2}); got != want {
8888
t.Fatalf("page header mismatch:\ngot=%#v\nwant=%#v", got, want)
@@ -101,7 +101,7 @@ func TestDecoder(t *testing.T) {
101101
func TestDecoder_Decode_CommitZero(t *testing.T) {
102102
spec := &ltx.FileSpec{
103103
Header: ltx.Header{
104-
Version: 2,
104+
Version: ltx.Version,
105105
Flags: 0,
106106
PageSize: 1024,
107107
Commit: 0,
@@ -146,7 +146,7 @@ func TestDecoder_Decode_CommitZero(t *testing.T) {
146146
func TestDecoder_DecodeDatabaseTo(t *testing.T) {
147147
t.Run("OK", func(t *testing.T) {
148148
spec := &ltx.FileSpec{
149-
Header: ltx.Header{Version: 2, Flags: 0, PageSize: 512, Commit: 2, MinTXID: 1, MaxTXID: 2, Timestamp: 1000},
149+
Header: ltx.Header{Version: ltx.Version, Flags: 0, PageSize: 512, Commit: 2, MinTXID: 1, MaxTXID: 2, Timestamp: 1000},
150150
Pages: []ltx.PageSpec{
151151
{Header: ltx.PageHeader{Pgno: 1}, Data: bytes.Repeat([]byte("2"), 512)},
152152
{Header: ltx.PageHeader{Pgno: 2}, Data: bytes.Repeat([]byte("3"), 512)},
@@ -181,7 +181,7 @@ func TestDecoder_DecodeDatabaseTo(t *testing.T) {
181181
if err != nil {
182182
t.Fatal(err)
183183
}
184-
if err := enc.EncodeHeader(ltx.Header{Version: 2, Flags: 0, PageSize: 4096, Commit: commit, MinTXID: 1, MaxTXID: 2, Timestamp: 1000}); err != nil {
184+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, Flags: 0, PageSize: 4096, Commit: commit, MinTXID: 1, MaxTXID: 2, Timestamp: 1000}); err != nil {
185185
t.Fatal(err)
186186
}
187187

@@ -216,7 +216,7 @@ func TestDecoder_DecodeDatabaseTo(t *testing.T) {
216216

217217
t.Run("ErrNonSnapshot", func(t *testing.T) {
218218
spec := &ltx.FileSpec{
219-
Header: ltx.Header{Version: 2, Flags: 0, PageSize: 512, Commit: 2, MinTXID: 2, MaxTXID: 2, Timestamp: 1000, PreApplyChecksum: ltx.ChecksumFlag | 1},
219+
Header: ltx.Header{Version: ltx.Version, Flags: 0, PageSize: 512, Commit: 2, MinTXID: 2, MaxTXID: 2, Timestamp: 1000, PreApplyChecksum: ltx.ChecksumFlag | 1},
220220
Pages: []ltx.PageSpec{
221221
{Header: ltx.PageHeader{Pgno: 2}, Data: bytes.Repeat([]byte("3"), 512)},
222222
},

encoder_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func TestEncoder(t *testing.T) {
2222
t.Fatal(err)
2323
}
2424
if err := enc.EncodeHeader(ltx.Header{
25-
Version: 2,
25+
Version: ltx.Version,
2626
PageSize: 4096,
2727
Commit: 3,
2828
MinTXID: 5,
@@ -68,7 +68,7 @@ func TestEncoder(t *testing.T) {
6868
t.Fatal(err)
6969
}
7070
if err := enc.EncodeHeader(ltx.Header{
71-
Version: 2,
71+
Version: ltx.Version,
7272
PageSize: 4096,
7373
Commit: 0,
7474
MinTXID: 5,
@@ -98,7 +98,7 @@ func TestEncoder(t *testing.T) {
9898
if err != nil {
9999
t.Fatal(err)
100100
}
101-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 4096, Commit: 0, MinTXID: 5, MaxTXID: 6, Timestamp: 2000, PreApplyChecksum: ltx.ChecksumFlag | 5}); err != nil {
101+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 4096, Commit: 0, MinTXID: 5, MaxTXID: 6, Timestamp: 2000, PreApplyChecksum: ltx.ChecksumFlag | 5}); err != nil {
102102
t.Fatal(err)
103103
}
104104

@@ -125,7 +125,7 @@ func TestEncode_Close(t *testing.T) {
125125
if err != nil {
126126
t.Fatal(err)
127127
}
128-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 1}); err != nil {
128+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 1}); err != nil {
129129
t.Fatal(err)
130130
} else if err := enc.EncodePage(ltx.PageHeader{Pgno: 1}, make([]byte, 1024)); err != nil {
131131
t.Fatal(err)
@@ -151,7 +151,7 @@ func TestEncode_EncodeHeader(t *testing.T) {
151151
if err != nil {
152152
t.Fatal(err)
153153
}
154-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 1}); err != nil {
154+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 1}); err != nil {
155155
t.Fatal(err)
156156
}
157157
if err := enc.EncodeHeader(ltx.Header{}); err == nil || err.Error() != `cannot encode header frame, expected page` {
@@ -176,7 +176,7 @@ func TestEncode_EncodePage(t *testing.T) {
176176
if err != nil {
177177
t.Fatal(err)
178178
}
179-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 1}); err != nil {
179+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 1, MinTXID: 1, MaxTXID: 1}); err != nil {
180180
t.Fatal(err)
181181
} else if err := enc.EncodePage(ltx.PageHeader{Pgno: 0}, nil); err == nil || err.Error() != `page number required` {
182182
t.Fatalf("unexpected error: %s", err)
@@ -188,7 +188,7 @@ func TestEncode_EncodePage(t *testing.T) {
188188
if err != nil {
189189
t.Fatal(err)
190190
}
191-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 1024, Commit: 4, MinTXID: 2, MaxTXID: 2, PreApplyChecksum: ltx.ChecksumFlag | 2}); err != nil {
191+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 4, MinTXID: 2, MaxTXID: 2, PreApplyChecksum: ltx.ChecksumFlag | 2}); err != nil {
192192
t.Fatal(err)
193193
} else if err := enc.EncodePage(ltx.PageHeader{Pgno: 5}, nil); err == nil || err.Error() != `page number 5 out-of-bounds for commit size 4` {
194194
t.Fatalf("unexpected error: %s", err)
@@ -200,7 +200,7 @@ func TestEncode_EncodePage(t *testing.T) {
200200
if err != nil {
201201
t.Fatal(err)
202202
}
203-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 1024, Commit: 2, MinTXID: 1, MaxTXID: 2}); err != nil {
203+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 2, MinTXID: 1, MaxTXID: 2}); err != nil {
204204
t.Fatal(err)
205205
} else if err := enc.EncodePage(ltx.PageHeader{Pgno: 2}, make([]byte, 1024)); err == nil || err.Error() != `snapshot transaction file must start with page number 1` {
206206
t.Fatalf("unexpected error: %s", err)
@@ -212,7 +212,7 @@ func TestEncode_EncodePage(t *testing.T) {
212212
if err != nil {
213213
t.Fatal(err)
214214
}
215-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 1024, Commit: 3, MinTXID: 1, MaxTXID: 1}); err != nil {
215+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 3, MinTXID: 1, MaxTXID: 1}); err != nil {
216216
t.Fatal(err)
217217
}
218218
if err := enc.EncodePage(ltx.PageHeader{Pgno: 1}, make([]byte, 1024)); err != nil {
@@ -229,7 +229,7 @@ func TestEncode_EncodePage(t *testing.T) {
229229
if err != nil {
230230
t.Fatal(err)
231231
}
232-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 4096, Commit: 262145, MinTXID: 1, MaxTXID: 1}); err != nil {
232+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 4096, Commit: 262145, MinTXID: 1, MaxTXID: 1}); err != nil {
233233
t.Fatal(err)
234234
}
235235

@@ -251,7 +251,7 @@ func TestEncode_EncodePage(t *testing.T) {
251251
if err != nil {
252252
t.Fatal(err)
253253
}
254-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 4096, Commit: 262147, MinTXID: 1, MaxTXID: 1}); err != nil {
254+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 4096, Commit: 262147, MinTXID: 1, MaxTXID: 1}); err != nil {
255255
t.Fatal(err)
256256
}
257257

@@ -273,7 +273,7 @@ func TestEncode_EncodePage(t *testing.T) {
273273
if err != nil {
274274
t.Fatal(err)
275275
}
276-
if err := enc.EncodeHeader(ltx.Header{Version: 2, PageSize: 1024, Commit: 2, MinTXID: 2, MaxTXID: 2, PreApplyChecksum: ltx.ChecksumFlag | 2}); err != nil {
276+
if err := enc.EncodeHeader(ltx.Header{Version: ltx.Version, PageSize: 1024, Commit: 2, MinTXID: 2, MaxTXID: 2, PreApplyChecksum: ltx.ChecksumFlag | 2}); err != nil {
277277
t.Fatal(err)
278278
}
279279
if err := enc.EncodePage(ltx.PageHeader{Pgno: 2}, make([]byte, 1024)); err != nil {

ltx.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ const (
2020
Magic = "LTX1"
2121

2222
// Version is the current version of the LTX file format.
23-
Version = 2
23+
Version = 3
2424
)
2525

2626
// Size constants.
2727
const (
2828
HeaderSize = 100
29-
PageHeaderSize = 4
29+
PageHeaderSize = 6
3030
TrailerSize = 16
3131
)
3232

@@ -407,7 +407,8 @@ func IsValidPageSize(sz uint32) bool {
407407

408408
// PageHeader represents the header for a single page in an LTX file.
409409
type PageHeader struct {
410-
Pgno uint32
410+
Pgno uint32
411+
Flags uint16
411412
}
412413

413414
// IsZero returns true if the header is empty.
@@ -420,13 +421,17 @@ func (h *PageHeader) Validate() error {
420421
if h.Pgno == 0 {
421422
return fmt.Errorf("page number required")
422423
}
424+
if h.Flags != 0 {
425+
return fmt.Errorf("no flags allowed, reserved for future use")
426+
}
423427
return nil
424428
}
425429

426430
// MarshalBinary encodes h to a byte slice.
427431
func (h *PageHeader) MarshalBinary() ([]byte, error) {
428432
b := make([]byte, PageHeaderSize)
429433
binary.BigEndian.PutUint32(b[0:], h.Pgno)
434+
binary.BigEndian.PutUint16(b[4:], h.Flags)
430435
return b, nil
431436
}
432437

@@ -437,6 +442,7 @@ func (h *PageHeader) UnmarshalBinary(b []byte) error {
437442
}
438443

439444
h.Pgno = binary.BigEndian.Uint32(b[0:])
445+
h.Flags = binary.BigEndian.Uint16(b[4:])
440446
return nil
441447
}
442448

0 commit comments

Comments
 (0)