Backports for 1.3.10 (#2987)
* Prevent database corruption on OOM (#2832) * Prevent database corruption on OOM * Renamed write_flushing * v1.3.10
This commit is contained in:
		
							parent
							
								
									ee0f1250ac
								
							
						
					
					
						commit
						22dc6e9ee9
					
				
							
								
								
									
										51
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										51
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
[root]
 | 
			
		||||
name = "parity"
 | 
			
		||||
version = "1.3.9"
 | 
			
		||||
version = "1.3.10"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "ansi_term 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "clippy 0.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
@ -20,7 +20,7 @@ dependencies = [
 | 
			
		||||
 "ethcore-logger 1.3.0",
 | 
			
		||||
 "ethcore-rpc 1.3.0",
 | 
			
		||||
 "ethcore-signer 1.3.0",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "ethsync 1.3.0",
 | 
			
		||||
 "fdlimit 0.1.0",
 | 
			
		||||
 "hyper 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
@ -35,7 +35,7 @@ dependencies = [
 | 
			
		||||
 "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syntex 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "syntex 0.36.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "time 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
@ -270,7 +270,7 @@ dependencies = [
 | 
			
		||||
 "ethcore-ipc 1.3.0",
 | 
			
		||||
 "ethcore-ipc-codegen 1.3.0",
 | 
			
		||||
 "ethcore-ipc-nano 1.3.0",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "ethjson 0.1.0",
 | 
			
		||||
 "ethstore 0.1.0",
 | 
			
		||||
 "evmjit 1.3.0",
 | 
			
		||||
@ -294,7 +294,7 @@ version = "1.3.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "clippy 0.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "ethcore-rpc 1.3.0",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "hyper 0.9.4 (git+https://github.com/ethcore/hyper)",
 | 
			
		||||
 "jsonrpc-core 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "jsonrpc-http-server 6.1.0 (git+https://github.com/ethcore/jsonrpc-http-server.git?branch=beta)",
 | 
			
		||||
@ -336,7 +336,7 @@ name = "ethcore-ipc"
 | 
			
		||||
version = "1.3.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "ethcore-devtools 1.3.0",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git)",
 | 
			
		||||
 "semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
@ -381,7 +381,7 @@ dependencies = [
 | 
			
		||||
 "ethcore-ipc 1.3.0",
 | 
			
		||||
 "ethcore-ipc-codegen 1.3.0",
 | 
			
		||||
 "ethcore-ipc-nano 1.3.0",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "nanomsg 0.5.1 (git+https://github.com/ethcore/nanomsg.rs.git)",
 | 
			
		||||
 "semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
@ -393,7 +393,7 @@ name = "ethcore-logger"
 | 
			
		||||
version = "1.3.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "isatty 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
@ -408,7 +408,7 @@ dependencies = [
 | 
			
		||||
 "ansi_term 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "ethcore-devtools 1.3.0",
 | 
			
		||||
 "ethcore-io 1.3.0",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "igd 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
@ -432,7 +432,7 @@ dependencies = [
 | 
			
		||||
 "ethcore-devtools 1.3.0",
 | 
			
		||||
 "ethcore-io 1.3.0",
 | 
			
		||||
 "ethcore-ipc 1.3.0",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "ethjson 0.1.0",
 | 
			
		||||
 "ethsync 1.3.0",
 | 
			
		||||
 "json-ipc-server 0.2.4 (git+https://github.com/ethcore/json-ipc-server.git?branch=beta)",
 | 
			
		||||
@ -455,7 +455,7 @@ dependencies = [
 | 
			
		||||
 "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "ethcore-io 1.3.0",
 | 
			
		||||
 "ethcore-rpc 1.3.0",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "jsonrpc-core 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "parity-dapps-signer 1.4.0 (git+https://github.com/ethcore/parity-ui.git)",
 | 
			
		||||
@ -466,7 +466,7 @@ dependencies = [
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "ethcore-util"
 | 
			
		||||
version = "1.3.9"
 | 
			
		||||
version = "1.3.10"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "ansi_term 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "arrayvec 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
@ -499,7 +499,7 @@ dependencies = [
 | 
			
		||||
name = "ethjson"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "serde_codegen 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
@ -547,7 +547,7 @@ dependencies = [
 | 
			
		||||
 "ethcore-ipc-codegen 1.3.0",
 | 
			
		||||
 "ethcore-ipc-nano 1.3.0",
 | 
			
		||||
 "ethcore-network 1.3.0",
 | 
			
		||||
 "ethcore-util 1.3.9",
 | 
			
		||||
 "ethcore-util 1.3.10",
 | 
			
		||||
 "heapsize 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "parking_lot 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
@ -1390,6 +1390,14 @@ dependencies = [
 | 
			
		||||
 "syntex_syntax 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "syntex"
 | 
			
		||||
version = "0.36.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "syntex_syntax 0.36.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "syntex_syntax"
 | 
			
		||||
version = "0.33.0"
 | 
			
		||||
@ -1403,6 +1411,19 @@ dependencies = [
 | 
			
		||||
 "unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "syntex_syntax"
 | 
			
		||||
version = "0.36.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bitflags 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "libc 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "term 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
 "unicode-xid 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "table"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
@ -1744,7 +1765,9 @@ dependencies = [
 | 
			
		||||
"checksum stable-heap 0.1.0 (git+https://github.com/carllerche/stable-heap?rev=3c5cd1ca47)" = "<none>"
 | 
			
		||||
"checksum strsim 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "50c069df92e4b01425a8bf3576d5d417943a6a7272fbabaf5bd80b1aaa76442e"
 | 
			
		||||
"checksum syntex 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393b6dd0889df2b064beeea954cfda6bc2571604ac460deeae0fed55a53988af"
 | 
			
		||||
"checksum syntex 0.36.0 (registry+https://github.com/rust-lang/crates.io-index)" = "61dc0bbe1e46dcd53ec50d6600e750152c22e0e9352cadbd413e86fb847ae899"
 | 
			
		||||
"checksum syntex_syntax 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44bded3cabafc65c90b663b1071bd2d198a9ab7515e6ce729e4570aaf53c407e"
 | 
			
		||||
"checksum syntex_syntax 0.36.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2b92a8c33fad2fa99e14fe499ec17e82b6c6496a7a38a499f33b584ffa1886fa"
 | 
			
		||||
"checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe"
 | 
			
		||||
"checksum term 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "f2077e54d38055cf1ca0fd7933a2e00cd3ec8f6fed352b2a377f06dcdaaf3281"
 | 
			
		||||
"checksum termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a"
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
[package]
 | 
			
		||||
description = "Ethcore client."
 | 
			
		||||
name = "parity"
 | 
			
		||||
version = "1.3.9"
 | 
			
		||||
version = "1.3.10"
 | 
			
		||||
license = "GPL-3.0"
 | 
			
		||||
authors = ["Ethcore <admin@ethcore.io>"]
 | 
			
		||||
build = "build.rs"
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@
 | 
			
		||||
!define DESCRIPTION "Fast, light, robust Ethereum implementation"
 | 
			
		||||
!define VERSIONMAJOR 1
 | 
			
		||||
!define VERSIONMINOR 3
 | 
			
		||||
!define VERSIONBUILD 9
 | 
			
		||||
!define VERSIONBUILD 10
 | 
			
		||||
 | 
			
		||||
!addplugindir .\
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ description = "Ethcore utility library"
 | 
			
		||||
homepage = "http://ethcore.io"
 | 
			
		||||
license = "GPL-3.0"
 | 
			
		||||
name = "ethcore-util"
 | 
			
		||||
version = "1.3.9"
 | 
			
		||||
version = "1.3.10"
 | 
			
		||||
authors = ["Ethcore <admin@ethcore.io>"]
 | 
			
		||||
build = "build.rs"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -204,7 +204,8 @@ pub struct Database {
 | 
			
		||||
	// Values currently being flushed. Cleared when `flush` completes.
 | 
			
		||||
	flushing: RwLock<Vec<HashMap<ElasticArray32<u8>, KeyState>>>,
 | 
			
		||||
	// Prevents concurrent flushes.
 | 
			
		||||
	flushing_lock: Mutex<()>,
 | 
			
		||||
	// Value indicates if a flush is in progress.
 | 
			
		||||
	flushing_lock: Mutex<bool>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Database {
 | 
			
		||||
@ -297,7 +298,7 @@ impl Database {
 | 
			
		||||
			overlay: RwLock::new((0..(cfs.len() + 1)).map(|_| HashMap::new()).collect()),
 | 
			
		||||
			flushing: RwLock::new((0..(cfs.len() + 1)).map(|_| HashMap::new()).collect()),
 | 
			
		||||
			cfs: cfs,
 | 
			
		||||
			flushing_lock: Mutex::new(()),
 | 
			
		||||
			flushing_lock: Mutex::new(false),
 | 
			
		||||
			read_opts: read_opts,
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
@ -335,9 +336,7 @@ impl Database {
 | 
			
		||||
		Ok(())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// Commit buffered changes to database.
 | 
			
		||||
	pub fn flush(&self) -> Result<(), String> {
 | 
			
		||||
		let _lock = self.flushing_lock.lock();
 | 
			
		||||
	fn write_flushing_with_lock(&self, _lock: &mut MutexGuard<bool>) -> Result<(), String> {
 | 
			
		||||
		mem::swap(&mut *self.overlay.write(), &mut *self.flushing.write());
 | 
			
		||||
		let batch = WriteBatch::new();
 | 
			
		||||
		for (c, column) in self.flushing.read().iter().enumerate() {
 | 
			
		||||
@ -375,6 +374,20 @@ impl Database {
 | 
			
		||||
		Ok(())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// Commit buffered changes to database.
 | 
			
		||||
	pub fn flush(&self) -> Result<(), String> {
 | 
			
		||||
		let mut lock = self.flushing_lock.lock();
 | 
			
		||||
		// If RocksDB batch allocation fails the thread gets terminated and the lock is released.
 | 
			
		||||
		// The value inside the lock is used to detect that.
 | 
			
		||||
		if *lock {
 | 
			
		||||
			// This can only happen if another flushing thread is terminated unexpectedly.
 | 
			
		||||
			return Err("Database write failure. Running low on memory perhaps?".to_owned());
 | 
			
		||||
		}
 | 
			
		||||
		*lock = true;
 | 
			
		||||
		let result = self.write_flushing_with_lock(&mut lock);
 | 
			
		||||
		*lock = false;
 | 
			
		||||
		result
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/// Commit transaction to database.
 | 
			
		||||
	pub fn write(&self, tr: DBTransaction) -> Result<(), String> {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user