github.com/aychain/blockbook@v0.1.1-0.20181121092459-6d1fc7e07c5b/db/dboptions.go (about)

     1  package db
     2  
     3  // #include "rocksdb/c.h"
     4  import "C"
     5  
     6  import (
     7  	"reflect"
     8  	"unsafe"
     9  
    10  	"github.com/tecbot/gorocksdb"
    11  )
    12  
    13  /*
    14  	possible additional tuning, using options not accessible by gorocksdb
    15  
    16  // #include "rocksdb/c.h"
    17  import "C"
    18  
    19  	cNativeOpts := C.rocksdb_options_create()
    20  	opts := &gorocksdb.Options{}
    21  	cField := reflect.Indirect(reflect.ValueOf(opts)).FieldByName("c")
    22  	cPtr := (**C.rocksdb_options_t)(unsafe.Pointer(cField.UnsafeAddr()))
    23  	*cPtr = cNativeOpts
    24  
    25  	cNativeBlockOpts := C.rocksdb_block_based_options_create()
    26  	blockOpts := &gorocksdb.BlockBasedTableOptions{}
    27  	cBlockField := reflect.Indirect(reflect.ValueOf(blockOpts)).FieldByName("c")
    28  	cBlockPtr := (**C.rocksdb_block_based_table_options_t)(unsafe.Pointer(cBlockField.UnsafeAddr()))
    29  	*cBlockPtr = cNativeBlockOpts
    30  
    31  	// https://github.com/facebook/rocksdb/wiki/Partitioned-Index-Filters
    32  	blockOpts.SetIndexType(gorocksdb.KTwoLevelIndexSearchIndexType)
    33  	C.rocksdb_block_based_options_set_partition_filters(cNativeBlockOpts, boolToChar(true))
    34  	C.rocksdb_block_based_options_set_metadata_block_size(cNativeBlockOpts, C.uint64_t(4096))
    35  	C.rocksdb_block_based_options_set_cache_index_and_filter_blocks_with_high_priority(cNativeBlockOpts, boolToChar(true))
    36  	blockOpts.SetPinL0FilterAndIndexBlocksInCache(true)
    37  
    38  // boolToChar converts a bool value to C.uchar.
    39  func boolToChar(b bool) C.uchar {
    40  	if b {
    41  		return 1
    42  	}
    43  	return 0
    44  }
    45  */
    46  
    47  func createAndSetDBOptions(bloomBits int, c *gorocksdb.Cache, maxOpenFiles int) *gorocksdb.Options {
    48  	// blockOpts := gorocksdb.NewDefaultBlockBasedTableOptions()
    49  	cNativeBlockOpts := C.rocksdb_block_based_options_create()
    50  	blockOpts := &gorocksdb.BlockBasedTableOptions{}
    51  	cBlockField := reflect.Indirect(reflect.ValueOf(blockOpts)).FieldByName("c")
    52  	cBlockPtr := (**C.rocksdb_block_based_table_options_t)(unsafe.Pointer(cBlockField.UnsafeAddr()))
    53  	*cBlockPtr = cNativeBlockOpts
    54  	blockOpts.SetBlockSize(32 << 10) // 32kB
    55  	blockOpts.SetBlockCache(c)
    56  	if bloomBits > 0 {
    57  		blockOpts.SetFilterPolicy(gorocksdb.NewBloomFilter(bloomBits))
    58  	}
    59  	C.rocksdb_block_based_options_set_format_version(cNativeBlockOpts, 3)
    60  
    61  	opts := gorocksdb.NewDefaultOptions()
    62  	opts.SetBlockBasedTableFactory(blockOpts)
    63  	opts.SetCreateIfMissing(true)
    64  	opts.SetCreateIfMissingColumnFamilies(true)
    65  	opts.SetMaxBackgroundCompactions(6)
    66  	opts.SetMaxBackgroundFlushes(6)
    67  	opts.SetBytesPerSync(8 << 20)         // 8MB
    68  	opts.SetWriteBufferSize(1 << 27)      // 128MB
    69  	opts.SetMaxBytesForLevelBase(1 << 27) // 128MB
    70  	opts.SetMaxOpenFiles(maxOpenFiles)
    71  	opts.SetCompression(gorocksdb.LZ4HCCompression)
    72  	return opts
    73  }