11package org .tron .common .storage .rocksdb ;
22
3+ import com .google .common .annotations .VisibleForTesting ;
34import com .google .common .collect .Sets ;
45import com .google .common .primitives .Bytes ;
56import java .io .File ;
2021import java .util .stream .Collectors ;
2122import lombok .NoArgsConstructor ;
2223import lombok .extern .slf4j .Slf4j ;
23- import org .rocksdb .BlockBasedTableConfig ;
24- import org .rocksdb .BloomFilter ;
2524import org .rocksdb .Checkpoint ;
26- import org .rocksdb .DirectComparator ;
2725import org .rocksdb .InfoLogLevel ;
2826import org .rocksdb .Logger ;
2927import org .rocksdb .Options ;
3028import org .rocksdb .ReadOptions ;
3129import org .rocksdb .RocksDB ;
3230import org .rocksdb .RocksDBException ;
3331import org .rocksdb .RocksIterator ;
34- import org .rocksdb .Statistics ;
3532import org .rocksdb .Status ;
3633import org .rocksdb .WriteBatch ;
3734import org .rocksdb .WriteOptions ;
5350public class RocksDbDataSourceImpl extends DbStat implements DbSourceInter <byte []>,
5451 Iterable <Map .Entry <byte [], byte []>>, Instance <RocksDbDataSourceImpl > {
5552
56- ReadOptions readOpts ;
5753 private String dataBaseName ;
5854 private RocksDB database ;
55+ private Options options ;
5956 private volatile boolean alive ;
6057 private String parentPath ;
6158 private ReadWriteLock resetDbLock = new ReentrantReadWriteLock ();
6259 private static final String KEY_ENGINE = "ENGINE" ;
6360 private static final String ROCKSDB = "ROCKSDB" ;
64- private DirectComparator comparator ;
6561 private static final org .slf4j .Logger rocksDbLogger = LoggerFactory .getLogger (ROCKSDB );
6662
67- public RocksDbDataSourceImpl (String parentPath , String name , RocksDbSettings settings ,
68- DirectComparator comparator ) {
63+ public RocksDbDataSourceImpl (String parentPath , String name , Options options ) {
6964 this .dataBaseName = name ;
7065 this .parentPath = parentPath ;
71- this .comparator = comparator ;
72- RocksDbSettings .setRocksDbSettings (settings );
73- initDB ();
74- }
75-
76- public RocksDbDataSourceImpl (String parentPath , String name , RocksDbSettings settings ) {
77- this .dataBaseName = name ;
78- this .parentPath = parentPath ;
79- RocksDbSettings .setRocksDbSettings (settings );
66+ this .options = options ;
8067 initDB ();
8168 }
8269
70+ @ VisibleForTesting
8371 public RocksDbDataSourceImpl (String parentPath , String name ) {
8472 this .parentPath = parentPath ;
8573 this .dataBaseName = name ;
74+ this .options = RocksDbSettings .getOptionsByDbName (name );
8675 }
8776
8877 public Path getDbPath () {
@@ -225,10 +214,6 @@ public void initDB() {
225214 throw new RuntimeException (
226215 String .format ("failed to check database: %s, engine do not match" , dataBaseName ));
227216 }
228- initDB (RocksDbSettings .getSettings ());
229- }
230-
231- public void initDB (RocksDbSettings settings ) {
232217 resetDbLock .writeLock ().lock ();
233218 try {
234219 if (isAlive ()) {
@@ -237,81 +222,40 @@ public void initDB(RocksDbSettings settings) {
237222 if (dataBaseName == null ) {
238223 throw new IllegalArgumentException ("No name set to the dbStore" );
239224 }
225+ options .setLogger (new Logger (options ) {
226+ @ Override
227+ protected void log (InfoLogLevel infoLogLevel , String logMsg ) {
228+ rocksDbLogger .info ("{} {}" , dataBaseName , logMsg );
229+ }
230+ });
240231
241- try ( Options options = new Options ()) {
242-
243- // most of these options are suggested by https://github.com/facebook/rocksdb/wiki/Set-Up-Options
232+ try {
233+ logger . debug ( "Opening database {}." , dataBaseName );
234+ final Path dbPath = getDbPath ();
244235
245- // general options
246- if (settings .isEnableStatistics ()) {
247- options .setStatistics (new Statistics ());
248- options .setStatsDumpPeriodSec (60 );
249- }
250- options .setCreateIfMissing (true );
251- options .setIncreaseParallelism (1 );
252- options .setLevelCompactionDynamicLevelBytes (true );
253- options .setMaxOpenFiles (settings .getMaxOpenFiles ());
254-
255- // general options supported user config
256- options .setNumLevels (settings .getLevelNumber ());
257- options .setMaxBytesForLevelMultiplier (settings .getMaxBytesForLevelMultiplier ());
258- options .setMaxBytesForLevelBase (settings .getMaxBytesForLevelBase ());
259- options .setMaxBackgroundCompactions (settings .getCompactThreads ());
260- options .setLevel0FileNumCompactionTrigger (settings .getLevel0FileNumCompactionTrigger ());
261- options .setTargetFileSizeMultiplier (settings .getTargetFileSizeMultiplier ());
262- options .setTargetFileSizeBase (settings .getTargetFileSizeBase ());
263- if (comparator != null ) {
264- options .setComparator (comparator );
236+ if (!Files .isSymbolicLink (dbPath .getParent ())) {
237+ Files .createDirectories (dbPath .getParent ());
265238 }
266- options .setLogger (new Logger (options ) {
267- @ Override
268- protected void log (InfoLogLevel infoLogLevel , String logMsg ) {
269- rocksDbLogger .info ("{} {}" , dataBaseName , logMsg );
270- }
271- });
272-
273- // table options
274- final BlockBasedTableConfig tableCfg ;
275- options .setTableFormatConfig (tableCfg = new BlockBasedTableConfig ());
276- tableCfg .setBlockSize (settings .getBlockSize ());
277- tableCfg .setBlockCache (RocksDbSettings .getCache ());
278- tableCfg .setCacheIndexAndFilterBlocks (true );
279- tableCfg .setPinL0FilterAndIndexBlocksInCache (true );
280- tableCfg .setFilter (new BloomFilter (10 , false ));
281-
282- // read options
283- readOpts = new ReadOptions ();
284- readOpts = readOpts .setPrefixSameAsStart (true )
285- .setVerifyChecksums (false );
286239
287240 try {
288- logger .debug ("Opening database {}." , dataBaseName );
289- final Path dbPath = getDbPath ();
290-
291- if (!Files .isSymbolicLink (dbPath .getParent ())) {
292- Files .createDirectories (dbPath .getParent ());
241+ database = RocksDB .open (options , dbPath .toString ());
242+ } catch (RocksDBException e ) {
243+ if (Objects .equals (e .getStatus ().getCode (), Status .Code .Corruption )) {
244+ logger .error ("Database {} corrupted, please delete database directory({}) "
245+ + "and restart." , dataBaseName , parentPath , e );
246+ } else {
247+ logger .error ("Open Database {} failed" , dataBaseName , e );
293248 }
294-
295- try {
296- database = RocksDB .open (options , dbPath .toString ());
297- } catch (RocksDBException e ) {
298- if (Objects .equals (e .getStatus ().getCode (), Status .Code .Corruption )) {
299- logger .error ("Database {} corrupted, please delete database directory({}) " +
300- "and restart." , dataBaseName , parentPath , e );
301- } else {
302- logger .error ("Open Database {} failed" , dataBaseName , e );
303- }
304- throw new TronError (e , TronError .ErrCode .ROCKSDB_INIT );
305- }
306-
307- alive = true ;
308- } catch (IOException ioe ) {
309- throw new RuntimeException (
310- String .format ("failed to init database: %s" , dataBaseName ), ioe );
249+ throw new TronError (e , TronError .ErrCode .ROCKSDB_INIT );
311250 }
312251
313- logger .debug ("Init DB {} done." , dataBaseName );
252+ alive = true ;
253+ } catch (IOException ioe ) {
254+ throw new RuntimeException (
255+ String .format ("failed to init database: %s" , dataBaseName ), ioe );
314256 }
257+
258+ logger .debug ("Init DB {} done." , dataBaseName );
315259 } finally {
316260 resetDbLock .writeLock ().unlock ();
317261 }
@@ -516,7 +460,8 @@ public boolean deleteDbBakPath(String dir) {
516460
517461 @ Override
518462 public RocksDbDataSourceImpl newInstance () {
519- return new RocksDbDataSourceImpl (parentPath , dataBaseName , RocksDbSettings .getSettings ());
463+ return new RocksDbDataSourceImpl (parentPath , dataBaseName ,
464+ this .options );
520465 }
521466
522467
0 commit comments