Skip to content

Commit 30fc641

Browse files
committed
sstable: export parsing of WriterOptions from testdata args
1 parent 95d16a9 commit 30fc641

File tree

4 files changed

+93
-65
lines changed

4 files changed

+93
-65
lines changed

sstable/blob/handle.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func (h InlineHandle) String() string {
8989

9090
// SafeFormat implements redact.SafeFormatter.
9191
func (h InlineHandle) SafeFormat(w redact.SafePrinter, _ rune) {
92-
w.Printf("(%d, blk%d[%d:%d])",
92+
w.Printf("(f%d,blk%d[%d:%d])",
9393
h.ReferenceID, h.BlockNum, h.OffsetInBlock, h.OffsetInBlock+h.ValueLen)
9494
}
9595

sstable/data_test.go

Lines changed: 2 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
"github.com/cockroachdb/crlib/crstrings"
1616
"github.com/cockroachdb/datadriven"
1717
"github.com/cockroachdb/errors"
18-
"github.com/cockroachdb/pebble/bloom"
1918
"github.com/cockroachdb/pebble/internal/base"
2019
"github.com/cockroachdb/pebble/internal/cache"
2120
"github.com/cockroachdb/pebble/internal/keyspan"
@@ -28,43 +27,8 @@ import (
2827
)
2928

3029
func optsFromArgs(td *datadriven.TestData, writerOpts *WriterOptions) error {
31-
for _, arg := range td.CmdArgs {
32-
switch arg.Key {
33-
case "leveldb":
34-
if len(arg.Vals) != 0 {
35-
return errors.Errorf("%s: arg %s expects 0 values", td.Cmd, arg.Key)
36-
}
37-
writerOpts.TableFormat = TableFormatLevelDB
38-
case "block-size":
39-
if len(arg.Vals) != 1 {
40-
return errors.Errorf("%s: arg %s expects 1 value", td.Cmd, arg.Key)
41-
}
42-
var err error
43-
writerOpts.BlockSize, err = strconv.Atoi(arg.Vals[0])
44-
if err != nil {
45-
return err
46-
}
47-
case "index-block-size":
48-
if len(arg.Vals) != 1 {
49-
return errors.Errorf("%s: arg %s expects 1 value", td.Cmd, arg.Key)
50-
}
51-
var err error
52-
writerOpts.IndexBlockSize, err = strconv.Atoi(arg.Vals[0])
53-
if err != nil {
54-
return err
55-
}
56-
case "filter":
57-
writerOpts.FilterPolicy = bloom.FilterPolicy(10)
58-
case "comparer":
59-
var err error
60-
if writerOpts.Comparer, err = comparerFromCmdArg(arg); err != nil {
61-
return err
62-
}
63-
case "writing-to-lowest-level":
64-
writerOpts.WritingToLowestLevel = true
65-
case "is-strict-obsolete":
66-
writerOpts.IsStrictObsolete = true
67-
}
30+
if err := ParseWriterOptions(writerOpts, td.CmdArgs...); err != nil {
31+
return err
6832
}
6933
if writerOpts.Comparer == nil {
7034
writerOpts.Comparer = testkeys.Comparer
@@ -76,19 +40,6 @@ func optsFromArgs(td *datadriven.TestData, writerOpts *WriterOptions) error {
7640
return nil
7741
}
7842

79-
func comparerFromCmdArg(arg datadriven.CmdArg) (*Comparer, error) {
80-
switch arg.Vals[0] {
81-
case "split-4b-suffix":
82-
return test4bSuffixComparer, nil
83-
case "testkeys":
84-
return testkeys.Comparer, nil
85-
case "default":
86-
return base.DefaultComparer, nil
87-
default:
88-
return nil, errors.Errorf("unknown comparer: %s", arg.Vals[0])
89-
}
90-
}
91-
9243
func runBuildMemObjCmd(
9344
td *datadriven.TestData, writerOpts *WriterOptions,
9445
) (*WriterMetadata, *objstorage.MemObj, error) {

sstable/suffix_rewriter_test.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -278,16 +278,3 @@ func BenchmarkRewriteSST(b *testing.B) {
278278
})
279279
}
280280
}
281-
282-
var test4bSuffixComparer = func() *base.Comparer {
283-
c := new(base.Comparer)
284-
*c = *base.DefaultComparer
285-
c.Split = func(key []byte) int {
286-
if len(key) > 4 {
287-
return len(key) - 4
288-
}
289-
return len(key)
290-
}
291-
c.Name = "comparer-split-4b-suffix"
292-
return c
293-
}()

sstable/test_utils.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ import (
1515

1616
"github.com/cockroachdb/crlib/crstrings"
1717
"github.com/cockroachdb/errors"
18+
"github.com/cockroachdb/pebble/bloom"
1819
"github.com/cockroachdb/pebble/internal/base"
1920
"github.com/cockroachdb/pebble/internal/keyspan"
21+
"github.com/cockroachdb/pebble/internal/testkeys"
2022
"github.com/cockroachdb/pebble/objstorage"
2123
"github.com/cockroachdb/pebble/sstable/blob"
2224
"github.com/cockroachdb/pebble/sstable/block"
@@ -258,3 +260,91 @@ func decodeBlobInlineHandleAndAttribute(
258260
},
259261
}, base.ShortAttribute(attr[0]), nil
260262
}
263+
264+
// ParseWriterOptions modifies WriterOptions based on the given arguments. Each
265+
// argument is a string or a fmt.Stringer (like datadriven.TestData.CmdArg) with
266+
// format either "<key>" or "<key>=<value>".
267+
func ParseWriterOptions[StringOrStringer any](o *WriterOptions, args ...StringOrStringer) error {
268+
for _, arg := range args {
269+
str, ok := any(arg).(string)
270+
if !ok {
271+
str = any(arg).(fmt.Stringer).String()
272+
}
273+
key, value, _ := strings.Cut(str, "=")
274+
var err error
275+
switch key {
276+
case "leveldb":
277+
o.TableFormat = TableFormatLevelDB
278+
case "format":
279+
switch value {
280+
case "leveldb":
281+
o.TableFormat = TableFormatLevelDB
282+
case "pebblev1":
283+
o.TableFormat = TableFormatPebblev1
284+
case "pebblev2":
285+
o.TableFormat = TableFormatPebblev2
286+
case "pebblev3":
287+
o.TableFormat = TableFormatPebblev3
288+
case "pebblev4":
289+
o.TableFormat = TableFormatPebblev4
290+
case "pebblev5":
291+
o.TableFormat = TableFormatPebblev5
292+
case "pebblev6":
293+
o.TableFormat = TableFormatPebblev6
294+
default:
295+
return errors.Errorf("unknown format string %s", value)
296+
}
297+
case "block-size":
298+
o.BlockSize, err = strconv.Atoi(value)
299+
300+
case "index-block-size":
301+
o.IndexBlockSize, err = strconv.Atoi(value)
302+
303+
case "filter":
304+
o.FilterPolicy = bloom.FilterPolicy(10)
305+
306+
case "comparer":
307+
o.Comparer, err = comparerFromCmdArg(value)
308+
309+
case "writing-to-lowest-level":
310+
o.WritingToLowestLevel = true
311+
312+
case "is-strict-obsolete":
313+
o.IsStrictObsolete = true
314+
315+
default:
316+
// TODO(radu): ignoring unknown keys is error-prone; we need to find an
317+
// easy way for the upper layer to extract its own arguments.
318+
}
319+
if err != nil {
320+
return err
321+
}
322+
}
323+
return nil
324+
}
325+
326+
func comparerFromCmdArg(value string) (*Comparer, error) {
327+
switch value {
328+
case "split-4b-suffix":
329+
return test4bSuffixComparer, nil
330+
case "testkeys":
331+
return testkeys.Comparer, nil
332+
case "default":
333+
return base.DefaultComparer, nil
334+
default:
335+
return nil, errors.Errorf("unknown comparer: %s", value)
336+
}
337+
}
338+
339+
var test4bSuffixComparer = func() *base.Comparer {
340+
c := new(base.Comparer)
341+
*c = *base.DefaultComparer
342+
c.Split = func(key []byte) int {
343+
if len(key) > 4 {
344+
return len(key) - 4
345+
}
346+
return len(key)
347+
}
348+
c.Name = "comparer-split-4b-suffix"
349+
return c
350+
}()

0 commit comments

Comments
 (0)