Browse Source

Resolve Axum 0.7 regressions (#9291)

* perf: restore axum [postgresql] performance

* fix: axum plaintext regression

* feat: upgrade to axum 0.7.6
Andrew James 10 months ago
parent
commit
38c565ebaa

+ 12 - 9
frameworks/Rust/axum/Cargo.lock

@@ -121,9 +121,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
 
 
 [[package]]
 [[package]]
 name = "axum"
 name = "axum"
-version = "0.7.5"
+version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf"
+checksum = "8f43644eed690f5374f1af436ecd6aea01cd201f6fbdf0178adaf6907afb2cec"
 dependencies = [
 dependencies = [
  "async-trait",
  "async-trait",
  "axum-core",
  "axum-core",
@@ -147,16 +147,16 @@ dependencies = [
  "serde_urlencoded",
  "serde_urlencoded",
  "sync_wrapper 1.0.1",
  "sync_wrapper 1.0.1",
  "tokio",
  "tokio",
- "tower 0.4.13",
+ "tower 0.5.1",
  "tower-layer",
  "tower-layer",
  "tower-service",
  "tower-service",
 ]
 ]
 
 
 [[package]]
 [[package]]
 name = "axum-core"
 name = "axum-core"
-version = "0.4.3"
+version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3"
+checksum = "5e6b8ba012a258d63c9adfa28b9ddcf66149da6f986c5b5452e629d5ee64bf00"
 dependencies = [
 dependencies = [
  "async-trait",
  "async-trait",
  "bytes",
  "bytes",
@@ -167,7 +167,7 @@ dependencies = [
  "mime",
  "mime",
  "pin-project-lite",
  "pin-project-lite",
  "rustversion",
  "rustversion",
- "sync_wrapper 0.1.2",
+ "sync_wrapper 1.0.1",
  "tower-layer",
  "tower-layer",
  "tower-service",
  "tower-service",
 ]
 ]
@@ -201,7 +201,7 @@ dependencies = [
  "tokio-pg-mapper",
  "tokio-pg-mapper",
  "tokio-pg-mapper-derive",
  "tokio-pg-mapper-derive",
  "tokio-postgres",
  "tokio-postgres",
- "tower 0.5.0",
+ "tower 0.5.1",
  "tower-http",
  "tower-http",
  "yarte",
  "yarte",
 ]
 ]
@@ -1056,6 +1056,8 @@ dependencies = [
  "hyper",
  "hyper",
  "pin-project-lite",
  "pin-project-lite",
  "tokio",
  "tokio",
+ "tower 0.4.13",
+ "tower-service",
 ]
 ]
 
 
 [[package]]
 [[package]]
@@ -2779,14 +2781,15 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "tower"
 name = "tower"
-version = "0.5.0"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36b837f86b25d7c0d7988f00a54e74739be6477f2aac6201b8f429a7569991b7"
+checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f"
 dependencies = [
 dependencies = [
  "futures-core",
  "futures-core",
  "futures-util",
  "futures-util",
  "pin-project-lite",
  "pin-project-lite",
  "sync_wrapper 0.1.2",
  "sync_wrapper 0.1.2",
+ "tokio",
  "tower-layer",
  "tower-layer",
  "tower-service",
  "tower-service",
 ]
 ]

+ 1 - 1
frameworks/Rust/axum/Cargo.toml

@@ -39,7 +39,7 @@ simd-json = [
 ]
 ]
 
 
 [dependencies]
 [dependencies]
