mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 21:01:05 +00:00
Use tokio runtime handle instead of TaskExecutor abstraction (#9737)
* Use tokio runtime handle instead of TaskExecutor abstraction Before this pr we had the `TaskExecutor` abstraction which theoretically allowed that any futures executor could have been used. However, this was never tested and is currently not really required. Anyone running a node currently only used tokio and nothing else (because this was hard coded in CLI). So, this pr removes the `TaskExecutor` abstraction and relies directly on the tokio runtime handle. Besides this changes, this pr also makes sure that the http and ws rpc server use the same tokio runtime. This fixes a panic that occurred when you drop the rpc servers inside an async function (tokio doesn't like that a tokio runtime is dropped in the async context of another tokio runtime). As we don't use any custom runtime in the http rpc server anymore, this pr also removes the `rpc-http-threads` cli argument. If external parties complain that there aren't enough threads for the rpc server, we could bring support for increasing the thread count of the tokio runtime. * FMT * Fix try runtime * Fix integration tests and some other optimizations * Remove warnings
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
use crate::{config::TaskExecutor, task_manager::TaskManager};
|
||||
use crate::task_manager::TaskManager;
|
||||
use futures::{future::FutureExt, pin_mut, select};
|
||||
use parking_lot::Mutex;
|
||||
use std::{any::Any, sync::Arc, time::Duration};
|
||||
@@ -84,17 +84,16 @@ async fn run_background_task_blocking(duration: Duration, _keep_alive: impl Any)
|
||||
}
|
||||
}
|
||||
|
||||
fn new_task_manager(task_executor: TaskExecutor) -> TaskManager {
|
||||
TaskManager::new(task_executor, None).unwrap()
|
||||
fn new_task_manager(tokio_handle: tokio::runtime::Handle) -> TaskManager {
|
||||
TaskManager::new(tokio_handle, None).unwrap()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ensure_tasks_are_awaited_on_shutdown() {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let handle = runtime.handle().clone();
|
||||
let task_executor: TaskExecutor = (move |future, _| handle.spawn(future).map(|_| ())).into();
|
||||
|
||||
let task_manager = new_task_manager(task_executor);
|
||||
let task_manager = new_task_manager(handle);
|
||||
let spawn_handle = task_manager.spawn_handle();
|
||||
let drop_tester = DropTester::new();
|
||||
spawn_handle.spawn("task1", run_background_task(drop_tester.new_ref()));
|
||||
@@ -111,9 +110,8 @@ fn ensure_tasks_are_awaited_on_shutdown() {
|
||||
fn ensure_keep_alive_during_shutdown() {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let handle = runtime.handle().clone();
|
||||
let task_executor: TaskExecutor = (move |future, _| handle.spawn(future).map(|_| ())).into();
|
||||
|
||||
let mut task_manager = new_task_manager(task_executor);
|
||||
let mut task_manager = new_task_manager(handle);
|
||||
let spawn_handle = task_manager.spawn_handle();
|
||||
let drop_tester = DropTester::new();
|
||||
task_manager.keep_alive(drop_tester.new_ref());
|
||||
@@ -130,9 +128,8 @@ fn ensure_keep_alive_during_shutdown() {
|
||||
fn ensure_blocking_futures_are_awaited_on_shutdown() {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let handle = runtime.handle().clone();
|
||||
let task_executor: TaskExecutor = (move |future, _| handle.spawn(future).map(|_| ())).into();
|
||||
|
||||
let task_manager = new_task_manager(task_executor);
|
||||
let task_manager = new_task_manager(handle);
|
||||
let spawn_handle = task_manager.spawn_handle();
|
||||
let drop_tester = DropTester::new();
|
||||
spawn_handle.spawn(
|
||||
@@ -155,9 +152,8 @@ fn ensure_blocking_futures_are_awaited_on_shutdown() {
|
||||
fn ensure_no_task_can_be_spawn_after_terminate() {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let handle = runtime.handle().clone();
|
||||
let task_executor: TaskExecutor = (move |future, _| handle.spawn(future).map(|_| ())).into();
|
||||
|
||||
let mut task_manager = new_task_manager(task_executor);
|
||||
let mut task_manager = new_task_manager(handle);
|
||||
let spawn_handle = task_manager.spawn_handle();
|
||||
let drop_tester = DropTester::new();
|
||||
spawn_handle.spawn("task1", run_background_task(drop_tester.new_ref()));
|
||||
@@ -176,9 +172,8 @@ fn ensure_no_task_can_be_spawn_after_terminate() {
|
||||
fn ensure_task_manager_future_ends_when_task_manager_terminated() {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let handle = runtime.handle().clone();
|
||||
let task_executor: TaskExecutor = (move |future, _| handle.spawn(future).map(|_| ())).into();
|
||||
|
||||
let mut task_manager = new_task_manager(task_executor);
|
||||
let mut task_manager = new_task_manager(handle);
|
||||
let spawn_handle = task_manager.spawn_handle();
|
||||
let drop_tester = DropTester::new();
|
||||
spawn_handle.spawn("task1", run_background_task(drop_tester.new_ref()));
|
||||
@@ -197,9 +192,8 @@ fn ensure_task_manager_future_ends_when_task_manager_terminated() {
|
||||
fn ensure_task_manager_future_ends_with_error_when_essential_task_fails() {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let handle = runtime.handle().clone();
|
||||
let task_executor: TaskExecutor = (move |future, _| handle.spawn(future).map(|_| ())).into();
|
||||
|
||||
let mut task_manager = new_task_manager(task_executor);
|
||||
let mut task_manager = new_task_manager(handle);
|
||||
let spawn_handle = task_manager.spawn_handle();
|
||||
let spawn_essential_handle = task_manager.spawn_essential_handle();
|
||||
let drop_tester = DropTester::new();
|
||||
@@ -222,12 +216,11 @@ fn ensure_task_manager_future_ends_with_error_when_essential_task_fails() {
|
||||
fn ensure_children_tasks_ends_when_task_manager_terminated() {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let handle = runtime.handle().clone();
|
||||
let task_executor: TaskExecutor = (move |future, _| handle.spawn(future).map(|_| ())).into();
|
||||
|
||||
let mut task_manager = new_task_manager(task_executor.clone());
|
||||
let child_1 = new_task_manager(task_executor.clone());
|
||||
let mut task_manager = new_task_manager(handle.clone());
|
||||
let child_1 = new_task_manager(handle.clone());
|
||||
let spawn_handle_child_1 = child_1.spawn_handle();
|
||||
let child_2 = new_task_manager(task_executor.clone());
|
||||
let child_2 = new_task_manager(handle.clone());
|
||||
let spawn_handle_child_2 = child_2.spawn_handle();
|
||||
task_manager.add_child(child_1);
|
||||
task_manager.add_child(child_2);
|
||||
@@ -251,13 +244,12 @@ fn ensure_children_tasks_ends_when_task_manager_terminated() {
|
||||
fn ensure_task_manager_future_ends_with_error_when_childs_essential_task_fails() {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let handle = runtime.handle().clone();
|
||||
let task_executor: TaskExecutor = (move |future, _| handle.spawn(future).map(|_| ())).into();
|
||||
|
||||
let mut task_manager = new_task_manager(task_executor.clone());
|
||||
let child_1 = new_task_manager(task_executor.clone());
|
||||
let mut task_manager = new_task_manager(handle.clone());
|
||||
let child_1 = new_task_manager(handle.clone());
|
||||
let spawn_handle_child_1 = child_1.spawn_handle();
|
||||
let spawn_essential_handle_child_1 = child_1.spawn_essential_handle();
|
||||
let child_2 = new_task_manager(task_executor.clone());
|
||||
let child_2 = new_task_manager(handle.clone());
|
||||
let spawn_handle_child_2 = child_2.spawn_handle();
|
||||
task_manager.add_child(child_1);
|
||||
task_manager.add_child(child_2);
|
||||
@@ -284,12 +276,11 @@ fn ensure_task_manager_future_ends_with_error_when_childs_essential_task_fails()
|
||||
fn ensure_task_manager_future_continues_when_childs_not_essential_task_fails() {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let handle = runtime.handle().clone();
|
||||
let task_executor: TaskExecutor = (move |future, _| handle.spawn(future).map(|_| ())).into();
|
||||
|
||||
let mut task_manager = new_task_manager(task_executor.clone());
|
||||
let child_1 = new_task_manager(task_executor.clone());
|
||||
let mut task_manager = new_task_manager(handle.clone());
|
||||
let child_1 = new_task_manager(handle.clone());
|
||||
let spawn_handle_child_1 = child_1.spawn_handle();
|
||||
let child_2 = new_task_manager(task_executor.clone());
|
||||
let child_2 = new_task_manager(handle.clone());
|
||||
let spawn_handle_child_2 = child_2.spawn_handle();
|
||||
task_manager.add_child(child_1);
|
||||
task_manager.add_child(child_2);
|
||||
|
||||
Reference in New Issue
Block a user