Skip to content
This repository was archived by the owner on Nov 6, 2020. It is now read-only.

Commit 7fa64ea

Browse files
committed
Remove secret_store runtimes.
* Remove the independent runtimes from `KeyServerHttpListener` and `KeyServerCore` and instead require a `parity_runtime::Executor` to be passed upon creation of each. * Remove the `threads` parameter from both `ClusterConfiguration` structs. * Implement the `future::Executor` trait for `parity_runtime::Executor`. * Update tests. - Update the `loop_until` function to instead use a oneshot to signal completion. - Modify the `make_key_servers` function to create and return a runtime.
1 parent 1fdfa1e commit 7fa64ea

File tree

12 files changed

+131
-144
lines changed

12 files changed

+131
-144
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

parity/run.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ fn execute_impl<Cr, Rr>(cmd: RunCmd, logger: Arc<RotatingLogger>, on_client_rq:
739739
account_provider: account_provider,
740740
accounts_passwords: &passwords,
741741
};
742-
let secretstore_key_server = secretstore::start(cmd.secretstore_conf.clone(), secretstore_deps)?;
742+
let secretstore_key_server = secretstore::start(cmd.secretstore_conf.clone(), secretstore_deps, runtime.executor())?;
743743

744744
// the ipfs server
745745
let ipfs_server = ipfs::start_server(cmd.ipfs_conf.clone(), client.clone())?;

parity/secretstore.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use ethcore::miner::Miner;
2424
use ethkey::{Secret, Public};
2525
use sync::SyncProvider;
2626
use ethereum_types::Address;
27+
use parity_runtime::Executor;
2728

2829
/// This node secret key.
2930
#[derive(Debug, PartialEq, Clone)]
@@ -100,14 +101,14 @@ pub struct Dependencies<'a> {
100101

