mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 21:41:12 +00:00
Add a feature to create automatically a random temporary directory for base path & remove Clone (#6221)
* Initial commit Forked at:4adac40c07Parent branch: origin/master * Add a feature to create automatically a temporary directory for base path * doc fix and todos * use parking_lot instead * use refcell instead since we stay in the main thread * remove Clone derives * add test * solving dependency issue * clarifying doc * conflict argument with base-path * WIP Forked at:4adac40c07Parent branch: origin/master * revert dep deletion * fixing test and making base_path optional * hold basepath while the service is running * fixes * Update client/cli/src/params/shared_params.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/service/Cargo.toml Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/cli/src/commands/mod.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/service/src/config.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * WIP Forked at:4adac40c07Parent branch: origin/master * improve doc Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
@@ -1418,6 +1418,7 @@ ServiceBuilder<
|
||||
keystore,
|
||||
marker: PhantomData::<TBl>,
|
||||
prometheus_registry: config.prometheus_config.map(|config| config.registry),
|
||||
_base_path: config.base_path.map(Arc::new),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,12 +24,14 @@ pub use sc_network::config::{ExtTransport, MultiaddrWithPeerId, NetworkConfigura
|
||||
pub use sc_executor::WasmExecutionMethod;
|
||||
use sc_client_api::execution_extensions::ExecutionStrategies;
|
||||
|
||||
use std::{future::Future, path::{PathBuf, Path}, pin::Pin, net::SocketAddr, sync::Arc};
|
||||
use std::{io, future::Future, path::{PathBuf, Path}, pin::Pin, net::SocketAddr, sync::Arc};
|
||||
pub use sc_transaction_pool::txpool::Options as TransactionPoolOptions;
|
||||
use sc_chain_spec::ChainSpec;
|
||||
use sp_core::crypto::Protected;
|
||||
pub use sc_telemetry::TelemetryEndpoints;
|
||||
use prometheus_endpoint::Registry;
|
||||
#[cfg(not(target_os = "unknown"))]
|
||||
use tempfile::TempDir;
|
||||
|
||||
/// Service configuration.
|
||||
pub struct Configuration {
|
||||
@@ -102,6 +104,8 @@ pub struct Configuration {
|
||||
pub max_runtime_instances: usize,
|
||||
/// Announce block automatically after they have been imported
|
||||
pub announce_block: bool,
|
||||
/// Base path of the configuration
|
||||
pub base_path: Option<BasePath>,
|
||||
}
|
||||
|
||||
/// Type for tasks spawned by the executor.
|
||||
@@ -191,3 +195,59 @@ impl Default for RpcMethods {
|
||||
RpcMethods::Auto
|
||||
}
|
||||
}
|
||||
|
||||
/// The base path that is used for everything that needs to be write on disk to run a node.
|
||||
pub enum BasePath {
|
||||
/// A temporary directory is used as base path and will be deleted when dropped.
|
||||
#[cfg(not(target_os = "unknown"))]
|
||||
Temporary(TempDir),
|
||||
/// A path on the disk.
|
||||
Permanenent(PathBuf),
|
||||
}
|
||||
|
||||
impl BasePath {
|
||||
/// Create a `BasePath` instance using a temporary directory prefixed with "substrate" and use
|
||||
/// it as base path.
|
||||
///
|
||||
/// Note: the temporary directory will be created automatically and deleted when the `BasePath`
|
||||
/// instance is dropped.
|
||||
#[cfg(not(target_os = "unknown"))]
|
||||
pub fn new_temp_dir() -> io::Result<BasePath> {
|
||||
Ok(BasePath::Temporary(
|
||||
tempfile::Builder::new().prefix("substrate").tempdir()?,
|
||||
))
|
||||
}
|
||||
|
||||
/// Create a `BasePath` instance based on an existing path on disk.
|
||||
///
|
||||
/// Note: this function will not ensure that the directory exist nor create the directory. It
|
||||
/// will also not delete the directory when the instance is dropped.
|
||||
pub fn new<P: AsRef<Path>>(path: P) -> BasePath {
|
||||
BasePath::Permanenent(path.as_ref().to_path_buf())
|
||||
}
|
||||
|
||||
/// Create a base path from values describing the project.
|
||||
#[cfg(not(target_os = "unknown"))]
|
||||
pub fn from_project(qualifier: &str, organization: &str, application: &str) -> BasePath {
|
||||
BasePath::new(
|
||||
directories::ProjectDirs::from(qualifier, organization, application)
|
||||
.expect("app directories exist on all supported platforms; qed")
|
||||
.data_local_dir(),
|
||||
)
|
||||
}
|
||||
|
||||
/// Retrieve the base path.
|
||||
pub fn path(&self) -> &Path {
|
||||
match self {
|
||||
#[cfg(not(target_os = "unknown"))]
|
||||
BasePath::Temporary(temp_dir) => temp_dir.path(),
|
||||
BasePath::Permanenent(path) => path.as_path(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl std::convert::From<PathBuf> for BasePath {
|
||||
fn from(path: PathBuf) -> Self {
|
||||
BasePath::new(path)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ pub use self::builder::{
|
||||
ServiceBuilder, ServiceBuilderCommand, TFullClient, TLightClient, TFullBackend, TLightBackend,
|
||||
TFullCallExecutor, TLightCallExecutor, RpcExtensionBuilder,
|
||||
};
|
||||
pub use config::{Configuration, DatabaseConfig, PruningMode, Role, RpcMethods, TaskType};
|
||||
pub use config::{BasePath, Configuration, DatabaseConfig, PruningMode, Role, RpcMethods, TaskType};
|
||||
pub use sc_chain_spec::{
|
||||
ChainSpec, GenericChainSpec, Properties, RuntimeGenesis, Extension as ChainSpecExtension,
|
||||
NoExtension, ChainType,
|
||||
@@ -110,14 +110,14 @@ pub struct Service<TBl, TCl, TSc, TNetStatus, TNet, TTxPool, TOc> {
|
||||
task_manager: TaskManager,
|
||||
select_chain: Option<TSc>,
|
||||
network: Arc<TNet>,
|
||||
/// Sinks to propagate network status updates.
|
||||
/// For each element, every time the `Interval` fires we push an element on the sender.
|
||||
// Sinks to propagate network status updates.
|
||||
// For each element, every time the `Interval` fires we push an element on the sender.
|
||||
network_status_sinks: Arc<Mutex<status_sinks::StatusSinks<(TNetStatus, NetworkState)>>>,
|
||||
transaction_pool: Arc<TTxPool>,
|
||||
/// Send a signal when a spawned essential task has concluded. The next time
|
||||
/// the service future is polled it should complete with an error.
|
||||
// Send a signal when a spawned essential task has concluded. The next time
|
||||
// the service future is polled it should complete with an error.
|
||||
essential_failed_tx: TracingUnboundedSender<()>,
|
||||
/// A receiver for spawned essential-tasks concluding.
|
||||
// A receiver for spawned essential-tasks concluding.
|
||||
essential_failed_rx: TracingUnboundedReceiver<()>,
|
||||
rpc_handlers: sc_rpc_server::RpcHandler<sc_rpc::Metadata>,
|
||||
_rpc: Box<dyn std::any::Any + Send + Sync>,
|
||||
@@ -127,6 +127,9 @@ pub struct Service<TBl, TCl, TSc, TNetStatus, TNet, TTxPool, TOc> {
|
||||
keystore: sc_keystore::KeyStorePtr,
|
||||
marker: PhantomData<TBl>,
|
||||
prometheus_registry: Option<prometheus_endpoint::Registry>,
|
||||
// The base path is kept here because it can be a temporary directory which will be deleted
|
||||
// when dropped
|
||||
_base_path: Option<Arc<BasePath>>,
|
||||
}
|
||||
|
||||
impl<TBl, TCl, TSc, TNetStatus, TNet, TTxPool, TOc> Unpin for Service<TBl, TCl, TSc, TNetStatus, TNet, TTxPool, TOc> {}
|
||||
@@ -210,6 +213,9 @@ pub trait AbstractService: Future<Output = Result<(), Error>> + Send + Unpin + S
|
||||
|
||||
/// Get the prometheus metrics registry, if available.
|
||||
fn prometheus_registry(&self) -> Option<prometheus_endpoint::Registry>;
|
||||
|
||||
/// Get a clone of the base_path
|
||||
fn base_path(&self) -> Option<Arc<BasePath>>;
|
||||
}
|
||||
|
||||
impl<TBl, TBackend, TExec, TRtApi, TSc, TExPool, TOc> AbstractService for
|
||||
@@ -244,7 +250,7 @@ where
|
||||
}
|
||||
|
||||
fn telemetry(&self) -> Option<sc_telemetry::Telemetry> {
|
||||
self._telemetry.as_ref().map(|t| t.clone())
|
||||
self._telemetry.clone()
|
||||
}
|
||||
|
||||
fn keystore(&self) -> sc_keystore::KeyStorePtr {
|
||||
@@ -310,6 +316,10 @@ where
|
||||
fn prometheus_registry(&self) -> Option<prometheus_endpoint::Registry> {
|
||||
self.prometheus_registry.clone()
|
||||
}
|
||||
|
||||
fn base_path(&self) -> Option<Arc<BasePath>> {
|
||||
self._base_path.clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl<TBl, TCl, TSc, TNetStatus, TNet, TTxPool, TOc> Future for
|
||||
|
||||
Reference in New Issue
Block a user