Skip to content

Commit 40df842

Browse files
RocksDB (#3830)
1 parent 1e4831f commit 40df842

File tree

210 files changed

+6243
-4241
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

210 files changed

+6243
-4241
lines changed

benchmark/build.sbt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ enablePlugins(JmhPlugin)
33
Jmh / version := "1.33"
44

55
libraryDependencies ++= Seq(
6-
"org.scodec" %% "scodec-core" % "1.11.10"
6+
"org.scodec" %% "scodec-core" % "1.11.10",
7+
"org.eclipse.collections" % "eclipse-collections" % "11.1.0"
78
) ++ Dependencies.logDeps
89

910
// https://github.com/ktoso/sbt-jmh#adding-to-your-project

benchmark/src/main/scala/com/wavesplatform/state/DBState.scala

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ import java.io.File
55
import com.wavesplatform.Application
66
import com.wavesplatform.account.AddressScheme
77
import com.wavesplatform.common.state.ByteStr
8-
import com.wavesplatform.database.{LevelDBWriter, openDB}
8+
import com.wavesplatform.database.{RDB, RocksDBWriter}
99
import com.wavesplatform.lang.directives.DirectiveSet
1010
import com.wavesplatform.settings.WavesSettings
1111
import com.wavesplatform.transaction.smart.WavesEnvironment
1212
import com.wavesplatform.utils.ScorexLogging
1313
import monix.eval.Coeval
14-
import org.iq80.leveldb.DB
1514
import org.openjdk.jmh.annotations.{Param, Scope, State, TearDown}
1615

1716
@State(Scope.Benchmark)
@@ -21,28 +20,29 @@ abstract class DBState extends ScorexLogging {
2120

2221
lazy val settings: WavesSettings = Application.loadApplicationConfig(Some(new File(configFile)).filter(_.exists()))
2322

24-
lazy val db: DB = openDB(settings.dbSettings.directory)
23+
lazy val rdb: RDB = RDB.open(settings.dbSettings)
2524

26-
lazy val levelDBWriter: LevelDBWriter =
27-
LevelDBWriter.readOnly(
28-
db,
29-
settings.copy(dbSettings = settings.dbSettings.copy(maxCacheSize = 1))
25+
lazy val rocksDBWriter: RocksDBWriter =
26+
new RocksDBWriter(
27+
rdb,
28+
settings.blockchainSettings,
29+
settings.dbSettings.copy(maxCacheSize = 1)
3030
)
3131

3232
AddressScheme.current = new AddressScheme { override val chainId: Byte = 'W' }
3333

3434
lazy val environment = new WavesEnvironment(
3535
AddressScheme.current.chainId,
3636
Coeval.raiseError(new NotImplementedError("`tx` is not implemented")),
37-
Coeval(levelDBWriter.height),
38-
levelDBWriter,
37+
Coeval(rocksDBWriter.height),
38+
rocksDBWriter,
3939
null,
4040
DirectiveSet.contractDirectiveSet,
4141
ByteStr.empty
4242
)
4343

4444
@TearDown
4545
def close(): Unit = {
46-
db.close()
46+
rdb.close()
4747
}
4848
}

benchmark/src/test/scala/com/wavesplatform/RollbackBenchmark.scala

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
package com.wavesplatform
22

33
import java.io.File
4+
45
import com.google.common.primitives.Ints
56
import com.google.protobuf.ByteString
67
import com.wavesplatform.account.{Address, AddressScheme, KeyPair}
78
import com.wavesplatform.block.Block
89
import com.wavesplatform.common.state.ByteStr
910
import com.wavesplatform.common.utils.*
10-
import com.wavesplatform.database.{LevelDBWriter, openDB}
11+
import com.wavesplatform.database.{RDB, RocksDBWriter}
1112
import com.wavesplatform.protobuf.transaction.PBRecipients
1213
import com.wavesplatform.state.{Diff, Portfolio}
13-
import com.wavesplatform.transaction.{GenesisTransaction, Proofs, TxDecimals, TxPositiveAmount}
1414
import com.wavesplatform.transaction.Asset.IssuedAsset
1515
import com.wavesplatform.transaction.assets.IssueTransaction
16+
import com.wavesplatform.transaction.{GenesisTransaction, Proofs, TxDecimals, TxPositiveAmount}
1617
import com.wavesplatform.utils.{NTP, ScorexLogging}
17-
import monix.reactive.Observer
1818

1919
import scala.collection.immutable.VectorMap
2020

2121
object RollbackBenchmark extends ScorexLogging {
2222
def main(args: Array[String]): Unit = {
2323
val settings = Application.loadApplicationConfig(Some(new File(args(0))))
24-
val db = openDB(settings.dbSettings.directory)
24+
val rdb = RDB.open(settings.dbSettings)
2525
val time = new NTP(settings.ntpServer)
26-
val levelDBWriter = LevelDBWriter(db, Observer.stopped, settings)
26+
val rocksDBWriter = new RocksDBWriter(rdb, settings.blockchainSettings, settings.dbSettings)
2727

2828
val issuer = KeyPair(new Array[Byte](32))
2929

@@ -73,7 +73,7 @@ object RollbackBenchmark extends ScorexLogging {
7373
} yield address -> Portfolio(assets = map)
7474

7575
log.info("Appending genesis block")
76-
levelDBWriter.append(
76+
rocksDBWriter.append(
7777
Diff(portfolios = portfolios.toMap),
7878
0,
7979
0,
@@ -89,13 +89,13 @@ object RollbackBenchmark extends ScorexLogging {
8989
val nextDiff = Diff(portfolios = addresses.map(_ -> Portfolio(1, assets = VectorMap(IssuedAsset(assets.head.id()) -> 1L))).toMap)
9090

9191
log.info("Appending next block")
92-
levelDBWriter.append(nextDiff, 0, 0, None, ByteStr.empty, nextBlock)
92+
rocksDBWriter.append(nextDiff, 0, 0, None, ByteStr.empty, nextBlock)
9393

9494
log.info("Rolling back")
9595
val start = System.nanoTime()
96-
levelDBWriter.rollbackTo(1)
96+
rocksDBWriter.rollbackTo(1)
9797
val end = System.nanoTime()
9898
log.info(f"Rollback took ${(end - start) * 1e-6}%.3f ms")
99-
levelDBWriter.close()
99+
rdb.close()
100100
}
101101
}

benchmark/src/test/scala/com/wavesplatform/lang/v1/EvaluatorV2Benchmark.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package com.wavesplatform.lang.v1
22

33
import java.util.concurrent.TimeUnit
4-
54
import cats.Id
65
import com.wavesplatform.lang.Common
76
import com.wavesplatform.lang.directives.values.{V1, V3}
87
import com.wavesplatform.lang.v1.EvaluatorV2Benchmark.*
98
import com.wavesplatform.lang.v1.compiler.Terms.{EXPR, IF, TRUE}
109
import com.wavesplatform.lang.v1.compiler.TestCompiler
1110
import com.wavesplatform.lang.v1.evaluator.EvaluatorV2
12-
import com.wavesplatform.lang.v1.evaluator.ctx.{EvaluationContext, LoggedEvaluationContext}
11+
import com.wavesplatform.lang.v1.evaluator.ctx.{DisabledLogEvaluationContext, EvaluationContext}
1312
import com.wavesplatform.lang.v1.evaluator.ctx.impl.PureContext
1413
import com.wavesplatform.lang.v1.traits.Environment
1514
import org.openjdk.jmh.annotations.*
@@ -20,7 +19,7 @@ import scala.annotation.tailrec
2019
object EvaluatorV2Benchmark {
2120
val pureContext: CTX[Environment] = PureContext.build(V1, useNewPowPrecision = true).withEnvironment[Environment]
2221
val pureEvalContext: EvaluationContext[Environment, Id] = pureContext.evaluationContext(Common.emptyBlockchainEnvironment())
23-
val evaluatorV2: EvaluatorV2 = new EvaluatorV2(LoggedEvaluationContext(_ => _ => (), pureEvalContext), V1, true, true)
22+
val evaluatorV2: EvaluatorV2 = new EvaluatorV2(DisabledLogEvaluationContext(pureEvalContext), V1, true, true, false)
2423
}
2524

2625
@OutputTimeUnit(TimeUnit.MILLISECONDS)

benchmark/src/test/scala/com/wavesplatform/lang/v1/FractionIntBenchmark.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,22 @@ import org.openjdk.jmh.infra.Blackhole
2020
@Measurement(iterations = 10, time = 1)
2121
class FractionIntBenchmark {
2222
@Benchmark
23-
def fraction1(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr1, LogExtraInfo(), V5, true, true))
23+
def fraction1(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr1, LogExtraInfo(), V5, true, true, false))
2424

2525
@Benchmark
26-
def fraction2(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr2, LogExtraInfo(), V5, true, true))
26+
def fraction2(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr2, LogExtraInfo(), V5, true, true, false))
2727

2828
@Benchmark
29-
def fraction3(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr3, LogExtraInfo(), V5, true, true))
29+
def fraction3(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr3, LogExtraInfo(), V5, true, true, false))
3030

