diff --git a/index/store/leveldb/store.go b/index/store/leveldb/store.go index f0b7e335..d17fbc89 100644 --- a/index/store/leveldb/store.go +++ b/index/store/leveldb/store.go @@ -29,15 +29,13 @@ type Store struct { writer sync.Mutex } -func Open(path string, createIfMissing bool, errorIfExists bool) (*Store, error) { +func Open(path string, config map[string]interface{}) (*Store, error) { rv := Store{ path: path, + opts: levigo.NewOptions(), } - opts := levigo.NewOptions() - opts.SetCreateIfMissing(createIfMissing) - opts.SetErrorIfExists(errorIfExists) - rv.opts = opts + applyConfig(rv.opts, config) var err error rv.db, err = levigo.Open(rv.path, rv.opts) @@ -118,19 +116,52 @@ func StoreConstructor(config map[string]interface{}) (store.KVStore, error) { if !ok { return nil, fmt.Errorf("must specify path") } - createIfMissing := false - cim, ok := config["create_if_missing"].(bool) - if ok { - createIfMissing = cim - } - errorIfExists := true - eie, ok := config["error_if_exists"].(bool) - if ok { - errorIfExists = eie - } - return Open(path, createIfMissing, errorIfExists) + return Open(path, config) } func init() { registry.RegisterKVStore(Name, StoreConstructor) } + +func applyConfig(o *levigo.Options, config map[string]interface{}) ( + *levigo.Options, error) { + + cim, ok := config["create_if_missing"].(bool) + if ok { + o.SetCreateIfMissing(cim) + } + + eie, ok := config["error_if_exists"].(bool) + if ok { + o.SetErrorIfExists(eie) + } + + wbs, ok := config["write_buffer_size"].(float64) + if ok { + o.SetWriteBufferSize(int(wbs)) + } + + bs, ok := config["block_size"].(float64) + if ok { + o.SetBlockSize(int(bs)) + } + + bri, ok := config["block_restart_interval"].(float64) + if ok { + o.SetBlockRestartInterval(int(bri)) + } + + lcc, ok := config["lru_cache_capacity"].(float64) + if ok { + lruCache := levigo.NewLRUCache(int(lcc)) + o.SetCache(lruCache) + } + + bfbpk, ok := config["bloom_filter_bits_per_key"].(float64) + if ok { + bf := levigo.NewBloomFilter(int(bfbpk)) + o.SetFilterPolicy(bf) + } + + return o, nil +} diff --git a/index/store/leveldb/store_test.go b/index/store/leveldb/store_test.go index b21f14ca..dba87fd1 100644 --- a/index/store/leveldb/store_test.go +++ b/index/store/leveldb/store_test.go @@ -19,10 +19,14 @@ import ( "github.com/blevesearch/bleve/index/store" ) +var leveldbTestOptions = map[string]interface{}{ + "create_if_missing": true, +} + func TestLevelDBStore(t *testing.T) { defer os.RemoveAll("test") - s, err := Open("test", true, true) + s, err := Open("test", leveldbTestOptions) if err != nil { t.Fatal(err) } @@ -34,7 +38,7 @@ func TestLevelDBStore(t *testing.T) { func TestReaderIsolation(t *testing.T) { defer os.RemoveAll("test") - s, err := Open("test", true, true) + s, err := Open("test", leveldbTestOptions) if err != nil { t.Fatal(err) } diff --git a/index/upside_down/benchmark_leveldb_test.go b/index/upside_down/benchmark_leveldb_test.go index cff73dbe..6b38ad4c 100644 --- a/index/upside_down/benchmark_leveldb_test.go +++ b/index/upside_down/benchmark_leveldb_test.go @@ -18,8 +18,12 @@ import ( "github.com/blevesearch/bleve/index/store/leveldb" ) +var leveldbTestOptions = map[string]interface{}{ + "create_if_missing": true, +} + func BenchmarkLevelDBIndexing1Workers(b *testing.B) { - s, err := leveldb.Open("test", true, true) + s, err := leveldb.Open("test", leveldbTestOptions) if err != nil { b.Fatal(err) } @@ -30,7 +34,7 @@ func BenchmarkLevelDBIndexing1Workers(b *testing.B) { } func BenchmarkLevelDBIndexing2Workers(b *testing.B) { - s, err := leveldb.Open("test", true, true) + s, err := leveldb.Open("test", leveldbTestOptions) if err != nil { b.Fatal(err) } @@ -41,7 +45,7 @@ func BenchmarkLevelDBIndexing2Workers(b *testing.B) { } func BenchmarkLevelDBIndexing4Workers(b *testing.B) { - s, err := leveldb.Open("test", true, true) + s, err := leveldb.Open("test", leveldbTestOptions) if err != nil { b.Fatal(err) } @@ -54,7 +58,7 @@ func BenchmarkLevelDBIndexing4Workers(b *testing.B) { // batches func BenchmarkLevelDBIndexing1Workers10Batch(b *testing.B) { - s, err := leveldb.Open("test", true, true) + s, err := leveldb.Open("test", leveldbTestOptions) if err != nil { b.Fatal(err) } @@ -65,7 +69,7 @@ func BenchmarkLevelDBIndexing1Workers10Batch(b *testing.B) { } func BenchmarkLevelDBIndexing2Workers10Batch(b *testing.B) { - s, err := leveldb.Open("test", true, true) + s, err := leveldb.Open("test", leveldbTestOptions) if err != nil { b.Fatal(err) } @@ -76,7 +80,7 @@ func BenchmarkLevelDBIndexing2Workers10Batch(b *testing.B) { } func BenchmarkLevelDBIndexing4Workers10Batch(b *testing.B) { - s, err := leveldb.Open("test", true, true) + s, err := leveldb.Open("test", leveldbTestOptions) if err != nil { b.Fatal(err) } @@ -87,7 +91,7 @@ func BenchmarkLevelDBIndexing4Workers10Batch(b *testing.B) { } func BenchmarkLevelDBIndexing1Workers100Batch(b *testing.B) { - s, err := leveldb.Open("test", true, true) + s, err := leveldb.Open("test", leveldbTestOptions) if err != nil { b.Fatal(err) } @@ -98,7 +102,7 @@ func BenchmarkLevelDBIndexing1Workers100Batch(b *testing.B) { } func BenchmarkLevelDBIndexing2Workers100Batch(b *testing.B) { - s, err := leveldb.Open("test", true, true) + s, err := leveldb.Open("test", leveldbTestOptions) if err != nil { b.Fatal(err) } @@ -109,7 +113,7 @@ func BenchmarkLevelDBIndexing2Workers100Batch(b *testing.B) { } func BenchmarkLevelDBIndexing4Workers100Batch(b *testing.B) { - s, err := leveldb.Open("test", true, true) + s, err := leveldb.Open("test", leveldbTestOptions) if err != nil { b.Fatal(err) }