From 3cf1c548fd4c546fb214dd67e2c63a05441e4412 Mon Sep 17 00:00:00 2001 From: Rob Ede Date: Mon, 29 Mar 2021 06:57:14 +0100 Subject: [PATCH 1/3] prepare actix-rt release 2.2.0 --- actix-rt/CHANGES.md | 95 ++++++++++++-------------------------------- actix-rt/Cargo.toml | 2 +- actix-rt/README.md | 4 +- actix-rt/src/lib.rs | 1 + actix-tls/Cargo.toml | 4 +- 5 files changed, 31 insertions(+), 75 deletions(-) diff --git a/actix-rt/CHANGES.md b/actix-rt/CHANGES.md index 83ecc5ed..459d91a7 100644 --- a/actix-rt/CHANGES.md +++ b/actix-rt/CHANGES.md @@ -1,7 +1,12 @@ # Changes ## Unreleased - 2021-xx-xx -* `ActixStream::{poll_read_ready, poll_write_ready}` would return `Ready` in Ok variant. [#293] + + +## 2.2.0 - 2021-03-29 +* **BREAKING** `ActixStream::{poll_read_ready, poll_write_ready}` methods now return + `Ready` object in ok variant. [#293] + * Breakage is acceptable since `ActixStream` was not intended to be public. [#293] https://github.com/actix/actix-net/pull/293 @@ -67,10 +72,7 @@ ## 2.0.0-beta.1 - 2020-12-28 -### Added * Add `System::attach_to_tokio` method. [#173] - -### Changed * Update `tokio` dependency to `1.0`. [#236] * Rename `time` module `delay_for` to `sleep`, `delay_until` to `sleep_until`, `Delay` to `Sleep` to stay aligned with Tokio's naming. [#236] @@ -78,27 +80,19 @@ * These methods now accept `&self` when calling. [#236] * Remove `'static` lifetime requirement for `System::run` and `Builder::run`. [#236] * `Arbiter::spawn` now panics when `System` is not in scope. [#207] - -### Fixed * Fix work load issue by removing `PENDING` thread local. [#207] [#207]: https://github.com/actix/actix-net/pull/207 [#236]: https://github.com/actix/actix-net/pull/236 -## [1.1.1] - 2020-04-30 - -### Fixed +## 1.1.1 - 2020-04-30 * Fix memory leak due to [#94] (see [#129] for more detail) [#129]: https://github.com/actix/actix-net/issues/129 -## [1.1.0] - 2020-04-08 - -**This version has been yanked.** - -### Added +## 1.1.0 - 2020-04-08 (YANKED) * Expose `System::is_set` to check if current system has ben started [#99] * Add `Arbiter::is_running` to check if event loop is running [#124] * Add `Arbiter::local_join` associated function @@ -108,96 +102,57 @@ [#99]: https://github.com/actix/actix-net/pull/99 [#124]: https://github.com/actix/actix-net/pull/124 -## [1.0.0] - 2019-12-11 +## 1.0.0 - 2019-12-11 * Update dependencies -## [1.0.0-alpha.3] - 2019-12-07 - -### Fixed +## 1.0.0-alpha.3 - 2019-12-07 +* Migrate to tokio 0.2 * Fix compilation on non-unix platforms -### Changed - -* Migrate to tokio 0.2 - - -## [1.0.0-alpha.2] - 2019-12-02 - -Added +## 1.0.0-alpha.2 - 2019-12-02 * Export `main` and `test` attribute macros - * Export `time` module (re-export of tokio-timer) - * Export `net` module (re-export of tokio-net) -## [1.0.0-alpha.1] - 2019-11-22 - -### Changed - +## 1.0.0-alpha.1 - 2019-11-22 * Migrate to std::future and tokio 0.2 -## [0.2.6] - 2019-11-14 - -### Fixed - +## 0.2.6 - 2019-11-14 +* Allow to join arbiter's thread. #60 * Fix arbiter's thread panic message. -### Added - -* Allow to join arbiter's thread. #60 - - -## [0.2.5] - 2019-09-02 - -### Added +## 0.2.5 - 2019-09-02 * Add arbiter specific storage -## [0.2.4] - 2019-07-17 - -### Changed - +## 0.2.4 - 2019-07-17 * Avoid a copy of the Future when initializing the Box. #29 -## [0.2.3] - 2019-06-22 - -### Added - -* Allow to start System using exsiting CurrentThread Handle #22 +## 0.2.3 - 2019-06-22 +* Allow to start System using existing CurrentThread Handle #22 -## [0.2.2] - 2019-03-28 - -### Changed - +## 0.2.2 - 2019-03-28 * Moved `blocking` module to `actix-threadpool` crate -## [0.2.1] - 2019-03-11 - -### Added - +## 0.2.1 - 2019-03-11 * Added `blocking` module - -* Arbiter::exec_fn - execute fn on the arbiter's thread - -* Arbiter::exec - execute fn on the arbiter's thread and wait result +* Added `Arbiter::exec_fn` - execute fn on the arbiter's thread +* Added `Arbiter::exec` - execute fn on the arbiter's thread and wait result -## [0.2.0] - 2019-03-06 - +## 0.2.0 - 2019-03-06 * `run` method returns `io::Result<()>` - * Removed `Handle` -## [0.1.0] - 2018-12-09 - +## 0.1.0 - 2018-12-09 * Initial release diff --git a/actix-rt/Cargo.toml b/actix-rt/Cargo.toml index 126056ec..f4a90d2c 100644 --- a/actix-rt/Cargo.toml +++ b/actix-rt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-rt" -version = "2.1.0" +version = "2.2.0" authors = [ "Nikolay Kim ", "Rob Ede ", diff --git a/actix-rt/README.md b/actix-rt/README.md index f9a3ed31..4ad75f09 100644 --- a/actix-rt/README.md +++ b/actix-rt/README.md @@ -3,11 +3,11 @@ > Tokio-based single-threaded async runtime for the Actix ecosystem. [![crates.io](https://img.shields.io/crates/v/actix-rt?label=latest)](https://crates.io/crates/actix-rt) -[![Documentation](https://docs.rs/actix-rt/badge.svg?version=2.1.0)](https://docs.rs/actix-rt/2.1.0) +[![Documentation](https://docs.rs/actix-rt/badge.svg?version=2.2.0)](https://docs.rs/actix-rt/2.2.0) [![Version](https://img.shields.io/badge/rustc-1.46+-ab6000.svg)](https://blog.rust-lang.org/2020/03/12/Rust-1.46.html) ![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-rt.svg)
-[![dependency status](https://deps.rs/crate/actix-rt/2.1.0/status.svg)](https://deps.rs/crate/actix-rt/2.1.0) +[![dependency status](https://deps.rs/crate/actix-rt/2.2.0/status.svg)](https://deps.rs/crate/actix-rt/2.2.0) ![Download](https://img.shields.io/crates/d/actix-rt.svg) [![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/WghFtEH6Hb) diff --git a/actix-rt/src/lib.rs b/actix-rt/src/lib.rs index afbe8642..4454b3c4 100644 --- a/actix-rt/src/lib.rs +++ b/actix-rt/src/lib.rs @@ -87,6 +87,7 @@ pub mod net { pub use tokio::net::{UnixDatagram, UnixListener, UnixStream}; /// Extension trait over async read+write types that can also signal readiness. + #[doc(hidden)] pub trait ActixStream: AsyncRead + AsyncWrite + Unpin { /// Poll stream and check read readiness of Self. /// diff --git a/actix-tls/Cargo.toml b/actix-tls/Cargo.toml index d14c65ac..40a116b0 100755 --- a/actix-tls/Cargo.toml +++ b/actix-tls/Cargo.toml @@ -41,7 +41,7 @@ uri = ["http"] [dependencies] actix-codec = "0.4.0-beta.1" -actix-rt = { version = "2.1.0", default-features = false } +actix-rt = { version = "2.2.0", default-features = false } actix-service = "2.0.0-beta.5" actix-utils = "3.0.0-beta.2" @@ -63,7 +63,7 @@ webpki-roots = { version = "0.21", optional = true } tokio-native-tls = { version = "0.3", optional = true } [dev-dependencies] -actix-rt = "2.1.0" +actix-rt = "2.2.0" actix-server = "2.0.0-beta.3" bytes = "1" env_logger = "0.8" From 0ee8d032b6ad6c127afb675d58c909741b278c5c Mon Sep 17 00:00:00 2001 From: Rob Ede Date: Mon, 29 Mar 2021 06:57:47 +0100 Subject: [PATCH 2/3] prepare actix-tls release 3.0.0-beta.5 --- actix-tls/CHANGES.md | 3 +++ actix-tls/Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/actix-tls/CHANGES.md b/actix-tls/CHANGES.md index 067c4fe8..28dc612a 100644 --- a/actix-tls/CHANGES.md +++ b/actix-tls/CHANGES.md @@ -1,6 +1,9 @@ # Changes ## Unreleased - 2021-xx-xx + + +## 3.0.0-beta.5 - 2021-03-29 * Changed `connect::ssl::rustls::RustlsConnectorService` to return error when `DNSNameRef` generation failed instead of panic. [#296] * Remove `connect::ssl::openssl::OpensslConnectServiceFactory`. [#297] diff --git a/actix-tls/Cargo.toml b/actix-tls/Cargo.toml index 40a116b0..3f767a28 100755 --- a/actix-tls/Cargo.toml +++ b/actix-tls/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "actix-tls" -version = "3.0.0-beta.4" +version = "3.0.0-beta.5" authors = ["Nikolay Kim "] description = "TLS acceptor and connector services for Actix ecosystem" keywords = ["network", "tls", "ssl", "async", "transport"] From 26a5af70cbad142680d4e0924d3d6623514a3816 Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Mon, 29 Mar 2021 00:19:37 -0700 Subject: [PATCH 3/3] reduce branch in Accept::accept method (#300) --- actix-server/src/accept.rs | 87 ++++++++++++++++++-------------------- actix-server/src/socket.rs | 6 +-- 2 files changed, 45 insertions(+), 48 deletions(-) diff --git a/actix-server/src/accept.rs b/actix-server/src/accept.rs index 8c64ca38..f5484434 100644 --- a/actix-server/src/accept.rs +++ b/actix-server/src/accept.rs @@ -208,17 +208,7 @@ impl Accept { } Some(WakerInterest::Pause) => { drop(guard); - sockets.iter_mut().for_each(|(_, info)| { - match self.deregister(info) { - Ok(_) => info!( - "Paused accepting connections on {}", - info.addr - ), - Err(e) => { - error!("Can not deregister server socket {}", e) - } - } - }); + self.deregister_all(&mut sockets); } Some(WakerInterest::Resume) => { drop(guard); @@ -295,10 +285,18 @@ impl Accept { self.poll.registry().deregister(&mut info.lst) } + fn deregister_logged(&self, info: &mut ServerSocketInfo) { + match self.deregister(info) { + Ok(_) => info!("Paused accepting connections on {}", info.addr), + Err(e) => { + error!("Can not deregister server socket {}", e) + } + } + } + fn deregister_all(&self, sockets: &mut Slab) { sockets.iter_mut().for_each(|(_, info)| { - info!("Accepting connections on {} has been paused", info.addr); - let _ = self.deregister(info); + self.deregister_logged(info); }); } @@ -388,43 +386,42 @@ impl Accept { fn accept(&mut self, sockets: &mut Slab, token: usize) { loop { - let msg = if let Some(info) = sockets.get_mut(token) { - match info.lst.accept() { - Ok(Some((io, addr))) => Conn { + let info = sockets + .get_mut(token) + .expect("ServerSocketInfo is removed from Slab"); + + match info.lst.accept() { + Ok((io, addr)) => { + let msg = Conn { io, token: info.token, peer: Some(addr), - }, - Ok(None) => return, - Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => return, - Err(ref e) if connection_error(e) => continue, - Err(e) => { - // deregister listener temporary - error!("Error accepting connection: {}", e); - if let Err(err) = self.deregister(info) { - error!("Can not deregister server socket {}", err); - } - - // sleep after error. write the timeout to socket info as later - // the poll would need it mark which socket and when it's - // listener should be registered - info.timeout = Some(Instant::now() + Duration::from_millis(500)); - - // after the sleep a Timer interest is sent to Accept Poll - let waker = self.waker.clone(); - System::current().arbiter().spawn(async move { - sleep(Duration::from_millis(510)).await; - waker.wake(WakerInterest::Timer); - }); - - return; - } + }; + self.accept_one(sockets, msg); } - } else { - return; - }; + Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => return, + Err(ref e) if connection_error(e) => continue, + Err(e) => { + error!("Error accepting connection: {}", e); - self.accept_one(sockets, msg); + // deregister listener temporary + self.deregister_logged(info); + + // sleep after error. write the timeout to socket info as later + // the poll would need it mark which socket and when it's + // listener should be registered + info.timeout = Some(Instant::now() + Duration::from_millis(500)); + + // after the sleep a Timer interest is sent to Accept Poll + let waker = self.waker.clone(); + System::current().arbiter().spawn(async move { + sleep(Duration::from_millis(510)).await; + waker.wake(WakerInterest::Timer); + }); + + return; + } + }; } } } diff --git a/actix-server/src/socket.rs b/actix-server/src/socket.rs index 416e253b..baf02cbe 100644 --- a/actix-server/src/socket.rs +++ b/actix-server/src/socket.rs @@ -40,15 +40,15 @@ impl MioListener { } } - pub(crate) fn accept(&self) -> io::Result> { + pub(crate) fn accept(&self) -> io::Result<(MioStream, SocketAddr)> { match *self { MioListener::Tcp(ref lst) => lst .accept() - .map(|(stream, addr)| Some((MioStream::Tcp(stream), SocketAddr::Tcp(addr)))), + .map(|(stream, addr)| (MioStream::Tcp(stream), SocketAddr::Tcp(addr))), #[cfg(unix)] MioListener::Uds(ref lst) => lst .accept() - .map(|(stream, addr)| Some((MioStream::Uds(stream), SocketAddr::Uds(addr)))), + .map(|(stream, addr)| (MioStream::Uds(stream), SocketAddr::Uds(addr))), } } }