3131
@Benchmark
32-
def fraction1Round(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr1Round, LogExtraInfo(), V5, true, true))
32+
def fraction1Round(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr1Round, LogExtraInfo(), V5, true, true, false))
3333

3434
@Benchmark
35-
def fraction2Round(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr2Round, LogExtraInfo(), V5, true, true))
35+
def fraction2Round(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr2Round, LogExtraInfo(), V5, true, true, false))
3636

3737
@Benchmark
38-
def fraction3Round(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr3Round, LogExtraInfo(), V5, true, true))
38+
def fraction3Round(bh: Blackhole, s: St): Unit = bh.consume(EvaluatorV2.applyCompleted(s.ctx, s.expr3Round, LogExtraInfo(), V5, true, true, false))
3939
}
4040

4141
@State(Scope.Benchmark)

benchmark/src/test/scala/com/wavesplatform/lang/v1/package.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@ package object v1 {
3131
expr: EXPR,
3232
stdLibVersion: StdLibVersion
3333
): (Log[Id], Int, Either[ExecutionError, Terms.EVALUATED]) =
34-
EvaluatorV2.applyCompleted(ctx, expr, LogExtraInfo(), stdLibVersion, newMode = true, correctFunctionCallScope = true)
34+
EvaluatorV2.applyCompleted(ctx, expr, LogExtraInfo(), stdLibVersion, newMode = true, correctFunctionCallScope = true, enableExecutionLog = false)
3535
}

