Browse Source

Upgrade hyperlane (#9701)

* feat: update & fortune

* feat: randomNumber

* feat: max row 500

* feat: update

* feat: Fortune

* feat: fortunes

* feat: update

* feat: update

* feat: update

* feat: update

* feat: fortunes

* feat: fortunes

* feat: fortunes

* feat: fortunes

* feat: fortunes

* feat: fortunes

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: update

* feat: cache

* feat: cache

* feat: config

* feat: config

* feat: config

* feat: v4.36.1

* docs: readme

* feat: remove dyn

* docs: readme

* feat: lock

* feat: lock

* feat: lock

* feat: lock

* feat: db pool

* feat: db pool

* feat: lock

* feat: lock

* feat: db

* feat: db

* feat: db

* feat: db

* feat: db

* feat: db

* feat: db

* feat: db

* feat: rand

* feat: rand

* feat: rand

* feat: rand

* feat: rand

* feat: port

* feat: port

* feat: port

* feat: db

* feat: db

* feat: db

* feat: lock

* feat: lock

* feat: v4.41.0

* feat: v4.42.0

* Merge remote-tracking branch 'upstream/master'

* Merge remote-tracking branch 'upstream/master'

* feat: inline

* feat: dockerfile
尤雨东 4 months ago
parent
commit
7865ccc071

+ 2 - 2
frameworks/Rust/hyperlane/Cargo.toml

@@ -1,7 +1,7 @@
 [package]
 [package]
 name = "hyperlane_techempower"
 name = "hyperlane_techempower"
 version = "0.0.1"
 version = "0.0.1"
-edition = "2021"
+edition = "2024"
 authors = ["ltpp-universe <[email protected]>"] 
 authors = ["ltpp-universe <[email protected]>"] 
 license = "MIT"
 license = "MIT"
 description = """Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication."""
 description = """Hyperlane is a lightweight and high-performance Rust HTTP server library designed to simplify network service development. It supports HTTP request parsing, response building, and TCP communication, making it ideal for building modern web services. Additionally, it provides support for request and response middleware, WebSocket, and Server-Sent Events (SSE), enabling flexible and efficient real-time communication."""
@@ -18,7 +18,7 @@ exclude = [
 ]
 ]
 
 
 [dependencies]
 [dependencies]
-hyperlane = "4.36.1"
+hyperlane = "4.42.1"
 rand = "0.9.0"
 rand = "0.9.0"
 serde = "1.0.219"
 serde = "1.0.219"
 sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] }
 sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres"] }

+ 3 - 1
frameworks/Rust/hyperlane/hyperlane.dockerfile

@@ -1,12 +1,14 @@
 FROM rust:1.85
 FROM rust:1.85
 
 
+RUN apt-get update -yqq && apt-get install -yqq cmake g++ binutils lld
+
 ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world
 ENV POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world
 
 
 ADD ./ /hyperlane_techempower
 ADD ./ /hyperlane_techempower
 WORKDIR /hyperlane_techempower
 WORKDIR /hyperlane_techempower
 
 
 RUN cargo clean
 RUN cargo clean
-RUN RUSTFLAGS="-C target-cpu=native" cargo build --release
+RUN RUSTFLAGS="-C target-cpu=native -C link-arg=-fuse-ld=lld" cargo build --release
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 8 - 14
frameworks/Rust/hyperlane/src/db.rs

@@ -2,20 +2,18 @@ use crate::*;
 
 
 #[inline]
 #[inline]
 pub async fn get_db_connection() -> DbPoolConnection {
 pub async fn get_db_connection() -> DbPoolConnection {
-    if let Some(db_pool) = DB.read().await.clone() {
-        return db_pool;
+    if let Some(db_pool) = DB.get() {
+        return db_pool.clone();
     };
     };
     let db_pool: DbPoolConnection = connection_db().await;
     let db_pool: DbPoolConnection = connection_db().await;
-    {
-        let mut db_pool_lock: RwLockWriteGuard<'_, Option<DbPoolConnection>> = DB.write().await;
-        *db_pool_lock = Some(db_pool.clone());
-    }
+    DB.set(db_pool.clone())
+        .expect("Failed to initialize DB_POOL");
     db_pool
     db_pool
 }
 }
 
 
 #[inline]
 #[inline]
 #[cfg(feature = "dev")]
 #[cfg(feature = "dev")]
-pub async fn create_batabase() {
+pub async fn create_database() {
     let db_pool: DbPoolConnection = get_db_connection().await;
     let db_pool: DbPoolConnection = get_db_connection().await;
     let _ = query(&format!("CREATE DATABASE {};", DATABASE_NAME))
     let _ = query(&format!("CREATE DATABASE {};", DATABASE_NAME))
         .execute(&db_pool)
         .execute(&db_pool)
@@ -97,8 +95,7 @@ pub async fn init_cache() {
             res.push(QueryRow::new(id, random_number));
             res.push(QueryRow::new(id, random_number));
         }
         }
     }
     }
-    let mut cache: RwLockWriteGuard<'_, Vec<QueryRow>> = CACHE.write().await;
-    *cache = res;
+    let _ = CACHE.set(res);
 }
 }
 
 
 #[inline]
 #[inline]