-axum = { version = "0.7.5", default-features = false, features = [
+axum = { version = "0.7.6", default-features = false, features = [
     "json",
     "json",
     "query",
     "query",
     "http1",
     "http1",

+ 4 - 2
frameworks/Rust/axum/src/main.rs

@@ -11,11 +11,13 @@ use axum::Json;
 use common::simd_json::Json;
 use common::simd_json::Json;
 
 
 /// Return a plaintext static string.
 /// Return a plaintext static string.
-pub async fn plaintext() -> impl IntoResponse {
-    (StatusCode::OK, "Hello, World!")
+#[inline(always)]
+pub async fn plaintext() -> &'static str {
+    "Hello, World!"
 }
 }
 
 
 /// Return a JSON message.
 /// Return a JSON message.
+#[inline(always)]
 pub async fn json() -> impl IntoResponse {
 pub async fn json() -> impl IntoResponse {
     let message = Message {
     let message = Message {
         message: "Hello, World!",
         message: "Hello, World!",

+ 3 - 19
frameworks/Rust/axum/src/main_mongo.rs

@@ -1,5 +1,6 @@
 mod common;
 mod common;
 mod mongo;
 mod mongo;
+mod server;
 //mod mongo_raw;
 //mod mongo_raw;
 
 
 use std::time::Duration;
 use std::time::Duration;
@@ -24,8 +25,6 @@ use mongodb::{
 use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng};
 use rand::{rngs::SmallRng, thread_rng, Rng, SeedableRng};
 use yarte::Template;
 use yarte::Template;
 
 
-mod server;
-
 use common::{
 use common::{
     get_env,
     get_env,
     utils::{parse_params, Params, Utf8Html},
     utils::{parse_params, Params, Utf8Html},
@@ -117,25 +116,10 @@ async fn fortunes(DatabaseConnection(db): DatabaseConnection) -> impl IntoRespon
 
 
 fn main() {
 fn main() {
     dotenv().ok();
     dotenv().ok();
-
-    let rt = tokio::runtime::Builder::new_current_thread()
-        .enable_all()
-        .build()
-        .unwrap();
-
-    for _ in 1..num_cpus::get() {
-        std::thread::spawn(move || {
-            let rt = tokio::runtime::Builder::new_current_thread()
-                .enable_all()
-                .build()
-                .unwrap();
-            rt.block_on(serve());
-        });
-    }
-    rt.block_on(serve());
+    server::start_tokio(serve_app)
 }
 }
 
 
-async fn serve() {
+async fn serve_app() {
     let database_url: String = get_env("MONGODB_URL");
     let database_url: String = get_env("MONGODB_URL");
     let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE");
     let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE");
     let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE");
     let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE");

+ 2 - 17
frameworks/Rust/axum/src/main_mongo_raw.rs

@@ -86,25 +86,10 @@ async fn updates(
 
 
 fn main() {
 fn main() {
     dotenv().ok();
     dotenv().ok();
-
-    let rt = tokio::runtime::Builder::new_current_thread()
-        .enable_all()
-        .build()
-        .unwrap();
-
-    for _ in 1..num_cpus::get() {
-        std::thread::spawn(move || {
-            let rt = tokio::runtime::Builder::new_current_thread()
-                .enable_all()
-                .build()
-                .unwrap();
-            rt.block_on(serve());
-        });
-    }
-    rt.block_on(serve());
+    server::start_tokio(serve_app)
 }
 }
 
 
-async fn serve() {
+async fn serve_app() {
     let database_url: String = get_env("MONGODB_URL");
     let database_url: String = get_env("MONGODB_URL");
     let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE");
     let max_pool_size: u32 = get_env("MONGODB_MAX_POOL_SIZE");
     let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE");
     let min_pool_size: u32 = get_env("MONGODB_MIN_POOL_SIZE");

+ 4 - 2
frameworks/Rust/axum/src/main_pg.rs

@@ -78,10 +78,12 @@ async fn updates(
     (StatusCode::OK, Json(worlds))
     (StatusCode::OK, Json(worlds))
 }
 }
 
 
-#[tokio::main]
-async fn main() {
+fn main() {
     dotenv().ok();
     dotenv().ok();
+    server::start_tokio(serve_app)
+}
 
 
+async fn serve_app() {
     let database_url: String = get_env("POSTGRES_URL");
     let database_url: String = get_env("POSTGRES_URL");
 
 
     // Create shared database connection
     // Create shared database connection

+ 24 - 0
frameworks/Rust/axum/src/server.rs

@@ -1,4 +1,5 @@
 use std::{
 use std::{
+    future::Future,
     io,
     io,
     net::{Ipv4Addr, SocketAddr, TcpListener},
     net::{Ipv4Addr, SocketAddr, TcpListener},
 };
 };
@@ -104,3 +105,26 @@ pub async fn serve_hyper(app: Router<()>, port: Option<u16>) {
         });
         });
     }
     }
 }
 }
+
+/// Start a single-threaded tokio runtime on multiple threads.
+#[allow(dead_code)]
+pub fn start_tokio<Fut>(f: fn() -> Fut)
+where
+    Fut: Future<Output = ()> + 'static,
+{
+    let rt = tokio::runtime::Builder::new_current_thread()
+        .enable_all()
+        .build()
+        .unwrap();
+
+    for _ in 1..num_cpus::get() {
+        std::thread::spawn(move || {
+            let rt = tokio::runtime::Builder::new_current_thread()
+                .enable_all()
+                .build()
+                .unwrap();
+            rt.block_on(f());
+        });
+    }
+    rt.block_on(f());
+}