benchmark/src/test/scala/com/wavesplatform/state/BaseState.scala

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,35 @@ package com.wavesplatform.state
33
import java.io.File
44
import java.nio.file.Files
55

6+
import com.typesafe.config.ConfigFactory
67
import com.wavesplatform.account.KeyPair
78
import com.wavesplatform.block.Block
89
import com.wavesplatform.common.utils.EitherExt2
9-
import com.wavesplatform.database.{LevelDBFactory, LevelDBWriter}
10+
import com.wavesplatform.database.{RDB, RocksDBWriter}
1011
import com.wavesplatform.lagonaki.mocks.TestBlock
1112
import com.wavesplatform.mining.MiningConstraint
12-
import com.wavesplatform.settings.FunctionalitySettings
13+
import com.wavesplatform.settings.{FunctionalitySettings, WavesSettings, loadConfig}
1314
import com.wavesplatform.state.diffs.BlockDiffer
14-
import com.wavesplatform.state.utils.TestLevelDB
15+
import com.wavesplatform.state.utils.TestRocksDB
1516
import com.wavesplatform.transaction.{GenesisTransaction, Transaction}
16-
import monix.execution.UncaughtExceptionReporter
17-
import monix.reactive.Observer
18-
import org.iq80.leveldb.{DB, Options}
1917
import org.openjdk.jmh.annotations.{Setup, TearDown}
2018
import org.scalacheck.{Arbitrary, Gen}
2119

2220
trait BaseState {
23-
import BaseState._
21+
import BaseState.*
2422

23+
val benchSettings: Settings = Settings.fromConfig(ConfigFactory.load())
24+
val wavesSettings: WavesSettings = {
25+
val config = loadConfig(ConfigFactory.parseFile(new File(benchSettings.networkConfigFile)))
26+
WavesSettings.fromRootConfig(config)
27+
}
2528
private val fsSettings: FunctionalitySettings = updateFunctionalitySettings(FunctionalitySettings.TESTNET)
26-
private val db: DB = {
27-
val dir = Files.createTempDirectory("state-synthetic").toAbsolutePath.toString
28-
val options = new Options()
29-
options.createIfMissing(true)
30-
LevelDBFactory.factory.open(new File(dir), options)
29+
private val rdb: RDB = {
30+
val dir = Files.createTempDirectory("state-synthetic").toAbsolutePath.toString
31+
RDB.open(wavesSettings.dbSettings.copy(directory = dir))
3132
}
3233

33-
private val portfolioChanges = Observer.empty(UncaughtExceptionReporter.default)
34-
val state: LevelDBWriter = TestLevelDB.withFunctionalitySettings(db, portfolioChanges, fsSettings)
34+
val state: RocksDBWriter = TestRocksDB.withFunctionalitySettings(rdb, fsSettings)
3535

3636
private var _richAccount: KeyPair = _
3737
def richAccount: KeyPair = _richAccount
@@ -52,12 +52,11 @@ trait BaseState {
5252
transferTxs <- Gen.sequence[Vector[Transaction], Transaction]((1 to TxsInBlock).map { i =>
5353
txGenP(sender, base.header.timestamp + i)
5454
})
55-
} yield
56-
TestBlock.create(
57-
time = transferTxs.last.timestamp,
58-
ref = base.id(),
59-
txs = transferTxs
60-
)
55+
} yield TestBlock.create(
56+
time = transferTxs.last.timestamp,
57+
ref = base.id(),
58+
txs = transferTxs
59+
)
6160

6261
private val initGen: Gen[(KeyPair, Block)] = for {
6362
rich <- accountGen
@@ -98,7 +97,7 @@ trait BaseState {
9897

9998
@TearDown
10099
def close(): Unit = {
101-
db.close()
100+
rdb.close()
102101
}
103102
}
104103

benchmark/src/test/scala/com/wavesplatform/state/BloomFilterBenchmark.scala

Lines changed: 0 additions & 72 deletions
This file was deleted.

0 commit comments

Comments
 (0)