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  }