@@ -21,17 +21,9 @@ class RocksDBManager(dataDir: Path, columnFamilies: List[String], optionsFilePat
2121
2222  val  (db : RocksDB , columnFamilyHandles) =  {
2323    RocksDB .loadLibrary()
24-     val  columnOptions  =  new  ColumnFamilyOptions ()
25-       .setArenaBlockSize(4  *  1024  *  1024 )               //  4MB
26-       .setTargetFileSizeBase(1024  *  1024  *  1024 )        //  1GB
27-       .setMaxBytesForLevelBase(10  *  1024  *  1024  *  1024 ) //  10GB
28-     val  columnFamilyDescriptors  =  (columnFamilies.map(_.getBytes) :+  RocksDB .DEFAULT_COLUMN_FAMILY ).map { columnFamily => 
29-       new  ColumnFamilyDescriptor (columnFamily, columnOptions)
30-     }
31-     val  columnFamilyHandles  =  new  util.ArrayList [ColumnFamilyHandle ]
32-     var  options  =  new  DBOptions ()
33-     var  cfListRef :  mutable.Buffer [ColumnFamilyDescriptor ] =  mutable.Buffer ()
34-     optionsFilePathOpt.map { optionsFilePath => 
24+     val  options  =  new  DBOptions ()
25+     val  cfListRef :  mutable.Buffer [ColumnFamilyDescriptor ] =  mutable.Buffer ()
26+     optionsFilePathOpt.foreach { optionsFilePath => 
3527      try  {
3628        org.rocksdb.OptionsUtil .loadOptionsFromFile(optionsFilePath, Env .getDefault, options, cfListRef.asJava)
3729        logger.info(" successfully loaded rocksdb options from "   +  optionsFilePath)
@@ -41,10 +33,12 @@ class RocksDBManager(dataDir: Path, columnFamilies: List[String], optionsFilePat
4133        }
4234      }
4335    }
44-     options =  options
45-       .setCreateIfMissing(true )
46-       .setCreateMissingColumnFamilies(true )
36+     options.setCreateIfMissing(true ).setCreateMissingColumnFamilies(true )
37+     val  defaultColumnFamilyOptions  =  cfListRef.find(_.getName sameElements RocksDB .DEFAULT_COLUMN_FAMILY ).map(_.getOptions).getOrElse(new  ColumnFamilyOptions ())
38+     val  newColumnFamilyDescriptors  =  (columnFamilies.map(_.getBytes) :+  RocksDB .DEFAULT_COLUMN_FAMILY ).diff(cfListRef.toList.map(_.getName)).map(new  ColumnFamilyDescriptor (_, defaultColumnFamilyOptions))
39+     val  columnFamilyDescriptors  =  cfListRef.toList :::  newColumnFamilyDescriptors
4740    logger.info(" Opening RocksDB at "   +  dataDir.toAbsolutePath)
41+     val  columnFamilyHandles  =  new  util.ArrayList [ColumnFamilyHandle ]
4842    val  db  =  RocksDB .open(
4943      options,
5044      dataDir.toAbsolutePath.toString,
@@ -61,7 +55,7 @@ class RocksDBManager(dataDir: Path, columnFamilies: List[String], optionsFilePat
6155    if  (! Files .exists(backupDir) ||  ! Files .isDirectory(backupDir))
6256      Files .createDirectories(backupDir)
6357
64-     RocksDB .loadLibrary
58+     RocksDB .loadLibrary() 
6559    val  backupEngine  =  BackupEngine .open(Env .getDefault, new  BackupableDBOptions (backupDir.toString))
6660    backupEngine.createNewBackup(db)
6761    backupEngine.purgeOldBackups(1 )
@@ -71,12 +65,19 @@ class RocksDBManager(dataDir: Path, columnFamilies: List[String], optionsFilePat
7165  def  restoreFromBackup (backupDir : Path ) =  {
7266    logger.info(" Restoring from backup. RocksDB temporarily unavailable"  )
7367    close()
74-     RocksDB .loadLibrary
68+     RocksDB .loadLibrary() 
7569    val  backupEngine  =  BackupEngine .open(Env .getDefault, new  BackupableDBOptions (backupDir.toString))
7670    backupEngine.restoreDbFromLatestBackup(dataDir.toString, dataDir.toString, new  RestoreOptions (true ))
7771    logger.info(" Restoring from backup complete. Reopening RocksDB"  )
7872  }
7973
74+   def  compactAllData () =  {
75+     logger.info(" Compacting all data"  )
76+     RocksDB .loadLibrary()
77+     db.compactRange()
78+     logger.info(" All data has been compacted to last level containing data"  )
79+   }
80+ 
8081  def  close ():  Future [Unit ] =  {
8182    logger.info(" Closing RocksDB handle"  )
8283    Future .successful(db.close())
@@ -100,7 +101,7 @@ class RocksDBIterator(it: RocksIterator, prefix: Option[String]) extends Iterato
100101  override  def  hasNext :  Boolean  =  it.isValid &&  prefix.forall(it.key().startsWith(_))
101102
102103  override  def  next :  KeyValuePair [Array [Byte ]] =  {
103-     val  value  =  KeyValuePair (new  String (it.key().map(_.toChar))  , it.value())
104+     val  value  =  KeyValuePair (new  String (it.key().map(_.toChar)), it.value())
104105    it.next()
105106    value
106107  }
0 commit comments