github.com/cockroachdb/pebble@v1.1.1-0.20240513155919-3622ade60459/tool/make_test_find_db.go (about) 1 // Copyright 2020 The LevelDB-Go and Pebble Authors. All rights reserved. Use 2 // of this source code is governed by a BSD-style license that can be found in 3 // the LICENSE file. 4 5 //go:build make_test_find_db 6 // +build make_test_find_db 7 8 // Run using: go run -tags make_test_find_db ./tool/make_test_find_db.go 9 package main 10 11 import ( 12 "log" 13 14 "github.com/cockroachdb/pebble" 15 "github.com/cockroachdb/pebble/internal/base" 16 "github.com/cockroachdb/pebble/objstorage/objstorageprovider" 17 "github.com/cockroachdb/pebble/sstable" 18 "github.com/cockroachdb/pebble/vfs" 19 ) 20 21 type db struct { 22 db *pebble.DB 23 comparer *base.Comparer 24 merger *base.Merger 25 } 26 27 func open(fs vfs.FS, dir string) *db { 28 c := *base.DefaultComparer 29 c.Name = "alt-comparer" 30 31 m := *base.DefaultMerger 32 m.Name = "test-merger" 33 34 lel := pebble.MakeLoggingEventListener(pebble.DefaultLogger) 35 d, err := pebble.Open(dir, &pebble.Options{ 36 Cleaner: pebble.ArchiveCleaner{}, 37 Comparer: &c, 38 EventListener: &lel, 39 FS: fs, 40 Merger: &m, 41 }) 42 if err != nil { 43 log.Fatal(err) 44 } 45 return &db{ 46 db: d, 47 comparer: &c, 48 merger: &m, 49 } 50 } 51 52 func (d *db) close() { 53 if err := d.db.Close(); err != nil { 54 log.Fatal(err) 55 } 56 } 57 58 func (d *db) set(key, value string) { 59 if err := d.db.Set([]byte(key), []byte(value), nil); err != nil { 60 log.Fatal(err) 61 } 62 } 63 64 func (d *db) merge(key, value string) { 65 if err := d.db.Merge([]byte(key), []byte(value), nil); err != nil { 66 log.Fatal(err) 67 } 68 } 69 70 func (d *db) delete(key string) { 71 if err := d.db.Delete([]byte(key), nil); err != nil { 72 log.Fatal(err) 73 } 74 } 75 76 func (d *db) singleDelete(key string) { 77 if err := d.db.SingleDelete([]byte(key), nil); err != nil { 78 log.Fatal(err) 79 } 80 } 81 82 func (d *db) deleteRange(start, end string) { 83 if err := d.db.DeleteRange([]byte(start), []byte(end), nil); err != nil { 84 log.Fatal(err) 85 } 86 } 87 88 func (d *db) ingest(keyVals ...string) { 89 const path = "tool/testdata/ingest.tmp" 90 91 if len(keyVals)%2 != 0 { 92 log.Fatalf("even number of key/values required") 93 } 94 95 fs := vfs.Default 96 f, err := fs.Create(path) 97 if err != nil { 98 log.Fatal(err) 99 } 100 w := sstable.NewWriter(objstorageprovider.NewFileWritable(f), sstable.WriterOptions{ 101 Comparer: d.comparer, 102 MergerName: d.merger.Name, 103 }) 104 105 for i := 0; i < len(keyVals); i += 2 { 106 key := keyVals[i] 107 value := keyVals[i+1] 108 if err := w.Set([]byte(key), []byte(value)); err != nil { 109 log.Fatal(err) 110 } 111 } 112 113 if err := w.Close(); err != nil { 114 log.Fatal(err) 115 } 116 117 if err := d.db.Ingest([]string{path}); err != nil { 118 log.Fatal(err) 119 } 120 } 121 122 func (d *db) flush() { 123 if err := d.db.Flush(); err != nil { 124 log.Fatal(err) 125 } 126 } 127 128 func (d *db) compact(start, end string) { 129 if err := d.db.Compact([]byte(start), []byte(end), false); err != nil { 130 log.Fatal(err) 131 } 132 } 133 134 func (d *db) snapshot() *pebble.Snapshot { 135 return d.db.NewSnapshot() 136 } 137 138 func main() { 139 const dir = "tool/testdata/find-db" 140 141 fs := vfs.Default 142 if err := fs.RemoveAll(dir); err != nil { 143 log.Fatal(err) 144 } 145 146 d := open(fs, dir) 147 defer d.close() 148 149 d.set("aaa", "1") 150 d.set("bbb", "2") 151 d.merge("ccc", "3") 152 d.merge("ccc", "4") 153 d.merge("ccc", "5") 154 d.flush() 155 d.compact("a", "z") 156 157 defer d.snapshot().Close() 158 159 d.ingest("bbb", "22", "ccc", "6") 160 d.ingest("ddd", "33") 161 d.compact("a", "z") 162 163 defer d.snapshot().Close() 164 165 d.delete("aaa") 166 d.singleDelete("ccc") 167 d.deleteRange("bbb", "eee") 168 d.flush() 169 170 d.compact("a", "z") 171 }