From 5e5660b40e2d597448cca7c94dd6517889ad6f26 Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Tue, 20 Jul 2021 16:53:26 +0200 Subject: [PATCH] fix: update radicle-link to properly shutdown Update radicle-link to include https://github.com/radicle-dev/radicle-link/pull/731. Fixes #2133 Signed-off-by: Thomas Scholtes --- .github/workflows/build.yaml | 9 +++--- Cargo.lock | 62 ++++++++++++++++++------------------ proxy/api/Cargo.toml | 6 ++-- proxy/api/src/context.rs | 2 +- proxy/api/src/process.rs | 61 +++++++++++++++++++++-------------- 5 files changed, 77 insertions(+), 63 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0825120c9a..4e47de0c0e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,13 +1,12 @@ name: build on: push: - branches: [master] + branches: ['**'] pull_request: jobs: build-linux: # If this was triggered by a pull request, only run it if it # originates from a fork. - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != 'radicle-dev/radicle-upstream' runs-on: ubuntu-latest container: image: "gcr.io/opensourcecoin/radicle-upstream:0.12.0" @@ -19,9 +18,9 @@ jobs: path: | ~/cache/yarn ~/cache/cypress - key: build-${{ runner.os }}-yarn-v1-${{ hashFiles('yarn.lock') }} + key: build-${{ runner.os }}-yarn-v2-${{ hashFiles('yarn.lock') }} restore-keys: | - build-${{ runner.os }}-yarn-v1- + build-${{ runner.os }}-yarn-v2- - name: Cache Rust uses: actions/cache@v2 with: @@ -29,6 +28,8 @@ jobs: ~/cache/cargo ~/cache/proxy-target key: build-${{ runner.os }}-rust-v1-${{ hashFiles('Cargo.lock') }} + restore-keys: | + build-${{ runner.os }}-rust-v1- - run: ci/run.sh - uses: actions/upload-artifact@v2 if: always() diff --git a/Cargo.lock b/Cargo.lock index f8233c1fd1..c9686f278a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -392,9 +392,9 @@ checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" [[package]] name = "cc" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" +checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" dependencies = [ "jobserver", ] @@ -741,9 +741,9 @@ checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" [[package]] name = "fastrand" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b705829d1e87f762c2df6da140b26af5839e1033aa84aa5f56bb688e4e1bdb" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" dependencies = [ "instant", ] @@ -1452,7 +1452,7 @@ dependencies = [ [[package]] name = "librad" version = "0.1.0" -source = "git+https://github.com/radicle-dev/radicle-link.git?rev=276df21c303653c2fb0faa4ecc423f9ca573600e#276df21c303653c2fb0faa4ecc423f9ca573600e" +source = "git+https://github.com/radicle-dev/radicle-link.git?branch=thomas/daemon-cleanup#e98fc64895a8f6843d2656332cbdc45c2a6d4da5" dependencies = [ "async-stream", "async-trait", @@ -2003,11 +2003,11 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" +checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" dependencies = [ - "pin-project-internal 1.0.7", + "pin-project-internal 1.0.8", ] [[package]] @@ -2023,9 +2023,9 @@ dependencies = [ [[package]] name = "pin-project-internal" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" +checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" dependencies = [ "proc-macro2", "quote", @@ -2220,7 +2220,7 @@ dependencies = [ [[package]] name = "radicle-daemon" version = "0.1.0" -source = "git+https://github.com/radicle-dev/radicle-link.git?rev=276df21c303653c2fb0faa4ecc423f9ca573600e#276df21c303653c2fb0faa4ecc423f9ca573600e" +source = "git+https://github.com/radicle-dev/radicle-link.git?branch=thomas/daemon-cleanup#e98fc64895a8f6843d2656332cbdc45c2a6d4da5" dependencies = [ "anyhow", "async-stream", @@ -2230,7 +2230,6 @@ dependencies = [ "kv", "lazy_static", "librad", - "log", "nonempty 0.6.0", "radicle-git-ext", "radicle-git-helpers", @@ -2238,12 +2237,13 @@ dependencies = [ "serde_millis", "thiserror", "tokio", + "tracing", ] [[package]] name = "radicle-data" version = "0.1.0" -source = "git+https://github.com/radicle-dev/radicle-link.git?rev=276df21c303653c2fb0faa4ecc423f9ca573600e#276df21c303653c2fb0faa4ecc423f9ca573600e" +source = "git+https://github.com/radicle-dev/radicle-link.git?branch=thomas/daemon-cleanup#e98fc64895a8f6843d2656332cbdc45c2a6d4da5" dependencies = [ "minicbor", "nonempty 0.6.0", @@ -2254,7 +2254,7 @@ dependencies = [ [[package]] name = "radicle-git-ext" version = "0.1.0" -source = "git+https://github.com/radicle-dev/radicle-link.git?rev=276df21c303653c2fb0faa4ecc423f9ca573600e#276df21c303653c2fb0faa4ecc423f9ca573600e" +source = "git+https://github.com/radicle-dev/radicle-link.git?branch=thomas/daemon-cleanup#e98fc64895a8f6843d2656332cbdc45c2a6d4da5" dependencies = [ "git2", "minicbor", @@ -2269,7 +2269,7 @@ dependencies = [ [[package]] name = "radicle-git-helpers" version = "0.1.0" -source = "git+https://github.com/radicle-dev/radicle-link.git?rev=276df21c303653c2fb0faa4ecc423f9ca573600e#276df21c303653c2fb0faa4ecc423f9ca573600e" +source = "git+https://github.com/radicle-dev/radicle-link.git?branch=thomas/daemon-cleanup#e98fc64895a8f6843d2656332cbdc45c2a6d4da5" dependencies = [ "anyhow", "git2", @@ -2302,7 +2302,7 @@ dependencies = [ [[package]] name = "radicle-macros" version = "0.1.0" -source = "git+https://github.com/radicle-dev/radicle-link.git?rev=276df21c303653c2fb0faa4ecc423f9ca573600e#276df21c303653c2fb0faa4ecc423f9ca573600e" +source = "git+https://github.com/radicle-dev/radicle-link.git?branch=thomas/daemon-cleanup#e98fc64895a8f6843d2656332cbdc45c2a6d4da5" dependencies = [ "quote", "radicle-git-ext", @@ -2328,7 +2328,7 @@ dependencies = [ [[package]] name = "radicle-std-ext" version = "0.1.0" -source = "git+https://github.com/radicle-dev/radicle-link.git?rev=276df21c303653c2fb0faa4ecc423f9ca573600e#276df21c303653c2fb0faa4ecc423f9ca573600e" +source = "git+https://github.com/radicle-dev/radicle-link.git?branch=thomas/daemon-cleanup#e98fc64895a8f6843d2656332cbdc45c2a6d4da5" [[package]] name = "radicle-surf" @@ -2778,9 +2778,9 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4cfa741c5832d0ef7fab46cabed29c2aae926db0b11bb2069edd8db5e64e16" +checksum = "1a0c8611594e2ab4ebbf06ec7cbbf0a99450b8570e96cbf5188b5d5f6ef18d81" dependencies = [ "block-buffer", "cfg-if 1.0.0", @@ -2968,9 +2968,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" @@ -3128,9 +3128,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +checksum = "4ac2e1d4bd0f75279cfd5a076e0d578bbf02c22b7c39e766c437dd49b3ec43e0" dependencies = [ "tinyvec_macros", ] @@ -3143,9 +3143,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c8b05dc14c75ea83d63dd391100353789f5f24b8b3866542a5e85c8be8e985" +checksum = "c2602b8af3767c285202012822834005f596c811042315fa7e9f5b12b2a43207" dependencies = [ "autocfg", "bytes 1.0.1", @@ -3252,7 +3252,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "pin-project 1.0.7", + "pin-project 1.0.8", "tracing", ] @@ -3309,9 +3309,9 @@ checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "universal-hash" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" dependencies = [ "generic-array", "subtle", @@ -3405,7 +3405,7 @@ dependencies = [ "mime", "mime_guess", "percent-encoding", - "pin-project 1.0.7", + "pin-project 1.0.8", "scoped-tls", "serde", "serde_json", @@ -3606,9 +3606,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "377db0846015f7ae377174787dd452e1c5f5a9050bc6f954911d01f116daa0cd" dependencies = [ "zeroize_derive", ] diff --git a/proxy/api/Cargo.toml b/proxy/api/Cargo.toml index d5aab89d84..77fd2e3f65 100644 --- a/proxy/api/Cargo.toml +++ b/proxy/api/Cargo.toml @@ -46,15 +46,15 @@ warp = { version = "0.3", default-features = false } [dependencies.radicle-daemon] git = "https://github.com/radicle-dev/radicle-link.git" -rev = "276df21c303653c2fb0faa4ecc423f9ca573600e" +branch = "thomas/daemon-cleanup" [dependencies.radicle-git-ext] git = "https://github.com/radicle-dev/radicle-link.git" -rev = "276df21c303653c2fb0faa4ecc423f9ca573600e" +branch = "thomas/daemon-cleanup" [dependencies.radicle-git-helpers] git = "https://github.com/radicle-dev/radicle-link.git" -rev = "276df21c303653c2fb0faa4ecc423f9ca573600e" +branch = "thomas/daemon-cleanup" [dependencies.radicle-avatar] git = "https://github.com/radicle-dev/radicle-avatar.git" diff --git a/proxy/api/src/context.rs b/proxy/api/src/context.rs index 1d2e77a2fc..72191ac6da 100644 --- a/proxy/api/src/context.rs +++ b/proxy/api/src/context.rs @@ -221,7 +221,7 @@ impl Unsealed { let peer_control = coco_peer.control(); let run_handle = async move { - if let Err(err) = coco_peer.run().await { + if let Err(err) = coco_peer.run(futures::future::pending()).await { log::error!("peer run error: {:?}", err); } }; diff --git a/proxy/api/src/process.rs b/proxy/api/src/process.rs index 7656f70be4..e929303a70 100644 --- a/proxy/api/src/process.rs +++ b/proxy/api/src/process.rs @@ -137,10 +137,14 @@ enum RunError { /// Errors when either the peer or the API error. async fn run_rigging( rigging: Rigging, - restart_signal: impl Future + Send + 'static, + restart_signal: impl Future + Send + Sync + 'static, ) -> Result<(), RunError> { - // Required for `tokio::select`. We can’t put it on the element directly, though. - #![allow(clippy::unreachable)] + let (restart_signal_tx, restart_signal_rx) = tokio::sync::oneshot::channel(); + let restart_signal = + futures::future::select(Box::pin(restart_signal), Box::pin(restart_signal_rx)) + .map(|_| {}) + .shared(); + let Rigging { ctx, peer, @@ -151,23 +155,27 @@ async fn run_rigging( let peer_subscriptions = subscriptions.clone(); let server_ctx = ctx.clone(); - let server = async move { - log::info!("starting API"); - let api = http::api(server_ctx.clone(), subscriptions.clone()); - let (_, server) = warp::serve(api).try_bind_with_graceful_shutdown( - server_ctx.http_listen(), - async move { - restart_signal.await; - subscriptions.clear().await; - }, - )?; - - server.await; - Ok(()) + let server = { + let restart_signal = restart_signal.clone(); + + async move { + log::info!("starting API"); + let api = http::api(server_ctx.clone(), subscriptions.clone()); + let (_, server) = warp::serve(api).try_bind_with_graceful_shutdown( + server_ctx.http_listen(), + async move { + restart_signal.await; + subscriptions.clear().await; + }, + )?; + + server.await; + Ok(()) + } }; if let Some(peer) = peer { - let mut tasks = vec![server.boxed()]; + let mut tasks = vec![server.boxed(), restart_signal.clone().map(Ok).boxed()]; if let Some(seeds_sender) = seeds_sender { let mut peer_control = peer.control(); @@ -223,15 +231,20 @@ async fn run_rigging( }; tasks.push(peer_event_task.map(Ok).boxed()); - let peer = async move { - log::info!("starting peer"); - peer.run().await - }; + log::info!("starting peer"); + let peer_run = peer.run(restart_signal.clone()); - tasks.push(peer.map_err(RunError::from).boxed()); + let tasks = futures::future::select_all(tasks); - let (result, _, _) = futures::future::select_all(tasks).await; - result + futures::pin_mut!(peer_run); + match future::select(tasks, peer_run).await { + future::Either::Left(((result, _, _), peer_run)) => { + let _ = restart_signal_tx.send(()); + peer_run.await?; + result + }, + future::Either::Right((result, _tasks)) => result.map_err(RunError::Peer), + } } else { server.await }