Skip to content

Commit 28687a6

Browse files
authored
Merge pull request #31 from scalableminds/fix-columnFamily-options
Fix column family options
2 parents 6ee35cd + 0f6c94c commit 28687a6

File tree

4 files changed

+38
-17
lines changed

4 files changed

+38
-17
lines changed

src/main/protobuf/fossildbapi.proto

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ message RestoreFromBackupReply {
130130
optional string errorMessage = 2;
131131
}
132132

133+
message CompactAllDataRequest {}
134+
135+
message CompactAllDataReply {
136+
required bool success = 1;
137+
optional string errorMessage = 2;
138+
}
139+
133140

134141
service FossilDB {
135142
rpc Health (HealthRequest) returns (HealthReply) {}
@@ -143,4 +150,5 @@ service FossilDB {
143150
rpc ListVersions (ListVersionsRequest) returns (ListVersionsReply) {}
144151
rpc Backup (BackupRequest) returns (BackupReply) {}
145152
rpc RestoreFromBackup (RestoreFromBackupRequest) returns (RestoreFromBackupReply) {}
153+
rpc CompactAllData (CompactAllDataRequest) returns (CompactAllDataReply) {}
146154
}

src/main/scala/com/scalableminds/fossildb/FossilDBGrpcImpl.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ class FossilDBGrpcImpl(storeManager: StoreManager)
9090
RestoreFromBackupReply(true)
9191
} {errorMsg => RestoreFromBackupReply(false, errorMsg)}
9292

93+
override def compactAllData(req: CompactAllDataRequest) = withExceptionHandler(req) {
94+
storeManager.compactAllData
95+
CompactAllDataReply(true)
96+
} {errorMsg => CompactAllDataReply(false, errorMsg)}
9397

9498
private def withExceptionHandler [T, R <: GeneratedMessage](request: R)(tryBlock: => T)(onErrorBlock: Option[String] => T): Future[T] = {
9599
try {

src/main/scala/com/scalableminds/fossildb/db/RocksDBStore.scala

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/main/scala/com/scalableminds/fossildb/db/StoreManager.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ class StoreManager(dataDir: Path, backupDir: Path, columnFamilies: List[String],
6666
}
6767
}
6868

69+
def compactAllData = {
70+
failDuringBackup
71+
failDuringRestore
72+
try {
73+
rocksDBManager.get.compactAllData()
74+
}
75+
}
76+
6977
def close = {
7078
rocksDBManager.map(_.close)
7179
}

0 commit comments

Comments
 (0)