Merge pull request #464 from ethcore/db
RocksDB abstraction layer + Hash index for state DB
This commit is contained in:
commit
6e5ae636cc
12
.travis.yml
12
.travis.yml
@ -44,12 +44,12 @@ after_success: |
|
|||||||
wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz &&
|
wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz &&
|
||||||
tar xzf master.tar.gz && mkdir kcov-master/build && cd kcov-master/build && cmake .. && make && make install DESTDIR=../tmp && cd ../.. &&
|
tar xzf master.tar.gz && mkdir kcov-master/build && cd kcov-master/build && cmake .. && make && make install DESTDIR=../tmp && cd ../.. &&
|
||||||
cargo test --no-run ${KCOV_FEATURES} ${TARGETS} &&
|
cargo test --no-run ${KCOV_FEATURES} ${TARGETS} &&
|
||||||
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_util-* &&
|
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_util-* &&
|
||||||
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethash-* &&
|
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethash-* &&
|
||||||
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore-* &&
|
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore-* &&
|
||||||
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethsync-* &&
|
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethsync-* &&
|
||||||
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_rpc-* &&
|
./kcov-master/tmp/usr/local/bin/kcov --exclude-pattern /usr/,/.cargo,/root/.multirust,src/tests,util/json-tests,util/src/network/tests,sync/src/tests,ethcore/src/tests,ethcore/src/evm/tests target/kcov target/debug/deps/ethcore_rpc-* &&
|
||||||
./kcov-master/tmp/usr/local/bin/kcov --coveralls-id=${TRAVIS_JOB_ID} --exclude-pattern /.cargo,/root/.multirust target/kcov target/debug/parity-* &&
|
./kcov-master/tmp/usr/local/bin/kcov --coveralls-id=${TRAVIS_JOB_ID} --exclude-pattern /usr/,/.cargo,/root/.multirust target/kcov target/debug/parity-* &&
|
||||||
[ $TRAVIS_BRANCH = master ] &&
|
[ $TRAVIS_BRANCH = master ] &&
|
||||||
[ $TRAVIS_PULL_REQUEST = false ] &&
|
[ $TRAVIS_PULL_REQUEST = false ] &&
|
||||||
[ $TRAVIS_RUST_VERSION = beta ] &&
|
[ $TRAVIS_RUST_VERSION = beta ] &&
|
||||||
|
70
Cargo.lock
generated
70
Cargo.lock
generated
@ -73,7 +73,7 @@ name = "clippy"
|
|||||||
version = "0.0.44"
|
version = "0.0.44"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"regex-syntax 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex-syntax 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-normalization 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
@ -129,7 +129,7 @@ name = "docopt"
|
|||||||
version = "0.6.78"
|
version = "0.6.78"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"regex 0.1.53 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
@ -145,7 +145,7 @@ version = "0.3.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.1.53 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -154,7 +154,7 @@ version = "0.5.4"
|
|||||||
source = "git+https://github.com/arkpar/rust-secp256k1.git#45503e1de68d909b1862e3f2bdb9e1cdfdff3f1e"
|
source = "git+https://github.com/arkpar/rust-secp256k1.git#45503e1de68d909b1862e3f2bdb9e1cdfdff3f1e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
"arrayvec 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gcc 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gcc 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -185,7 +185,6 @@ dependencies = [
|
|||||||
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -228,14 +227,14 @@ dependencies = [
|
|||||||
"ethcore-devtools 0.9.99",
|
"ethcore-devtools 0.9.99",
|
||||||
"heapsize 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"heapsize 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"igd 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"igd 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"itertools 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"itertools 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"json-tests 0.1.0",
|
"json-tests 0.1.0",
|
||||||
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"mio 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"mio 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rocksdb 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rocksdb 0.4.1 (git+https://github.com/arkpar/rust-rocksdb.git)",
|
||||||
"rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rust-crypto 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -270,7 +269,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gcc"
|
name = "gcc"
|
||||||
version = "0.3.24"
|
version = "0.3.25"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -289,7 +288,7 @@ version = "0.3.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.1.53 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -321,7 +320,7 @@ dependencies = [
|
|||||||
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"unicase 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicase 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
"url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -341,7 +340,7 @@ dependencies = [
|
|||||||
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"traitobject 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"unicase 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicase 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"url 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"url 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -352,14 +351,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"hyper 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hyper 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.1.53 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.1.54 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"xml-rs 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
"xml-rs 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"xmltree 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"xmltree 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.4.9"
|
version = "0.4.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -388,7 +387,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"hyper 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hyper 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"jsonrpc-core 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"jsonrpc-core 1.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"unicase 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicase 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -425,6 +424,15 @@ name = "libc"
|
|||||||
version = "0.2.7"
|
version = "0.2.7"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "librocksdb-sys"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "git+https://github.com/arkpar/rust-rocksdb.git#2156621f583bda95c1c07e89e79e4019f75158ee"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"pkg-config 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.3.5"
|
version = "0.3.5"
|
||||||
@ -464,7 +472,7 @@ dependencies = [
|
|||||||
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"miow 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"miow 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"net2 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"net2 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"nix 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"nix 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
"time 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -477,14 +485,14 @@ version = "0.1.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"net2 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
"net2 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "net2"
|
name = "net2"
|
||||||
version = "0.2.21"
|
version = "0.2.22"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cfg-if 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -513,7 +521,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nom"
|
name = "nom"
|
||||||
version = "1.2.0"
|
version = "1.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -538,6 +546,11 @@ name = "odds"
|
|||||||
version = "0.2.12"
|
version = "0.2.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "pkg-config"
|
||||||
|
version = "0.3.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "primal"
|
name = "primal"
|
||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
@ -607,26 +620,27 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "0.1.53"
|
version = "0.1.54"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"aho-corasick 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memchr 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex-syntax 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex-syntax 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.2.4"
|
version = "0.2.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rocksdb"
|
name = "rocksdb"
|
||||||
version = "0.3.0"
|
version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/arkpar/rust-rocksdb.git#2156621f583bda95c1c07e89e79e4019f75158ee"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"librocksdb-sys 0.2.1 (git+https://github.com/arkpar/rust-rocksdb.git)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -634,7 +648,7 @@ name = "rust-crypto"
|
|||||||
version = "0.2.34"
|
version = "0.2.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gcc 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gcc 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -664,7 +678,7 @@ name = "semver"
|
|||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"nom 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"nom 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -700,7 +714,7 @@ dependencies = [
|
|||||||
name = "sha3"
|
name = "sha3"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gcc 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gcc 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -784,7 +798,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicase"
|
name = "unicase"
|
||||||
version = "1.2.1"
|
version = "1.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -10,7 +10,6 @@ authors = ["Ethcore <admin@ethcore.io>"]
|
|||||||
log = "0.3"
|
log = "0.3"
|
||||||
env_logger = "0.3"
|
env_logger = "0.3"
|
||||||
rustc-serialize = "0.3"
|
rustc-serialize = "0.3"
|
||||||
rocksdb = "0.3"
|
|
||||||
heapsize = "0.3"
|
heapsize = "0.3"
|
||||||
rust-crypto = "0.2.34"
|
rust-crypto = "0.2.34"
|
||||||
time = "0.1"
|
time = "0.1"
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
//! Blockchain database.
|
//! Blockchain database.
|
||||||
|
|
||||||
use util::*;
|
use util::*;
|
||||||
use rocksdb::{DB, WriteBatch, Writable};
|
|
||||||
use header::*;
|
use header::*;
|
||||||
use extras::*;
|
use extras::*;
|
||||||
use transaction::*;
|
use transaction::*;
|
||||||
@ -100,7 +99,7 @@ struct ExtrasUpdate {
|
|||||||
/// Block hash.
|
/// Block hash.
|
||||||
hash: H256,
|
hash: H256,
|
||||||
/// DB update batch.
|
/// DB update batch.
|
||||||
batch: WriteBatch,
|
batch: DBTransaction,
|
||||||
/// Inserted block familial details.
|
/// Inserted block familial details.
|
||||||
details: BlockDetails,
|
details: BlockDetails,
|
||||||
/// New best block (if it has changed).
|
/// New best block (if it has changed).
|
||||||
@ -230,8 +229,8 @@ pub struct BlockChain {
|
|||||||
blocks_blooms: RwLock<HashMap<H256, BlocksBlooms>>,
|
blocks_blooms: RwLock<HashMap<H256, BlocksBlooms>>,
|
||||||
block_receipts: RwLock<HashMap<H256, BlockReceipts>>,
|
block_receipts: RwLock<HashMap<H256, BlockReceipts>>,
|
||||||
|
|
||||||
extras_db: DB,
|
extras_db: Database,
|
||||||
blocks_db: DB,
|
blocks_db: Database,
|
||||||
|
|
||||||
cache_man: RwLock<CacheManager>,
|
cache_man: RwLock<CacheManager>,
|
||||||
|
|
||||||
@ -339,12 +338,12 @@ impl BlockChain {
|
|||||||
// open extras db
|
// open extras db
|
||||||
let mut extras_path = path.to_path_buf();
|
let mut extras_path = path.to_path_buf();
|
||||||
extras_path.push("extras");
|
extras_path.push("extras");
|
||||||
let extras_db = DB::open_default(extras_path.to_str().unwrap()).unwrap();
|
let extras_db = Database::open_default(extras_path.to_str().unwrap()).unwrap();
|
||||||
|
|
||||||
// open blocks db
|
// open blocks db
|
||||||
let mut blocks_path = path.to_path_buf();
|
let mut blocks_path = path.to_path_buf();
|
||||||
blocks_path.push("blocks");
|
blocks_path.push("blocks");
|
||||||
let blocks_db = DB::open_default(blocks_path.to_str().unwrap()).unwrap();
|
let blocks_db = Database::open_default(blocks_path.to_str().unwrap()).unwrap();
|
||||||
|
|
||||||
let mut cache_man = CacheManager{cache_usage: VecDeque::new(), in_use: HashSet::new()};
|
let mut cache_man = CacheManager{cache_usage: VecDeque::new(), in_use: HashSet::new()};
|
||||||
(0..COLLECTION_QUEUE_SIZE).foreach(|_| cache_man.cache_usage.push_back(HashSet::new()));
|
(0..COLLECTION_QUEUE_SIZE).foreach(|_| cache_man.cache_usage.push_back(HashSet::new()));
|
||||||
@ -385,7 +384,7 @@ impl BlockChain {
|
|||||||
|
|
||||||
bc.blocks_db.put(&hash, genesis).unwrap();
|
bc.blocks_db.put(&hash, genesis).unwrap();
|
||||||
|
|
||||||
let batch = WriteBatch::new();
|
let batch = DBTransaction::new();
|
||||||
batch.put_extras(&hash, &details);
|
batch.put_extras(&hash, &details);
|
||||||
batch.put_extras(&header.number(), &hash);
|
batch.put_extras(&header.number(), &hash);
|
||||||
batch.put(b"best", &hash).unwrap();
|
batch.put(b"best", &hash).unwrap();
|
||||||
@ -579,7 +578,7 @@ impl BlockChain {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// prepare the batch
|
// prepare the batch
|
||||||
let batch = WriteBatch::new();
|
let batch = DBTransaction::new();
|
||||||
|
|
||||||
// insert new block details
|
// insert new block details
|
||||||
batch.put_extras(&hash, &details);
|
batch.put_extras(&hash, &details);
|
||||||
|
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
use util::*;
|
use util::*;
|
||||||
use util::panics::*;
|
use util::panics::*;
|
||||||
use rocksdb::{Options, DB, DBCompactionStyle};
|
|
||||||
use blockchain::{BlockChain, BlockProvider, CacheSize};
|
use blockchain::{BlockChain, BlockProvider, CacheSize};
|
||||||
use views::BlockView;
|
use views::BlockView;
|
||||||
use error::*;
|
use error::*;
|
||||||
@ -187,7 +186,7 @@ pub struct Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const HISTORY: u64 = 1000;
|
const HISTORY: u64 = 1000;
|
||||||
const CLIENT_DB_VER_STR: &'static str = "3";
|
const CLIENT_DB_VER_STR: &'static str = "4.0";
|
||||||
|
|
||||||
impl Client {
|
impl Client {
|
||||||
/// Create a new client with given spec and DB path.
|
/// Create a new client with given spec and DB path.
|
||||||
@ -199,34 +198,11 @@ impl Client {
|
|||||||
let path = dir.as_path();
|
let path = dir.as_path();
|
||||||
let gb = spec.genesis_block();
|
let gb = spec.genesis_block();
|
||||||
let chain = Arc::new(RwLock::new(BlockChain::new(&gb, path)));
|
let chain = Arc::new(RwLock::new(BlockChain::new(&gb, path)));
|
||||||
let mut opts = Options::new();
|
|
||||||
opts.set_max_open_files(256);
|
|
||||||
opts.create_if_missing(true);
|
|
||||||
opts.set_use_fsync(false);
|
|
||||||
opts.set_compaction_style(DBCompactionStyle::DBUniversalCompaction);
|
|
||||||
/*
|
|
||||||
opts.set_bytes_per_sync(8388608);
|
|
||||||
opts.set_disable_data_sync(false);
|
|
||||||
opts.set_block_cache_size_mb(1024);
|
|
||||||
opts.set_table_cache_num_shard_bits(6);
|
|
||||||
opts.set_max_write_buffer_number(32);
|
|
||||||
opts.set_write_buffer_size(536870912);
|
|
||||||
opts.set_target_file_size_base(1073741824);
|
|
||||||
opts.set_min_write_buffer_number_to_merge(4);
|
|
||||||
opts.set_level_zero_stop_writes_trigger(2000);
|
|
||||||
opts.set_level_zero_slowdown_writes_trigger(0);
|
|
||||||
opts.set_compaction_style(DBUniversalCompaction);
|
|
||||||
opts.set_max_background_compactions(4);
|
|
||||||
opts.set_max_background_flushes(4);
|
|
||||||
opts.set_filter_deletes(false);
|
|
||||||
opts.set_disable_auto_compactions(false);*/
|
|
||||||
|
|
||||||
let mut state_path = path.to_path_buf();
|
let mut state_path = path.to_path_buf();
|
||||||
state_path.push("state");
|
state_path.push("state");
|
||||||
let db = Arc::new(DB::open(&opts, state_path.to_str().unwrap()).unwrap());
|
|
||||||
|
|
||||||
let engine = Arc::new(try!(spec.to_engine()));
|
let engine = Arc::new(try!(spec.to_engine()));
|
||||||
let mut state_db = JournalDB::new_with_arc(db.clone());
|
let mut state_db = JournalDB::new(state_path.to_str().unwrap());
|
||||||
if state_db.is_empty() && engine.spec().ensure_db_good(&mut state_db) {
|
if state_db.is_empty() && engine.spec().ensure_db_good(&mut state_db) {
|
||||||
state_db.commit(0, &engine.spec().genesis_header().hash(), None).expect("Error commiting genesis state to state DB");
|
state_db.commit(0, &engine.spec().genesis_header().hash(), None).expect("Error commiting genesis state to state DB");
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
//! Blockchain DB extras.
|
//! Blockchain DB extras.
|
||||||
|
|
||||||
use rocksdb::{DB, Writable};
|
|
||||||
use util::*;
|
use util::*;
|
||||||
use header::BlockNumber;
|
use header::BlockNumber;
|
||||||
use receipt::Receipt;
|
use receipt::Receipt;
|
||||||
@ -59,7 +58,7 @@ pub trait ExtrasReadable {
|
|||||||
K: ExtrasSliceConvertable;
|
K: ExtrasSliceConvertable;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<W> ExtrasWritable for W where W: Writable {
|
impl ExtrasWritable for DBTransaction {
|
||||||
fn put_extras<K, T>(&self, hash: &K, value: &T) where
|
fn put_extras<K, T>(&self, hash: &K, value: &T) where
|
||||||
T: ExtrasIndexable + Encodable,
|
T: ExtrasIndexable + Encodable,
|
||||||
K: ExtrasSliceConvertable {
|
K: ExtrasSliceConvertable {
|
||||||
@ -68,7 +67,7 @@ impl<W> ExtrasWritable for W where W: Writable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ExtrasReadable for DB {
|
impl ExtrasReadable for Database {
|
||||||
fn get_extras<K, T>(&self, hash: &K) -> Option<T> where
|
fn get_extras<K, T>(&self, hash: &K) -> Option<T> where
|
||||||
T: ExtrasIndexable + Decodable,
|
T: ExtrasIndexable + Decodable,
|
||||||
K: ExtrasSliceConvertable {
|
K: ExtrasSliceConvertable {
|
||||||
|
@ -84,7 +84,6 @@
|
|||||||
#[macro_use] extern crate ethcore_util as util;
|
#[macro_use] extern crate ethcore_util as util;
|
||||||
#[macro_use] extern crate lazy_static;
|
#[macro_use] extern crate lazy_static;
|
||||||
extern crate rustc_serialize;
|
extern crate rustc_serialize;
|
||||||
extern crate rocksdb;
|
|
||||||
extern crate heapsize;
|
extern crate heapsize;
|
||||||
extern crate crypto;
|
extern crate crypto;
|
||||||
extern crate time;
|
extern crate time;
|
||||||
|
@ -19,7 +19,6 @@ use common::*;
|
|||||||
use spec::*;
|
use spec::*;
|
||||||
use blockchain::{BlockChain};
|
use blockchain::{BlockChain};
|
||||||
use state::*;
|
use state::*;
|
||||||
use rocksdb::*;
|
|
||||||
use evm::{Schedule, Factory};
|
use evm::{Schedule, Factory};
|
||||||
use engine::*;
|
use engine::*;
|
||||||
use ethereum;
|
use ethereum;
|
||||||
@ -226,8 +225,7 @@ pub fn generate_dummy_empty_blockchain() -> GuardedTempResult<BlockChain> {
|
|||||||
|
|
||||||
pub fn get_temp_journal_db() -> GuardedTempResult<JournalDB> {
|
pub fn get_temp_journal_db() -> GuardedTempResult<JournalDB> {
|
||||||
let temp = RandomTempPath::new();
|
let temp = RandomTempPath::new();
|
||||||
let db = DB::open_default(temp.as_str()).unwrap();
|
let journal_db = JournalDB::new(temp.as_str());
|
||||||
let journal_db = JournalDB::new(db);
|
|
||||||
GuardedTempResult {
|
GuardedTempResult {
|
||||||
_temp: temp,
|
_temp: temp,
|
||||||
result: Some(journal_db)
|
result: Some(journal_db)
|
||||||
@ -244,8 +242,7 @@ pub fn get_temp_state() -> GuardedTempResult<State> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_temp_journal_db_in(path: &Path) -> JournalDB {
|
pub fn get_temp_journal_db_in(path: &Path) -> JournalDB {
|
||||||
let db = DB::open_default(path.to_str().unwrap()).unwrap();
|
JournalDB::new(path.to_str().unwrap())
|
||||||
JournalDB::new(db)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_temp_state_in(path: &Path) -> State {
|
pub fn get_temp_state_in(path: &Path) -> State {
|
||||||
|
@ -16,7 +16,7 @@ mio = "0.5.0"
|
|||||||
rand = "0.3.12"
|
rand = "0.3.12"
|
||||||
time = "0.1.34"
|
time = "0.1.34"
|
||||||
tiny-keccak = "1.0"
|
tiny-keccak = "1.0"
|
||||||
rocksdb = "0.3"
|
rocksdb = { git = "https://github.com/arkpar/rust-rocksdb.git" }
|
||||||
lazy_static = "0.1"
|
lazy_static = "0.1"
|
||||||
eth-secp256k1 = { git = "https://github.com/arkpar/rust-secp256k1.git" }
|
eth-secp256k1 = { git = "https://github.com/arkpar/rust-secp256k1.git" }
|
||||||
rust-crypto = "0.2.34"
|
rust-crypto = "0.2.34"
|
||||||
|
@ -20,7 +20,7 @@ use common::*;
|
|||||||
use rlp::*;
|
use rlp::*;
|
||||||
use hashdb::*;
|
use hashdb::*;
|
||||||
use memorydb::*;
|
use memorydb::*;
|
||||||
use rocksdb::{DB, Writable, WriteBatch, IteratorMode};
|
use kvdb::{Database, DBTransaction, DatabaseConfig};
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ use std::env;
|
|||||||
/// the removals actually take effect.
|
/// the removals actually take effect.
|
||||||
pub struct JournalDB {
|
pub struct JournalDB {
|
||||||
overlay: MemoryDB,
|
overlay: MemoryDB,
|
||||||
backing: Arc<DB>,
|
backing: Arc<Database>,
|
||||||
counters: Arc<RwLock<HashMap<H256, i32>>>,
|
counters: Arc<RwLock<HashMap<H256, i32>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,21 +47,25 @@ impl Clone for JournalDB {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const LATEST_ERA_KEY : [u8; 4] = [ b'l', b'a', b's', b't' ];
|
// all keys must be at least 12 bytes
|
||||||
const VERSION_KEY : [u8; 4] = [ b'j', b'v', b'e', b'r' ];
|
const LATEST_ERA_KEY : [u8; 12] = [ b'l', b'a', b's', b't', 0, 0, 0, 0, 0, 0, 0, 0 ];
|
||||||
|
const VERSION_KEY : [u8; 12] = [ b'j', b'v', b'e', b'r', 0, 0, 0, 0, 0, 0, 0, 0 ];
|
||||||
|
|
||||||
const DB_VERSION: u32 = 2;
|
const DB_VERSION: u32 = 3;
|
||||||
|
|
||||||
|
const PADDING : [u8; 10] = [ 0u8; 10 ];
|
||||||
|
|
||||||
impl JournalDB {
|
impl JournalDB {
|
||||||
/// Create a new instance given a `backing` database.
|
|
||||||
pub fn new(backing: DB) -> JournalDB {
|
|
||||||
let db = Arc::new(backing);
|
|
||||||
JournalDB::new_with_arc(db)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new instance given a shared `backing` database.
|
/// Create a new instance from file
|
||||||
pub fn new_with_arc(backing: Arc<DB>) -> JournalDB {
|
pub fn new(path: &str) -> JournalDB {
|
||||||
if backing.iterator(IteratorMode::Start).next().is_some() {
|
let opts = DatabaseConfig {
|
||||||
|
prefix_size: Some(12) //use 12 bytes as prefix, this must match account_db prefix
|
||||||
|
};
|
||||||
|
let backing = Database::open(&opts, path).unwrap_or_else(|e| {
|
||||||
|
panic!("Error opening state db: {}", e);
|
||||||
|
});
|
||||||
|
if !backing.is_empty() {
|
||||||
match backing.get(&VERSION_KEY).map(|d| d.map(|v| decode::<u32>(&v))) {
|
match backing.get(&VERSION_KEY).map(|d| d.map(|v| decode::<u32>(&v))) {
|
||||||
Ok(Some(DB_VERSION)) => {},
|
Ok(Some(DB_VERSION)) => {},
|
||||||
v => panic!("Incompatible DB version, expected {}, got {:?}", DB_VERSION, v)
|
v => panic!("Incompatible DB version, expected {}, got {:?}", DB_VERSION, v)
|
||||||
@ -72,7 +76,7 @@ impl JournalDB {
|
|||||||
let counters = JournalDB::read_counters(&backing);
|
let counters = JournalDB::read_counters(&backing);
|
||||||
JournalDB {
|
JournalDB {
|
||||||
overlay: MemoryDB::new(),
|
overlay: MemoryDB::new(),
|
||||||
backing: backing,
|
backing: Arc::new(backing),
|
||||||
counters: Arc::new(RwLock::new(counters)),
|
counters: Arc::new(RwLock::new(counters)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -82,7 +86,7 @@ impl JournalDB {
|
|||||||
pub fn new_temp() -> JournalDB {
|
pub fn new_temp() -> JournalDB {
|
||||||
let mut dir = env::temp_dir();
|
let mut dir = env::temp_dir();
|
||||||
dir.push(H32::random().hex());
|
dir.push(H32::random().hex());
|
||||||
Self::new(DB::open_default(dir.to_str().unwrap()).unwrap())
|
Self::new(dir.to_str().unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if this database has any commits
|
/// Check if this database has any commits
|
||||||
@ -117,16 +121,17 @@ impl JournalDB {
|
|||||||
// and the key is safe to delete.
|
// and the key is safe to delete.
|
||||||
|
|
||||||
// record new commit's details.
|
// record new commit's details.
|
||||||
let batch = WriteBatch::new();
|
let batch = DBTransaction::new();
|
||||||
let mut counters = self.counters.write().unwrap();
|
let mut counters = self.counters.write().unwrap();
|
||||||
{
|
{
|
||||||
let mut index = 0usize;
|
let mut index = 0usize;
|
||||||
let mut last;
|
let mut last;
|
||||||
|
|
||||||
while try!(self.backing.get({
|
while try!(self.backing.get({
|
||||||
let mut r = RlpStream::new_list(2);
|
let mut r = RlpStream::new_list(3);
|
||||||
r.append(&now);
|
r.append(&now);
|
||||||
r.append(&index);
|
r.append(&index);
|
||||||
|
r.append(&&PADDING[..]);
|
||||||
last = r.drain();
|
last = r.drain();
|
||||||
&last
|
&last
|
||||||
})).is_some() {
|
})).is_some() {
|
||||||
@ -154,9 +159,10 @@ impl JournalDB {
|
|||||||
let mut to_remove: Vec<H256> = Vec::new();
|
let mut to_remove: Vec<H256> = Vec::new();
|
||||||
let mut canon_inserts: Vec<H256> = Vec::new();
|
let mut canon_inserts: Vec<H256> = Vec::new();
|
||||||
while let Some(rlp_data) = try!(self.backing.get({
|
while let Some(rlp_data) = try!(self.backing.get({
|
||||||
let mut r = RlpStream::new_list(2);
|
let mut r = RlpStream::new_list(3);
|
||||||
r.append(&end_era);
|
r.append(&end_era);
|
||||||
r.append(&index);
|
r.append(&index);
|
||||||
|
r.append(&&PADDING[..]);
|
||||||
last = r.drain();
|
last = r.drain();
|
||||||
&last
|
&last
|
||||||
})) {
|
})) {
|
||||||
@ -226,16 +232,17 @@ impl JournalDB {
|
|||||||
self.backing.get(&key.bytes()).expect("Low-level database error. Some issue with your hard disk?").map(|v| v.to_vec())
|
self.backing.get(&key.bytes()).expect("Low-level database error. Some issue with your hard disk?").map(|v| v.to_vec())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_counters(db: &DB) -> HashMap<H256, i32> {
|
fn read_counters(db: &Database) -> HashMap<H256, i32> {
|
||||||
let mut res = HashMap::new();
|
let mut res = HashMap::new();
|
||||||
if let Some(val) = db.get(&LATEST_ERA_KEY).expect("Low-level database error.") {
|
if let Some(val) = db.get(&LATEST_ERA_KEY).expect("Low-level database error.") {
|
||||||
let mut era = decode::<u64>(&val);
|
let mut era = decode::<u64>(&val);
|
||||||
loop {
|
loop {
|
||||||
let mut index = 0usize;
|
let mut index = 0usize;
|
||||||
while let Some(rlp_data) = db.get({
|
while let Some(rlp_data) = db.get({
|
||||||
let mut r = RlpStream::new_list(2);
|
let mut r = RlpStream::new_list(3);
|
||||||
r.append(&era);
|
r.append(&era);
|
||||||
r.append(&index);
|
r.append(&index);
|
||||||
|
r.append(&&PADDING[..]);
|
||||||
&r.drain()
|
&r.drain()
|
||||||
}).expect("Low-level database error.") {
|
}).expect("Low-level database error.") {
|
||||||
let rlp = Rlp::new(&rlp_data);
|
let rlp = Rlp::new(&rlp_data);
|
||||||
@ -259,7 +266,7 @@ impl JournalDB {
|
|||||||
impl HashDB for JournalDB {
|
impl HashDB for JournalDB {
|
||||||
fn keys(&self) -> HashMap<H256, i32> {
|
fn keys(&self) -> HashMap<H256, i32> {
|
||||||
let mut ret: HashMap<H256, i32> = HashMap::new();
|
let mut ret: HashMap<H256, i32> = HashMap::new();
|
||||||
for (key, _) in self.backing.iterator(IteratorMode::Start) {
|
for (key, _) in self.backing.iter() {
|
||||||
let h = H256::from_slice(key.deref());
|
let h = H256::from_slice(key.deref());
|
||||||
ret.insert(h, 1);
|
ret.insert(h, 1);
|
||||||
}
|
}
|
||||||
@ -429,12 +436,11 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn reopen() {
|
fn reopen() {
|
||||||
use rocksdb::DB;
|
|
||||||
let mut dir = ::std::env::temp_dir();
|
let mut dir = ::std::env::temp_dir();
|
||||||
dir.push(H32::random().hex());
|
dir.push(H32::random().hex());
|
||||||
|
|
||||||
let foo = {
|
let foo = {
|
||||||
let mut jdb = JournalDB::new(DB::open_default(dir.to_str().unwrap()).unwrap());
|
let mut jdb = JournalDB::new(dir.to_str().unwrap());
|
||||||
// history is 1
|
// history is 1
|
||||||
let foo = jdb.insert(b"foo");
|
let foo = jdb.insert(b"foo");
|
||||||
jdb.commit(0, &b"0".sha3(), None).unwrap();
|
jdb.commit(0, &b"0".sha3(), None).unwrap();
|
||||||
@ -442,13 +448,13 @@ mod tests {
|
|||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut jdb = JournalDB::new(DB::open_default(dir.to_str().unwrap()).unwrap());
|
let mut jdb = JournalDB::new(dir.to_str().unwrap());
|
||||||
jdb.remove(&foo);
|
jdb.remove(&foo);
|
||||||
jdb.commit(1, &b"1".sha3(), Some((0, b"0".sha3()))).unwrap();
|
jdb.commit(1, &b"1".sha3(), Some((0, b"0".sha3()))).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut jdb = JournalDB::new(DB::open_default(dir.to_str().unwrap()).unwrap());
|
let mut jdb = JournalDB::new(dir.to_str().unwrap());
|
||||||
assert!(jdb.exists(&foo));
|
assert!(jdb.exists(&foo));
|
||||||
jdb.commit(2, &b"2".sha3(), Some((1, b"1".sha3()))).unwrap();
|
jdb.commit(2, &b"2".sha3(), Some((1, b"1".sha3()))).unwrap();
|
||||||
assert!(!jdb.exists(&foo));
|
assert!(!jdb.exists(&foo));
|
||||||
|
206
util/src/kvdb.rs
Normal file
206
util/src/kvdb.rs
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
||||||
|
// This file is part of Parity.
|
||||||
|
|
||||||
|
// Parity is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
|
||||||
|
// Parity is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Key-Value store abstraction with RocksDB backend.
|
||||||
|
|
||||||
|
use rocksdb::{DB, Writable, WriteBatch, IteratorMode, DBVector, DBIterator,
|
||||||
|
IndexType, Options, DBCompactionStyle, BlockBasedOptions, Direction};
|
||||||
|
|
||||||
|
/// Write transaction. Batches a sequence of put/delete operations for efficiency.
|
||||||
|
pub struct DBTransaction {
|
||||||
|
batch: WriteBatch,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DBTransaction {
|
||||||
|
/// Create new transaction.
|
||||||
|
pub fn new() -> DBTransaction {
|
||||||
|
DBTransaction { batch: WriteBatch::new() }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Insert a key-value pair in the transaction. Any existing value value will be overwritten upon write.
|
||||||
|
pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> {
|
||||||
|
self.batch.put(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Delete value by key.
|
||||||
|
pub fn delete(&self, key: &[u8]) -> Result<(), String> {
|
||||||
|
self.batch.delete(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Database configuration
|
||||||
|
pub struct DatabaseConfig {
|
||||||
|
/// Optional prefix size in bytes. Allows lookup by partial key.
|
||||||
|
pub prefix_size: Option<usize>
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Database iterator
|
||||||
|
pub struct DatabaseIterator<'a> {
|
||||||
|
iter: DBIterator<'a>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Iterator for DatabaseIterator<'a> {
|
||||||
|
type Item = (Box<[u8]>, Box<[u8]>);
|
||||||
|
|
||||||
|
#[cfg_attr(feature="dev", allow(type_complexity))]
|
||||||
|
fn next(&mut self) -> Option<(Box<[u8]>, Box<[u8]>)> {
|
||||||
|
self.iter.next()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Key-Value database.
|
||||||
|
pub struct Database {
|
||||||
|
db: DB,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Database {
|
||||||
|
/// Open database with default settings.
|
||||||
|
pub fn open_default(path: &str) -> Result<Database, String> {
|
||||||
|
Database::open(&DatabaseConfig { prefix_size: None }, path)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Open database file. Creates if it does not exist.
|
||||||
|
pub fn open(config: &DatabaseConfig, path: &str) -> Result<Database, String> {
|
||||||
|
let mut opts = Options::new();
|
||||||
|
opts.set_max_open_files(256);
|
||||||
|
opts.create_if_missing(true);
|
||||||
|
opts.set_use_fsync(false);
|
||||||
|
opts.set_compaction_style(DBCompactionStyle::DBUniversalCompaction);
|
||||||
|
/*
|
||||||
|
opts.set_bytes_per_sync(8388608);
|
||||||
|
opts.set_disable_data_sync(false);
|
||||||
|
opts.set_block_cache_size_mb(1024);
|
||||||
|
opts.set_table_cache_num_shard_bits(6);
|
||||||
|
opts.set_max_write_buffer_number(32);
|
||||||
|
opts.set_write_buffer_size(536870912);
|
||||||
|
opts.set_target_file_size_base(1073741824);
|
||||||
|
opts.set_min_write_buffer_number_to_merge(4);
|
||||||
|
opts.set_level_zero_stop_writes_trigger(2000);
|
||||||
|
opts.set_level_zero_slowdown_writes_trigger(0);
|
||||||
|
opts.set_compaction_style(DBUniversalCompaction);
|
||||||
|
opts.set_max_background_compactions(4);
|
||||||
|
opts.set_max_background_flushes(4);
|
||||||
|
opts.set_filter_deletes(false);
|
||||||
|
opts.set_disable_auto_compactions(false);
|
||||||
|
*/
|
||||||
|
|
||||||
|
if let Some(size) = config.prefix_size {
|
||||||
|
let mut block_opts = BlockBasedOptions::new();
|
||||||
|
block_opts.set_index_type(IndexType::HashSearch);
|
||||||
|
opts.set_block_based_table_factory(&block_opts);
|
||||||
|
opts.set_prefix_extractor_fixed_size(size);
|
||||||
|
}
|
||||||
|
let db = try!(DB::open(&opts, path));
|
||||||
|
Ok(Database { db: db })
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Insert a key-value pair in the transaction. Any existing value value will be overwritten.
|
||||||
|
pub fn put(&self, key: &[u8], value: &[u8]) -> Result<(), String> {
|
||||||
|
self.db.put(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Delete value by key.
|
||||||
|
pub fn delete(&self, key: &[u8]) -> Result<(), String> {
|
||||||
|
self.db.delete(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Commit transaction to database.
|
||||||
|
pub fn write(&self, tr: DBTransaction) -> Result<(), String> {
|
||||||
|
self.db.write(tr.batch)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get value by key.
|
||||||
|
pub fn get(&self, key: &[u8]) -> Result<Option<DBVector>, String> {
|
||||||
|
self.db.get(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get value by partial key. Prefix size should match configured prefix size.
|
||||||
|
pub fn get_by_prefix(&self, prefix: &[u8]) -> Option<Box<[u8]>> {
|
||||||
|
let mut iter = self.db.iterator(IteratorMode::From(prefix, Direction::forward));
|
||||||
|
match iter.next() {
|
||||||
|
// TODO: use prefix_same_as_start read option (not availabele in C API currently)
|
||||||
|
Some((k, v)) => if k[0 .. prefix.len()] == prefix[..] { Some(v) } else { None },
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check if there is anything in the database.
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
self.db.iterator(IteratorMode::Start).next().is_none()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check if there is anything in the database.
|
||||||
|
pub fn iter(&self) -> DatabaseIterator {
|
||||||
|
DatabaseIterator { iter: self.db.iterator(IteratorMode::Start) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use hash::*;
|
||||||
|
use super::*;
|
||||||
|
use devtools::*;
|
||||||
|
use std::str::FromStr;
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
fn test_db(config: &DatabaseConfig) {
|
||||||
|
let path = RandomTempPath::create_dir();
|
||||||
|
let db = Database::open(config, path.as_path().to_str().unwrap()).unwrap();
|
||||||
|
let key1 = H256::from_str("02c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc").unwrap();
|
||||||
|
let key2 = H256::from_str("03c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc").unwrap();
|
||||||
|
let key3 = H256::from_str("01c69be41d0b7e40352fc85be1cd65eb03d40ef8427a0ca4596b1ead9a00e9fc").unwrap();
|
||||||
|
|
||||||
|
db.put(&key1, b"cat").unwrap();
|
||||||
|
db.put(&key2, b"dog").unwrap();
|
||||||
|
|
||||||
|
assert_eq!(db.get(&key1).unwrap().unwrap().deref(), b"cat");
|
||||||
|
|
||||||
|
let contents: Vec<_> = db.iter().collect();
|
||||||
|
assert_eq!(contents.len(), 2);
|
||||||
|
assert_eq!(&*contents[0].0, key1.deref());
|
||||||
|
assert_eq!(&*contents[0].1, b"cat");
|
||||||
|
assert_eq!(&*contents[1].0, key2.deref());
|
||||||
|
assert_eq!(&*contents[1].1, b"dog");
|
||||||
|
|
||||||
|
db.delete(&key1).unwrap();
|
||||||
|
assert!(db.get(&key1).unwrap().is_none());
|
||||||
|
db.put(&key1, b"cat").unwrap();
|
||||||
|
|
||||||
|
let transaction = DBTransaction::new();
|
||||||
|
transaction.put(&key3, b"elephant").unwrap();
|
||||||
|
transaction.delete(&key1).unwrap();
|
||||||
|
db.write(transaction).unwrap();
|
||||||
|
assert!(db.get(&key1).unwrap().is_none());
|
||||||
|
assert_eq!(db.get(&key3).unwrap().unwrap().deref(), b"elephant");
|
||||||
|
|
||||||
|
if config.prefix_size.is_some() {
|
||||||
|
assert_eq!(db.get_by_prefix(&key3).unwrap().deref(), b"elephant");
|
||||||
|
assert_eq!(db.get_by_prefix(&key2).unwrap().deref(), b"dog");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn kvdb() {
|
||||||
|
let path = RandomTempPath::create_dir();
|
||||||
|
let smoke = Database::open_default(path.as_path().to_str().unwrap()).unwrap();
|
||||||
|
assert!(smoke.is_empty());
|
||||||
|
test_db(&DatabaseConfig { prefix_size: None });
|
||||||
|
test_db(&DatabaseConfig { prefix_size: Some(1) });
|
||||||
|
test_db(&DatabaseConfig { prefix_size: Some(8) });
|
||||||
|
test_db(&DatabaseConfig { prefix_size: Some(32) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -129,6 +129,7 @@ pub mod hashdb;
|
|||||||
pub mod memorydb;
|
pub mod memorydb;
|
||||||
pub mod overlaydb;
|
pub mod overlaydb;
|
||||||
pub mod journaldb;
|
pub mod journaldb;
|
||||||
|
pub mod kvdb;
|
||||||
mod math;
|
mod math;
|
||||||
pub mod crypto;
|
pub mod crypto;
|
||||||
pub mod triehash;
|
pub mod triehash;
|
||||||
@ -161,4 +162,5 @@ pub use semantic_version::*;
|
|||||||
pub use network::*;
|
pub use network::*;
|
||||||
pub use io::*;
|
pub use io::*;
|
||||||
pub use log::*;
|
pub use log::*;
|
||||||
|
pub use kvdb::*;
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ use std::ops::*;
|
|||||||
use std::sync::*;
|
use std::sync::*;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use rocksdb::{DB, Writable, IteratorMode};
|
use kvdb::{Database};
|
||||||
|
|
||||||
/// Implementation of the HashDB trait for a disk-backed database with a memory overlay.
|
/// Implementation of the HashDB trait for a disk-backed database with a memory overlay.
|
||||||
///
|
///
|
||||||
@ -38,15 +38,15 @@ use rocksdb::{DB, Writable, IteratorMode};
|
|||||||
/// queries have an immediate effect in terms of these functions.
|
/// queries have an immediate effect in terms of these functions.
|
||||||
pub struct OverlayDB {
|
pub struct OverlayDB {
|
||||||
overlay: MemoryDB,
|
overlay: MemoryDB,
|
||||||
backing: Arc<DB>,
|
backing: Arc<Database>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OverlayDB {
|
impl OverlayDB {
|
||||||
/// Create a new instance of OverlayDB given a `backing` database.
|
/// Create a new instance of OverlayDB given a `backing` database.
|
||||||
pub fn new(backing: DB) -> OverlayDB { Self::new_with_arc(Arc::new(backing)) }
|
pub fn new(backing: Database) -> OverlayDB { Self::new_with_arc(Arc::new(backing)) }
|
||||||
|
|
||||||
/// Create a new instance of OverlayDB given a `backing` database.
|
/// Create a new instance of OverlayDB given a `backing` database.
|
||||||
pub fn new_with_arc(backing: Arc<DB>) -> OverlayDB {
|
pub fn new_with_arc(backing: Arc<Database>) -> OverlayDB {
|
||||||
OverlayDB{ overlay: MemoryDB::new(), backing: backing }
|
OverlayDB{ overlay: MemoryDB::new(), backing: backing }
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ impl OverlayDB {
|
|||||||
pub fn new_temp() -> OverlayDB {
|
pub fn new_temp() -> OverlayDB {
|
||||||
let mut dir = env::temp_dir();
|
let mut dir = env::temp_dir();
|
||||||
dir.push(H32::random().hex());
|
dir.push(H32::random().hex());
|
||||||
Self::new(DB::open_default(dir.to_str().unwrap()).unwrap())
|
Self::new(Database::open_default(dir.to_str().unwrap()).unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Commit all memory operations to the backing database.
|
/// Commit all memory operations to the backing database.
|
||||||
@ -164,7 +164,7 @@ impl OverlayDB {
|
|||||||
impl HashDB for OverlayDB {
|
impl HashDB for OverlayDB {
|
||||||
fn keys(&self) -> HashMap<H256, i32> {
|
fn keys(&self) -> HashMap<H256, i32> {
|
||||||
let mut ret: HashMap<H256, i32> = HashMap::new();
|
let mut ret: HashMap<H256, i32> = HashMap::new();
|
||||||
for (key, _) in self.backing.iterator(IteratorMode::Start) {
|
for (key, _) in self.backing.iter() {
|
||||||
let h = H256::from_slice(key.deref());
|
let h = H256::from_slice(key.deref());
|
||||||
let r = self.payload(&h).unwrap().1;
|
let r = self.payload(&h).unwrap().1;
|
||||||
ret.insert(h, r as i32);
|
ret.insert(h, r as i32);
|
||||||
@ -318,7 +318,7 @@ fn overlaydb_complex() {
|
|||||||
fn playpen() {
|
fn playpen() {
|
||||||
use std::fs;
|
use std::fs;
|
||||||
{
|
{
|
||||||
let db: DB = DB::open_default("/tmp/test").unwrap();
|
let db: Database = Database::open_default("/tmp/test").unwrap();
|
||||||
db.put(b"test", b"test2").unwrap();
|
db.put(b"test", b"test2").unwrap();
|
||||||
match db.get(b"test") {
|
match db.get(b"test") {
|
||||||
Ok(Some(value)) => println!("Got value {:?}", value.deref()),
|
Ok(Some(value)) => println!("Got value {:?}", value.deref()),
|
||||||
|
Loading…
Reference in New Issue
Block a user