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 }