@@ -170,13 +167,10 @@ pub async fn get_update_data(
 
 
 #[inline]
 #[inline]
 pub async fn init_db() {
 pub async fn init_db() {
-    {
-        let mut db_pool_lock: RwLockWriteGuard<'_, Option<DbPoolConnection>> = DB.write().await;
-        *db_pool_lock = Some(connection_db().await);
-    }
+    get_db_connection().await;
     #[cfg(feature = "dev")]
     #[cfg(feature = "dev")]
     {
     {
-        create_batabase().await;
+        create_database().await;
         create_table().await;
         create_table().await;
         insert_records().await;
         insert_records().await;
     }
     }

+ 2 - 3
frameworks/Rust/hyperlane/src/lazy.rs

@@ -1,5 +1,4 @@
 use crate::*;
 use crate::*;
 
 
-pub static DB: Lazy<ArcRwLock<Option<DbPoolConnection>>> =
-    Lazy::new(|| Arc::new(RwLock::new(None)));
-pub static CACHE: Lazy<ArcRwLock<Vec<QueryRow>>> = Lazy::new(|| arc_rwlock(vec![]));
+pub static DB: OnceCell<DbPoolConnection> = OnceCell::new();
+pub static CACHE: OnceCell<Vec<QueryRow>> = OnceCell::new();

+ 4 - 10
frameworks/Rust/hyperlane/src/main.rs

@@ -10,16 +10,9 @@ pub(crate) mod utils;
 
 
 pub(crate) use constant::*;
 pub(crate) use constant::*;
 pub(crate) use db::*;
 pub(crate) use db::*;
-pub(crate) use hyperlane::{
-    once_cell::sync::Lazy,
-    serde::*,
-    serde_json::json,
-    tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard},
-    *,
-};
+pub(crate) use hyperlane::{once_cell::sync::OnceCell, serde::*, serde_json::json, *};
 pub(crate) use lazy::*;
 pub(crate) use lazy::*;
-pub(crate) use r#type::*;
-pub(crate) use rand::{rngs::SmallRng, Rng, SeedableRng};
+pub(crate) use rand::{Rng, SeedableRng, rng, rngs::SmallRng};
 pub(crate) use request_middleware::*;
 pub(crate) use request_middleware::*;
 pub(crate) use response_middleware::*;
 pub(crate) use response_middleware::*;
 pub(crate) use route::*;
 pub(crate) use route::*;
@@ -28,7 +21,8 @@ pub(crate) use sqlx::{
     postgres::{PgPoolOptions, PgRow},
     postgres::{PgPoolOptions, PgRow},
     *,
     *,
 };
 };
-pub(crate) use std::{fmt, sync::Arc};
+pub(crate) use std::fmt;
+pub(crate) use r#type::*;
 pub(crate) use utils::*;
 pub(crate) use utils::*;
 
 
 #[tokio::main]
 #[tokio::main]

+ 1 - 1
frameworks/Rust/hyperlane/src/route.rs

@@ -97,7 +97,7 @@ pub async fn cached_queries(controller_data: ControllerData) {
         .min(ROW_LIMIT as Queries)
         .min(ROW_LIMIT as Queries)
         .max(1);
         .max(1);
     let mut res: Vec<QueryRow> = Vec::with_capacity(count as usize);
     let mut res: Vec<QueryRow> = Vec::with_capacity(count as usize);
-    let cache: RwLockReadGuard<'_, Vec<QueryRow>> = CACHE.read().await;
+    let cache: Vec<QueryRow> = CACHE.get().cloned().unwrap_or_default();
     for i in 0..count {
     for i in 0..count {
         res.push(cache[i as usize].clone());
         res.push(cache[i as usize].clone());
     }
     }

+ 2 - 2
frameworks/Rust/hyperlane/src/server.rs

@@ -9,13 +9,13 @@ pub async fn run_server() {
     server.log_interval_millis(1_000_000_000).await;
     server.log_interval_millis(1_000_000_000).await;
     server.disable_inner_log().await;
     server.disable_inner_log().await;
     server.disable_inner_print().await;
     server.disable_inner_print().await;
-    server.route("/json", json).await;
     server.route("/plaintext", plaintext).await;
     server.route("/plaintext", plaintext).await;
+    server.route("/json", json).await;
+    server.route("/cached-quer", cached_queries).await;
     server.route("/db", db).await;
     server.route("/db", db).await;
     server.route("/query", queries).await;
     server.route("/query", queries).await;
     server.route("/fortunes", fortunes).await;
     server.route("/fortunes", fortunes).await;
     server.route("/upda", updates).await;
     server.route("/upda", updates).await;
-    server.route("/cached-quer", cached_queries).await;
     server.request_middleware(request).await;
     server.request_middleware(request).await;
     server.response_middleware(response).await;
     server.response_middleware(response).await;
     server.listen().await;
     server.listen().await;

+ 5 - 1
frameworks/Rust/hyperlane/src/type.rs

@@ -44,9 +44,13 @@ impl FortunesTemplate {
 }
 }
 
 
 impl fmt::Display for FortunesTemplate {
 impl fmt::Display for FortunesTemplate {
+    #[inline]
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         let fortunes: &Vec<Fortunes> = &self.0;
         let fortunes: &Vec<Fortunes> = &self.0;
-        let _ = write!(f,  "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>");
+        let _ = write!(
+            f,
+            "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>"
+        );
         for tem in fortunes.iter() {
         for tem in fortunes.iter() {
             let row: String = format!(
             let row: String = format!(
                 "<tr><td>{}</td><td>{}</td></tr>",
                 "<tr><td>{}</td><td>{}</td></tr>",

+ 0 - 2
frameworks/Rust/hyperlane/src/utils.rs

@@ -1,5 +1,3 @@
-use rand::rng;
-
 use crate::*;
 use crate::*;
 
 
 #[inline]
 #[inline]

+ 0 - 5
frameworks/Rust/hyperlane/templates/fortune.hbs

@@ -1,5 +0,0 @@
-<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>
-      {{~# each fortunes ~}}
-      <tr><td>{{id}}</td><td>{{message}}</td></tr>
-      {{~/each ~}}
-</table></body></html>