github.com/almightyhelp/blockbook@v0.4.2-0.20210524123154-8697b01c4af9/db/dboptions.go (about)

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