github.com/scottcagno/storage@v1.8.0/pkg/_junk/_lsmtree/sstable/sstable_test.go (about) 1 package sstable 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "testing" 7 "time" 8 ) 9 10 func TestSparseIndex(t *testing.T) { 11 // create new sstable 12 sst, err := CreateSSTable("data", 1) 13 if err != nil { 14 t.Fatalf("creating sst: %v\n", err) 15 } 16 17 // create and test batch 18 batch := NewBatch() 19 for i := 0; i < 500; i++ { 20 // odd numbers 21 k, v := fmt.Sprintf("key-%04d", i), fmt.Sprintf("value-%06d", i) 22 batch.Write(k, []byte(v)) 23 } 24 err = sst.WriteBatch(batch) 25 if err != nil { 26 t.Fatalf("writing (batch) to sst: %v\n", err) 27 } 28 29 // close sst 30 err = sst.Close() 31 if err != nil { 32 t.Fatalf("closing sst: %v\n", err) 33 } 34 35 // opening sparse index 36 ssm, err := OpenSSManager("data") 37 if err != nil { 38 t.Fatalf("opening ssm: %v\n", err) 39 } 40 41 for i := range ssm.sparse { 42 fmt.Printf("%s\n", ssm.sparse[i]) 43 } 44 45 key := "key-0037" 46 p, o := ssm.SearchSparseIndex(key) 47 fmt.Printf("searching(%q): path=%q, offset=%d\n", key, filepath.Base(p), o) 48 49 key = "key-0002" 50 p, o = ssm.SearchSparseIndex(key) 51 fmt.Printf("searching(%q): path=%q, offset=%d\n", key, filepath.Base(p), o) 52 53 key = "key-0321" 54 p, o = ssm.SearchSparseIndex(key) 55 fmt.Printf("searching(%q): path=%q, offset=%d\n", key, filepath.Base(p), o) 56 57 key = "key-0905" 58 p, o = ssm.SearchSparseIndex(key) 59 fmt.Printf("searching(%q): path=%q, offset=%d\n", key, filepath.Base(p), o) 60 61 key = "key-3754" 62 p, o = ssm.SearchSparseIndex(key) 63 fmt.Printf("searching(%q): path=%q, offset=%d\n", key, filepath.Base(p), o) 64 65 err = ssm.Close() 66 if err != nil { 67 t.Fatalf("closing ssm: %v\n", err) 68 } 69 } 70 71 func TestCompactSSTables(t *testing.T) { 72 ssm, err := OpenSSManager("data") 73 if err != nil { 74 t.Fatalf("compacting: %v\n", err) 75 } 76 err = ssm.CompactSSTables(3) 77 if err != nil { 78 t.Fatalf("compacting: %v\n", err) 79 } 80 } 81 82 func TestMergeSSTable(t *testing.T) { 83 84 // create new sstable 85 sst, err := CreateSSTable("data", 1) 86 if err != nil { 87 t.Fatalf("creating sst: %v\n", err) 88 } 89 90 // create and test batch 91 batch := NewBatch() 92 for i := 0; i < 5000; i++ { 93 if i%2 == 1 { 94 // odd numbers 95 k, v := fmt.Sprintf("key-%04d", i), fmt.Sprintf("value-%06d", i) 96 batch.Write(k, []byte(v)) 97 } 98 } 99 err = sst.WriteBatch(batch) 100 if err != nil { 101 t.Fatalf("writing (batch) to sst: %v\n", err) 102 } 103 104 // close sst 105 err = sst.Close() 106 if err != nil { 107 t.Fatalf("closing sst: %v\n", err) 108 } 109 110 // create new sstable 111 sst, err = CreateSSTable("data", 2) 112 if err != nil { 113 t.Fatalf("creating sst: %v\n", err) 114 } 115 116 // create and test batch 117 batch = NewBatch() 118 for i := 0; i < 5000; i++ { 119 if i%2 == 0 { 120 // even numbers 121 k, v := fmt.Sprintf("key-%04d", i), fmt.Sprintf("value-%06d", i) 122 batch.Write(k, []byte(v)) 123 } else { 124 // odd numbers on 2nd table, write tombstones 125 batch.Write(fmt.Sprintf("key-%04d", i), TombstoneEntry) 126 } 127 } 128 err = sst.WriteBatch(batch) 129 if err != nil { 130 t.Fatalf("writing (batch) to sst: %v\n", err) 131 } 132 133 // close sst 134 err = sst.Close() 135 if err != nil { 136 t.Fatalf("closing sst: %v\n", err) 137 } 138 139 ssm, err := OpenSSManager("data") 140 if err != nil { 141 t.Fatalf("ssm: %v\n", err) 142 } 143 144 ts1 := time.Now() 145 err = ssm.MergeSSTables(1, 2) 146 if err != nil { 147 t.Fatalf("closing sst: %v\n", err) 148 } 149 ts2 := time.Since(ts1) 150 fmt.Printf("MERGE TOO: %v microseconds\n", ts2.Microseconds()) 151 } 152 153 func TestCreateSSTable(t *testing.T) { 154 155 // create new sstable 156 sst, err := CreateSSTable("data", 1) 157 if err != nil { 158 t.Fatalf("creating sst: %v\n", err) 159 } 160 161 // create and test batch 162 batch := NewBatch() 163 batch.Write("key-01", []byte("value-01")) 164 batch.Write("key-02", []byte("value-02")) 165 batch.Write("key-03", []byte("value-03")) 166 err = sst.WriteBatch(batch) 167 if err != nil { 168 t.Fatalf("writing (batch) to sst: %v\n", err) 169 } 170 171 // write some entries 172 err = sst.WriteEntry(&sstDataEntry{ 173 key: "abc", 174 value: []byte("ABC"), 175 }) 176 if err != nil { 177 t.Fatalf("writing to sst: %v\n", err) 178 } 179 err = sst.WriteEntry(&sstDataEntry{ 180 key: "def", 181 value: []byte("DEF"), 182 }) 183 if err != nil { 184 t.Fatalf("writing to sst: %v\n", err) 185 } 186 err = sst.WriteEntry(&sstDataEntry{ 187 key: "ghi", 188 value: []byte("GHI"), 189 }) 190 if err != nil { 191 t.Fatalf("writing to sst: %v\n", err) 192 } 193 194 // close sst 195 err = sst.Close() 196 if err != nil { 197 t.Fatalf("closing sst: %v\n", err) 198 } 199 } 200 201 func TestOpenSSTable(t *testing.T) { 202 203 // open sstable 204 sst, err := OpenSSTable("data", 1) 205 if err != nil { 206 t.Fatalf("opening: %v\n", err) 207 } 208 209 fmt.Printf("printing sst index...\n") 210 for _, idx := range sst.index.data { 211 fmt.Printf("%s\n", idx) 212 } 213 214 key := "def" 215 off, err := sst.index.GetEntryOffset(key) 216 if err != nil { 217 t.Fatalf("finding entry: %v\n", err) 218 } 219 fmt.Printf("got entry offset for %q, offset=%d\n", key, off) 220 221 fmt.Printf("size of entry index: %d\n", len(sst.index.data)) 222 sst.index.data = nil 223 fmt.Printf("size of entry index: %d\n", len(sst.index.data)) 224 err = RebuildSSTableIndex("data", 1) 225 if err != nil { 226 t.Fatalf("re-building index: %v\n", err) 227 } 228 fmt.Printf("size of entry index: %d\n", len(sst.index.data)) 229 230 // close sstable 231 err = sst.Close() 232 if err != nil { 233 t.Fatalf("closing: %v\n", err) 234 } 235 }