Просмотр исходного кода

[xitca-web]remove epoll bench. (#8198)

fakeshadow 2 лет назад
Родитель
Сommit
2dcd0db4ad

+ 21 - 19
frameworks/Rust/xitca-web/Cargo.lock

@@ -425,12 +425,12 @@ dependencies = [
 [[package]]
 name = "mio"
 version = "0.8.6"
-source = "git+https://github.com/fakeshadow/mio.git?rev=4272250caed2f460f7be646d0fd25d53d267eb53#4272250caed2f460f7be646d0fd25d53d267eb53"
+source = "git+https://github.com/fakeshadow/mio.git?rev=2e80aa89ee94a0e2d343331b8df106d7321148b9#2e80aa89ee94a0e2d343331b8df106d7321148b9"
 dependencies = [
  "libc",
  "log",
  "wasi",
- "windows-sys 0.45.0",
+ "windows-sys 0.48.0",
 ]
 
 [[package]]
@@ -707,18 +707,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 
 [[package]]
 name = "serde"
-version = "1.0.160"
+version = "1.0.162"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c"
+checksum = "71b2f6e1ab5c2b98c05f0f35b236b22e8df7ead6ffbf51d7808da7f8817e7ab6"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.160"
+version = "1.0.162"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df"
+checksum = "a2a0814352fd64b58489904a44ea8d90cb1a91dcb6b4f5ebabc32c8318e93cb6"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -971,10 +971,11 @@ dependencies = [
 
 [[package]]
 name = "tracing"
-version = "0.1.38"
+version = "0.1.37"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
 dependencies = [
+ "cfg-if",
  "pin-project-lite",
  "tracing-core",
 ]
@@ -1183,9 +1184,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
 
 [[package]]
 name = "winnow"
-version = "0.4.1"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28"
+checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699"
 dependencies = [
  "memchr",
 ]
@@ -1193,7 +1194,7 @@ dependencies = [
 [[package]]
 name = "xitca-http"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf#5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=024dfaabeacefdeb6b4a76eb4ef48b88b055c738#024dfaabeacefdeb6b4a76eb4ef48b88b055c738"
 dependencies = [
  "futures-core",
  "http",
@@ -1214,17 +1215,18 @@ dependencies = [
 [[package]]
 name = "xitca-io"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf#5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=024dfaabeacefdeb6b4a76eb4ef48b88b055c738#024dfaabeacefdeb6b4a76eb4ef48b88b055c738"
 dependencies = [
  "bytes",
  "tokio",
+ "tokio-uring",
  "xitca-unsafe-collection",
 ]
 
 [[package]]
 name = "xitca-postgres"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf#5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=024dfaabeacefdeb6b4a76eb4ef48b88b055c738#024dfaabeacefdeb6b4a76eb4ef48b88b055c738"
 dependencies = [
  "fallible-iterator",
  "percent-encoding",
@@ -1240,7 +1242,7 @@ dependencies = [
 [[package]]
 name = "xitca-router"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf#5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=024dfaabeacefdeb6b4a76eb4ef48b88b055c738#024dfaabeacefdeb6b4a76eb4ef48b88b055c738"
 dependencies = [
  "xitca-unsafe-collection",
 ]
@@ -1248,7 +1250,7 @@ dependencies = [
 [[package]]
 name = "xitca-server"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf#5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=024dfaabeacefdeb6b4a76eb4ef48b88b055c738#024dfaabeacefdeb6b4a76eb4ef48b88b055c738"
 dependencies = [
  "socket2 0.5.2",
  "tokio",
@@ -1262,12 +1264,12 @@ dependencies = [
 [[package]]
 name = "xitca-service"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf#5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=024dfaabeacefdeb6b4a76eb4ef48b88b055c738#024dfaabeacefdeb6b4a76eb4ef48b88b055c738"
 
 [[package]]
 name = "xitca-unsafe-collection"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf#5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=024dfaabeacefdeb6b4a76eb4ef48b88b055c738#024dfaabeacefdeb6b4a76eb4ef48b88b055c738"
 dependencies = [
  "bytes",
 ]
@@ -1294,13 +1296,13 @@ dependencies = [
  "xitca-server",
  "xitca-service",
  "xitca-unsafe-collection",
- "xitca-web 0.1.0 (git+https://github.com/HFQR/xitca-web.git?rev=5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf)",
+ "xitca-web 0.1.0 (git+https://github.com/HFQR/xitca-web.git?rev=024dfaabeacefdeb6b4a76eb4ef48b88b055c738)",
 ]
 
 [[package]]
 name = "xitca-web"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf#5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=024dfaabeacefdeb6b4a76eb4ef48b88b055c738#024dfaabeacefdeb6b4a76eb4ef48b88b055c738"
 dependencies = [
  "futures-core",
  "pin-project-lite",

+ 10 - 15
frameworks/Rust/xitca-web/Cargo.toml

@@ -18,11 +18,6 @@ name = "xitca-web-iou"
 path = "./src/main_iou.rs"
 required-features = ["io-uring", "pg", "serde", "template"]
 
-[[bin]]
-name = "xitca-web-epoll"
-path = "./src/main_iou.rs"
-required-features = ["pg", "serde", "template"]
-
 [[bin]]
 name = "xitca-web-wasm"
 path = "./src/main_wasm.rs"
@@ -86,13 +81,13 @@ codegen-units = 1
 panic = "abort"
 
 [patch.crates-io]
-xitca-http = { git = "https://github.com/HFQR/xitca-web.git", rev = "5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf" }
-xitca-io = { git = "https://github.com/HFQR/xitca-web.git", rev = "5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf" }
-xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf" }
-xitca-router = { git = "https://github.com/HFQR/xitca-web.git", rev = "5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf" }
-xitca-server = { git = "https://github.com/HFQR/xitca-web.git", rev = "5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf" }
-xitca-service = { git = "https://github.com/HFQR/xitca-web.git", rev = "5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf" }
-xitca-unsafe-collection = { git = "https://github.com/HFQR/xitca-web.git", rev = "5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf" }
-xitca-web = { git = "https://github.com/HFQR/xitca-web.git", rev = "5f5ff12c8c33796c8b76f0f56b3e3dd33f6efdaf" }
-
-mio = { git = "https://github.com/fakeshadow/mio.git", rev = "4272250caed2f460f7be646d0fd25d53d267eb53" }
+xitca-http = { git = "https://github.com/HFQR/xitca-web.git", rev = "024dfaabeacefdeb6b4a76eb4ef48b88b055c738" }
+xitca-io = { git = "https://github.com/HFQR/xitca-web.git", rev = "024dfaabeacefdeb6b4a76eb4ef48b88b055c738" }
+xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "024dfaabeacefdeb6b4a76eb4ef48b88b055c738" }
+xitca-router = { git = "https://github.com/HFQR/xitca-web.git", rev = "024dfaabeacefdeb6b4a76eb4ef48b88b055c738" }
+xitca-server = { git = "https://github.com/HFQR/xitca-web.git", rev = "024dfaabeacefdeb6b4a76eb4ef48b88b055c738" }
+xitca-service = { git = "https://github.com/HFQR/xitca-web.git", rev = "024dfaabeacefdeb6b4a76eb4ef48b88b055c738" }
+xitca-unsafe-collection = { git = "https://github.com/HFQR/xitca-web.git", rev = "024dfaabeacefdeb6b4a76eb4ef48b88b055c738" }
+xitca-web = { git = "https://github.com/HFQR/xitca-web.git", rev = "024dfaabeacefdeb6b4a76eb4ef48b88b055c738" }
+
+mio = { git = "https://github.com/fakeshadow/mio.git", rev = "2e80aa89ee94a0e2d343331b8df106d7321148b9" }

+ 0 - 22
frameworks/Rust/xitca-web/benchmark_config.json

@@ -68,28 +68,6 @@
         "notes": "",
         "versus": ""
       },
-      "epoll": {
-        "json_url": "/json",
-        "plaintext_url": "/plaintext",
-        "db_url": "/db",
-        "fortune_url": "/fortunes",
-        "query_url": "/queries?q=",
-        "update_url": "/updates?q=",
-        "port": 8080,
-        "approach": "Stripped",
-        "classification": "Platform",
-        "database": "Postgres",
-        "framework": "xitca-web",
-        "language": "Rust",
-        "orm": "Raw",
-        "platform": "None",
-        "webserver": "xitca-server",
-        "os": "Linux",
-        "database_os": "Linux",
-        "display_name": "xitca-web [epoll]",
-        "notes": "",
-        "versus": ""
-      },
       "wasm": {
         "json_url": "/json",
         "plaintext_url": "/plaintext",

+ 1 - 1
frameworks/Rust/xitca-web/rust-toolchain.toml

@@ -1,2 +1,2 @@
 [toolchain]
-channel = "nightly-2023-04-25"
+channel = "nightly-2023-05-04"

+ 1 - 0
frameworks/Rust/xitca-web/src/main.rs

@@ -63,6 +63,7 @@ fn main() -> io::Result<()> {
                     .disable_vectored_write()
                     .max_request_headers::<8>(),
             )
+            .io_uring()
         })?
         .build()
         .wait()

+ 40 - 101
frameworks/Rust/xitca-web/src/main_iou.rs

@@ -23,7 +23,7 @@ use std::{
 use futures_util::stream::Stream;
 use xitca_http::{
     body::Once,
-    date::{DateTime, DateTimeService},
+    date::DateTimeService,
     h1::proto::context::Context,
     http::{
         self,
@@ -34,7 +34,8 @@ use xitca_http::{
     util::service::context::{Context as Ctx, ContextBuilder},
 };
 use xitca_io::{
-    bytes::{Buf, Bytes, BytesMut, PagedBytesMut},
+    bytes::{Bytes, BytesMut, PagedBytesMut},
+    io_uring::IoBuf,
     net::TcpStream,
 };
 use xitca_service::{fn_service, middleware::UncheckedReady, Service, ServiceExt};
@@ -126,15 +127,17 @@ where
 {
     type Response = Http1IOUService<S::Response>;
     type Error = S::Error;
-    type Future<'f> = impl Future<Output = Result<Self::Response, Self::Error>> + 'f where Self: 'f, (): 'f ;
+    type Future<'f> = impl Future<Output = Result<Self::Response, Self::Error>> + 'f
+    where
+        Self: 'f,
+        (): 'f;
 
     fn call<'s>(&'s self, _: ()) -> Self::Future<'s>
     where
         (): 's,
     {
         async {
-            let service = self.service.call(()).await?;
-            Ok(Http1IOUService {
+            self.service.call(()).await.map(|service| Http1IOUService {
                 service,
                 date: DateTimeService::new(),
             })
@@ -155,7 +158,10 @@ where
 {
     type Response = ();
     type Error = io::Error;
-    type Future<'f> = impl Future<Output = Result<Self::Response, Self::Error>> + 'f where Self: 'f, TcpStream: 'f ;
+    type Future<'f> = impl Future<Output = Result<Self::Response, Self::Error>> + 'f
+    where
+        Self: 'f,
+        TcpStream: 'f;
 
     fn call<'s>(&'s self, stream: TcpStream) -> Self::Future<'s>
     where
@@ -166,115 +172,48 @@ where
             let mut paged = PagedBytesMut::new();
             let mut write_buf = BytesMut::with_capacity(4096);
 
-            #[cfg(feature = "io-uring")]
-            {
-                use tokio_uring::buf::IoBuf;
-
-                let std = stream.into_std()?;
-                let stream = tokio_uring::net::TcpStream::from_std(std);
-
-                'io: loop {
-                    let mut buf = paged.into_inner();
+            let std = stream.into_std()?;
+            let stream = tokio_uring::net::TcpStream::from_std(std);
 
-                    let len = buf.len();
-                    let rem = buf.capacity() - len;
+            loop {
+                let mut buf = paged.into_inner();
 
-                    if rem < 4096 {
-                        buf.reserve(4096 - rem);
-                    }
-
-                    let (res, buf) = stream.read(buf.slice(len..)).await;
-                    let n = res?;
-                    if n == 0 {
-                        break;
-                    }
-                    paged = PagedBytesMut::from(buf.into_inner());
-
-                    request_handler(&mut ctx, &self.service, &mut paged, &mut write_buf).await;
-
-                    while !write_buf.is_empty() {
-                        let (res, mut w) = stream.write(write_buf).await;
-                        let n = res?;
-                        if n == 0 {
-                            break 'io;
-                        }
-                        w.advance(n);
-                        write_buf = w;
-                    }
+                let len = buf.len();
+                let rem = buf.capacity() - len;
+                if rem < 4096 {
+                    buf.reserve(4096 - rem);
                 }
 
-                stream.shutdown(std::net::Shutdown::Both)
-            }
-
-            #[cfg(not(feature = "io-uring"))]
-            {
-                use xitca_io::{
-                    bytes::BufRead,
-                    io::{AsyncIo, Interest},
-                };
-
-                let mut stream = stream;
-
-                'io: loop {
-                    let interest = if write_buf.is_empty() {
-                        Interest::READABLE
-                    } else {
-                        Interest::READABLE | Interest::WRITABLE
-                    };
-
-                    let ready = stream.ready(interest).await?;
-
-                    if ready.is_readable() {
-                        paged.do_io(&mut stream)?;
-                        request_handler(&mut ctx, &self.service, &mut paged, &mut write_buf).await;
-                    }
-
-                    if ready.is_writable() {
-                        'write: loop {
-                            match io::Write::write(&mut stream, &write_buf) {
-                                Ok(0) => break 'io,
-                                Ok(n) => {
-                                    write_buf.advance(n);
-                                    if write_buf.is_empty() {
-                                        break 'write;
-                                    }
-                                }
-                                Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => break 'write,
-                                Err(e) => return Err(e),
-                            }
-                        }
+                let (res, buf) = stream.read(buf.slice(len..)).await;
+                if res? == 0 {
+                    break;
+                }
+                paged = PagedBytesMut::from(buf.into_inner());
+
+                while let Some((req, _)) = ctx.decode_head::<{ usize::MAX }>(&mut paged).unwrap() {
+                    let (parts, body) = self.service.call(req).await.unwrap().into_parts();
+                    let mut encoder = ctx.encode_head(parts, &body, &mut write_buf).unwrap();
+                    let mut body = pin!(body);
+                    while let Some(chunk) = poll_fn(|cx| body.as_mut().poll_next(cx)).await {
+                        let chunk = chunk.unwrap();
+                        encoder.encode(chunk, &mut write_buf);
                     }
+                    encoder.encode_eof(&mut write_buf);
                 }
 
-                Ok(())
+                let (res, b) = stream.write_all(write_buf).await;
+                res?;
+                write_buf = b;
+                write_buf.clear();
             }
-        }
-    }
-}
 
-async fn request_handler<D, S, const L: usize>(
-    ctx: &mut Context<'_, D, L>,
-    service: &S,
-    paged: &mut PagedBytesMut<4096>,
-    write_buf: &mut BytesMut,
-) where
-    D: DateTime,
-    S: Service<Request, Response = Response>,
-    S::Error: fmt::Debug,
-{
-    while let Some((req, _)) = ctx.decode_head::<{ usize::MAX }>(paged).unwrap() {
-        let (parts, body) = service.call(req).await.unwrap().into_parts();
-        let mut encoder = ctx.encode_head(parts, &body, write_buf).unwrap();
-        let mut body = pin!(body);
-        while let Some(chunk) = poll_fn(|cx| body.as_mut().poll_next(cx)).await {
-            let chunk = chunk.unwrap();
-            encoder.encode(chunk, write_buf);
+            stream.shutdown(std::net::Shutdown::Both)
         }
-        encoder.encode_eof(write_buf);
     }
 }
 
 type Request = http::Request<RequestExt<()>>;
+
 type Response = http::Response<Once<Bytes>>;
 
 struct State {

+ 0 - 10
frameworks/Rust/xitca-web/xitca-web-epoll.dockerfile

@@ -1,10 +0,0 @@
-FROM rust:latest
-
-ADD ./ /xitca-web
-WORKDIR /xitca-web
-
-RUN cargo build --release --bin xitca-web-epoll --features pg,serde,template
-
-EXPOSE 8080
-
-CMD ./target/release/xitca-web-epoll