101102
#[cfg(not(feature = "secretstore"))]
102103
mod server {
103-
use super::{Configuration, Dependencies};
104+
use super::{Configuration, Dependencies, Executor};
104105

105106
/// Noop key server implementation
106107
pub struct KeyServer;
107108

108109
impl KeyServer {
109110
/// Create new noop key server
110-
pub fn new(_conf: Configuration, _deps: Dependencies) -> Result<Self, String> {
111+
pub fn new(_conf: Configuration, _deps: Dependencies, _executor: Executor) -> Result<Self, String> {
111112
Ok(KeyServer)
112113
}
113114
}
@@ -120,7 +121,7 @@ mod server {
120121
use ethkey::KeyPair;
121122
use ansi_term::Colour::{Red, White};
122123
use db;
123-
use super::{Configuration, Dependencies, NodeSecretKey, ContractAddress};
124+
use super::{Configuration, Dependencies, NodeSecretKey, ContractAddress, Executor};
124125

125126
fn into_service_contract_address(address: ContractAddress) -> ethcore_secretstore::ContractAddress {
126127
match address {
@@ -136,7 +137,7 @@ mod server {
136137

137138
impl KeyServer {
138139
/// Create new key server
139-
pub fn new(mut conf: Configuration, deps: Dependencies) -> Result<Self, String> {
140+
pub fn new(mut conf: Configuration, deps: Dependencies, executor: Executor) -> Result<Self, String> {
140141
let self_secret: Arc<ethcore_secretstore::NodeKeyPair> = match conf.self_secret.take() {
141142
Some(NodeSecretKey::Plain(secret)) => Arc::new(ethcore_secretstore::PlainNodeKeyPair::new(
142143
KeyPair::from_secret(secret).map_err(|e| format!("invalid secret: {}", e))?)),
@@ -179,7 +180,6 @@ mod server {
179180
service_contract_doc_sretr_address: conf.service_contract_doc_sretr_address.map(into_service_contract_address),
180181
acl_check_contract_address: conf.acl_check_contract_address.map(into_service_contract_address),
181182
cluster_config: ethcore_secretstore::ClusterConfiguration {
182-
threads: 4,
183183
listener_address: ethcore_secretstore::NodeAddress {
184184
address: conf.interface.clone(),
185185
port: conf.port,
@@ -198,7 +198,7 @@ mod server {
198198
cconf.cluster_config.nodes.insert(self_secret.public().clone(), cconf.cluster_config.listener_address.clone());
199199

200200
let db = db::open_secretstore_db(&conf.data_path)?;
201-
let key_server = ethcore_secretstore::start(deps.client, deps.sync, deps.miner, self_secret, cconf, db)
201+
let key_server = ethcore_secretstore::start(deps.client, deps.sync, deps.miner, self_secret, cconf, db, executor)
202202
.map_err(|e| format!("Error starting KeyServer {}: {}", key_server_name, e))?;
203203

204204
Ok(KeyServer {
@@ -238,11 +238,11 @@ impl Default for Configuration {
238238
}
239239

240240
/// Start secret store-related functionality
241-
pub fn start(conf: Configuration, deps: Dependencies) -> Result<Option<KeyServer>, String> {
241+
pub fn start(conf: Configuration, deps: Dependencies, executor: Executor) -> Result<Option<KeyServer>, String> {
242242
if !conf.enabled {
243243
return Ok(None);
244244
}
245245

246-
KeyServer::new(conf, deps)
246+
KeyServer::new(conf, deps, executor)
247247
.map(|s| Some(s))
248248
}

secret_store/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ futures = "0.1"
1717
rustc-hex = "1.0"
1818
tiny-keccak = "1.4"
1919
tokio = "~0.1.11"
20+
parity-runtime = { path = "../util/runtime" }
2021
tokio-io = "0.1"
2122
tokio-service = "0.1"
2223
url = "1.0"

secret_store/src/key_server.rs

Lines changed: 31 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,11 @@
1515
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
1616

1717
use std::collections::BTreeSet;
18-
use std::thread;
1918
use std::sync::Arc;
20-
use std::sync::mpsc;
21-
use futures::{self, Future};
2219
use parking_lot::Mutex;
23-
use tokio::runtime;
2420
use crypto::DEFAULT_MAC;
2521
use ethkey::crypto;
22+
use parity_runtime::Executor;
2623
use super::acl_storage::AclStorage;
2724
use super::key_storage::KeyStorage;
2825
use super::key_server_set::KeyServerSet;
@@ -39,16 +36,16 @@ pub struct KeyServerImpl {
3936

4037
/// Secret store key server data.
4138
pub struct KeyServerCore {
42-
close: Option<futures::Complete<()>>,
43-
handle: Option<thread::JoinHandle<()>>,
4439
cluster: Arc<ClusterClient>,
4540
}
4641

4742
impl KeyServerImpl {
4843
/// Create new key server instance
49-
pub fn new(config: &ClusterConfiguration, key_server_set: Arc<KeyServerSet>, self_key_pair: Arc<NodeKeyPair>, acl_storage: Arc<AclStorage>, key_storage: Arc<KeyStorage>) -> Result<Self, Error> {
44+
pub fn new(config: &ClusterConfiguration, key_server_set: Arc<KeyServerSet>, self_key_pair: Arc<NodeKeyPair>,
45+
acl_storage: Arc<AclStorage>, key_storage: Arc<KeyStorage>, executor: Executor) -> Result<Self, Error>
46+
{
5047
Ok(KeyServerImpl {
51-
data: Arc::new(Mutex::new(KeyServerCore::new(config, key_server_set, self_key_pair, acl_storage, key_storage)?)),
48+
data: Arc::new(Mutex::new(KeyServerCore::new(config, key_server_set, self_key_pair, acl_storage, key_storage, executor)?)),
5249
})
5350
}
5451

@@ -175,9 +172,10 @@ impl MessageSigner for KeyServerImpl {
175172
}
176173

177174
impl KeyServerCore {
178-
pub fn new(config: &ClusterConfiguration, key_server_set: Arc<KeyServerSet>, self_key_pair: Arc<NodeKeyPair>, acl_storage: Arc<AclStorage>, key_storage: Arc<KeyStorage>) -> Result<Self, Error> {
175+
pub fn new(config: &ClusterConfiguration, key_server_set: Arc<KeyServerSet>, self_key_pair: Arc<NodeKeyPair>,
176+
acl_storage: Arc<AclStorage>, key_storage: Arc<KeyStorage>, executor: Executor) -> Result<Self, Error>
177+
{
179178
let config = NetClusterConfiguration {
180-
threads: config.threads,
181179
self_key_pair: self_key_pair.clone(),
182180
listen_address: (config.listener_address.address.clone(), config.listener_address.port),
183181
key_server_set: key_server_set,
@@ -188,45 +186,16 @@ impl KeyServerCore {
188186
auto_migrate_enabled: config.auto_migrate_enabled,
189187
};
190188

191-
let (stop, stopped) = futures::oneshot();
192-
let (tx, rx) = mpsc::channel();
193-
let handle = thread::Builder::new().name("KeyServerLoop".into()).spawn(move || {
194-
let runtime_res = runtime::Builder::new()
195-
.core_threads(config.threads)
196-
.build();
197-
198-
let mut el = match runtime_res {
199-
Ok(el) => el,
200-
Err(e) => {
201-
tx.send(Err(Error::Internal(format!("error initializing event loop: {}", e)))).expect("Rx is blocking upper thread.");
202-
return;
203-
},
204-
};
205-
206-
let cluster = ClusterCore::new(el.executor(), config);
207-
let cluster_client = cluster.and_then(|c| c.run().map(|_| c.client()));
208-
tx.send(cluster_client.map_err(Into::into)).expect("Rx is blocking upper thread.");
209-
let _ = el.block_on(futures::empty().select(stopped));
210-
211-
trace!(target: "secretstore_net", "{}: KeyServerLoop thread stopped", self_key_pair.public());
212-
}).map_err(|e| Error::Internal(format!("{}", e)))?;
213-
let cluster = rx.recv().map_err(|e| Error::Internal(format!("error initializing event loop: {}", e)))??;
189+
let cluster = ClusterCore::new(executor, config)
190+
.and_then(|c| c.run().map(|_| c.client()))
191+
.map_err(|err| Error::from(err))?;
214192

215193
Ok(KeyServerCore {
216-
close: Some(stop),
217-
handle: Some(handle),
218-
cluster: cluster,
194+
cluster,
219195
})
220196
}
221197
}
222198

223-
impl Drop for KeyServerCore {
224-
fn drop(&mut self) {
225-
self.close.take().map(|v| v.send(()));
226-
self.handle.take().map(|h| h.join());
227-
}
228-
}
229-
230199
#[cfg(test)]
231200
pub mod tests {
232201
use std::collections::BTreeSet;
@@ -243,6 +212,7 @@ pub mod tests {
243212
use key_server_set::tests::MapKeyServerSet;
244213
use key_server_cluster::math;
245214
use ethereum_types::{H256, H520};
215+
use parity_runtime::Runtime;
246216
use types::{Error, Public, ClusterConfiguration, NodeAddress, RequestSignature, ServerKeyId,
247217
EncryptedDocumentKey, EncryptedDocumentKeyShadow, MessageHash, EncryptedMessageSignature,
248218
Requester, NodeId};
@@ -294,10 +264,9 @@ pub mod tests {
294264
}
295265
}
296266

297-
fn make_key_servers(start_port: u16, num_nodes: usize) -> (Vec<KeyServerImpl>, Vec<Arc<DummyKeyStorage>>) {
267+
fn make_key_servers(start_port: u16, num_nodes: usize) -> (Vec<KeyServerImpl>, Vec<Arc<DummyKeyStorage>>, Runtime) {
298268
let key_pairs: Vec<_> = (0..num_nodes).map(|_| Random.generate().unwrap()).collect();
299269
let configs: Vec<_> = (0..num_nodes).map(|i| ClusterConfiguration {
300-
threads: 1,
301270
listener_address: NodeAddress {
302271
address: "127.0.0.1".into(),
303272
port: start_port + (i as u16),
@@ -316,11 +285,12 @@ pub mod tests {
316285
.map(|(k, a)| (k.clone(), format!("{}:{}", a.address, a.port).parse().unwrap()))
317286
.collect();
318287
let key_storages = (0..num_nodes).map(|_| Arc::new(DummyKeyStorage::default())).collect::<Vec<_>>();
288+
let runtime = Runtime::with_thread_count(4);
319289
let key_servers: Vec<_> = configs.into_iter().enumerate().map(|(i, cfg)|
320290
KeyServerImpl::new(&cfg, Arc::new(MapKeyServerSet::new(false, key_servers_set.clone())),
321291
Arc::new(PlainNodeKeyPair::new(key_pairs[i].clone())),
322292
Arc::new(DummyAclStorage::default()),
323-
key_storages[i].clone()).unwrap()
293+
key_storages[i].clone(), runtime.executor()).unwrap()
324294
).collect();
325295

326296
// wait until connections are established. It is fast => do not bother with events here
@@ -350,13 +320,13 @@ pub mod tests {
350320
}
351321
}
352322

353-
(key_servers, key_storages)
323+
(key_servers, key_storages, runtime)
354324
}
355325

356326
#[test]
357327
fn document_key_generation_and_retrievement_works_over_network_with_single_node() {
358328
//::logger::init_log();
359-
let (key_servers, _) = make_key_servers(6070, 1);
329+
let (key_servers, _, runtime) = make_key_servers(6070, 1);
360330

361331
// generate document key
362332
let threshold = 0;
@@ -372,12 +342,13 @@ pub mod tests {
372342
let retrieved_key = crypto::ecies::decrypt(&secret, &DEFAULT_MAC, &retrieved_key).unwrap();
373343
assert_eq!(retrieved_key, generated_key);
374344
}
345+
drop(runtime);
375346
}
376347

377348
#[test]
378349
fn document_key_generation_and_retrievement_works_over_network_with_3_nodes() {
379350
//::logger::init_log();
380-
let (key_servers, key_storages) = make_key_servers(6080, 3);
351+
let (key_servers, key_storages, runtime) = make_key_servers(6080, 3);
381352

382353
let test_cases = [0, 1, 2];
383354
for threshold in &test_cases {
@@ -399,12 +370,13 @@ pub mod tests {
399370
assert!(key_share.encrypted_point.is_some());
400371
}
401372
}
373+
drop(runtime);
402374
}
403375

404376
#[test]
405377
fn server_key_generation_and_storing_document_key_works_over_network_with_3_nodes() {
406378
//::logger::init_log();
407-
let (key_servers, _) = make_key_servers(6090, 3);
379+
let (key_servers, _, runtime) = make_key_servers(6090, 3);
408380

409381
let test_cases = [0, 1, 2];
410382
for threshold in &test_cases {
@@ -430,12 +402,13 @@ pub mod tests {
430402
assert_eq!(retrieved_key, generated_key);
431403
}
432404
}
405+
drop(runtime);
433406
}
434407

435408
#[test]
436409
fn server_key_generation_and_message_signing_works_over_network_with_3_nodes() {
437410
//::logger::init_log();
438-
let (key_servers, _) = make_key_servers(6100, 3);
411+
let (key_servers, _, runtime) = make_key_servers(6100, 3);
439412

440413
let test_cases = [0, 1, 2];
441414
for threshold in &test_cases {
@@ -455,12 +428,13 @@ pub mod tests {
455428
// check signature
456429
assert_eq!(math::verify_schnorr_signature(&server_public, &(signature_c, signature_s), &message_hash), Ok(true));
457430
}
431+
drop(runtime);
458432
}
459433

460434
#[test]
461435
fn decryption_session_is_delegated_when_node_does_not_have_key_share() {
462436
//::logger::init_log();
463-
let (key_servers, _) = make_key_servers(6110, 3);
437+
let (key_servers, _, runtime) = make_key_servers(6110, 3);
464438

465439
// generate document key
466440
let threshold = 0;
@@ -477,12 +451,13 @@ pub mod tests {
477451
let retrieved_key = key_servers[0].restore_document_key(&document, &signature.into()).unwrap();
478452
let retrieved_key = crypto::ecies::decrypt(&secret, &DEFAULT_MAC, &retrieved_key).unwrap();
479453
assert_eq!(retrieved_key, generated_key);
454+
drop(runtime);
480455
}
481456

482457
#[test]
483458
fn schnorr_signing_session_is_delegated_when_node_does_not_have_key_share() {
484459
//::logger::init_log();
485-
let (key_servers, _) = make_key_servers(6114, 3);
460+
let (key_servers, _, runtime) = make_key_servers(6114, 3);
486461
let threshold = 1;
487462

488463
// generate server key
@@ -503,12 +478,13 @@ pub mod tests {
503478

504479
// check signature
505480
assert_eq!(math::verify_schnorr_signature(&server_public, &(signature_c, signature_s), &message_hash), Ok(true));
481+
drop(runtime);
506482
}
507483

508484
#[test]
509485
fn ecdsa_signing_session_is_delegated_when_node_does_not_have_key_share() {
510486
//::logger::init_log();
511-
let (key_servers, _) = make_key_servers(6117, 4);
487+
let (key_servers, _, runtime) = make_key_servers(6117, 4);
512488
let threshold = 1;
513489

514490
// generate server key
@@ -528,6 +504,7 @@ pub mod tests {
528504

529505
// check signature
530506
assert!(verify_public(&server_public, &signature.into(), &message_hash).unwrap());
507+
drop(runtime);
531508
}
532509

533510
#[test]

secret_store/src/key_server_cluster/client_sessions/generation_session.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,12 +1367,12 @@ pub mod tests {
13671367
let clusters_clone = clusters.clone();
13681368

13691369
// establish connections
1370-
loop_until(&mut core, CONN_TIMEOUT, move || clusters_clone.iter().all(all_connections_established));
1370+
loop_until(&core.executor(), CONN_TIMEOUT, move || clusters_clone.iter().all(all_connections_established));
13711371

13721372
// run session to completion
13731373
let session_id = SessionId::default();
13741374
let session = clusters[0].client().new_generation_session(session_id, Default::default(), Default::default(), threshold).unwrap();
1375-
loop_until(&mut core, SESSION_TIMEOUT, move || session.joint_public_and_secret().is_some());
1375+
loop_until(&core.executor(), SESSION_TIMEOUT, move || session.joint_public_and_secret().is_some());
13761376
}
13771377
}
13781378

0 commit comments

Comments
 (0)