Browse Source

[xitca-web] fix wasi build. (#9225)

* [xitca-web] fix wasi build.

* fix config json.
fakeshadow 11 months ago
parent
commit
8d455d57e1

+ 34 - 26
frameworks/Rust/xitca-web/Cargo.lock

@@ -149,9 +149,12 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
 
 [[package]]
 name = "cc"
-version = "1.1.8"
+version = "1.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "504bdec147f2cc13c8b57ed9401fd8a147cc66b67ad5cb241394244f2c947549"
+checksum = "72db2f7947ecee9b03b510377e8bb9077afa27176fdbff55c51027e976fdcc48"
+dependencies = [
+ "shlex",
+]
 
 [[package]]
 name = "cfg-if"
@@ -161,9 +164,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
 [[package]]
 name = "cpufeatures"
-version = "0.2.12"
+version = "0.2.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad"
 dependencies = [
  "libc",
 ]
@@ -471,9 +474,9 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8"
 
 [[package]]
 name = "libc"
-version = "0.2.155"
+version = "0.2.158"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
+checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
 
 [[package]]
 name = "libmimalloc-sys"
@@ -560,9 +563,8 @@ dependencies = [
 
 [[package]]
 name = "mio"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4"
+version = "1.0.2"
+source = "git+https://github.com/fakeshadow/mio?rev=9bae6012b7ecfc6083350785f71a5e8265358178#9bae6012b7ecfc6083350785f71a5e8265358178"
 dependencies = [
  "hermit-abi",
  "libc",
@@ -847,18 +849,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 
 [[package]]
 name = "serde"
-version = "1.0.205"
+version = "1.0.208"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150"
+checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.205"
+version = "1.0.208"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1"
+checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -867,9 +869,9 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.122"
+version = "1.0.125"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da"
+checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed"
 dependencies = [
  "itoa",
  "memchr",
@@ -910,6 +912,12 @@ dependencies = [
  "digest",
 ]
 
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
 [[package]]
 name = "signal-hook-registry"
 version = "1.4.2"
@@ -979,9 +987,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
 
 [[package]]
 name = "syn"
-version = "2.0.72"
+version = "2.0.75"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af"
+checksum = "f6af063034fc1935ede7be0122941bafa9bacb949334d090b77ca98b5817c7d9"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1017,9 +1025,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.39.2"
+version = "1.39.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1"
+checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5"
 dependencies = [
  "backtrace",
  "libc",
@@ -1079,15 +1087,15 @@ dependencies = [
 
 [[package]]
 name = "tower-layer"
-version = "0.3.2"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
 
 [[package]]
 name = "tower-service"
-version = "0.3.2"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
 
 [[package]]
 name = "tracing"
@@ -1138,9 +1146,9 @@ dependencies = [
 
 [[package]]
 name = "unicode-properties"
-version = "0.1.1"
+version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291"
+checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524"
 
 [[package]]
 name = "vcpkg"
@@ -1311,7 +1319,7 @@ dependencies = [
 [[package]]
 name = "xitca-postgres"
 version = "0.1.0"
-source = "git+https://github.com/HFQR/xitca-web.git?rev=0cad5309beb278dc967378a35b733e26be0d4073#0cad5309beb278dc967378a35b733e26be0d4073"
+source = "git+https://github.com/HFQR/xitca-web.git?rev=f4e7bed#f4e7bedfb441897d1f26a6e4d8cbfada23953269"
 dependencies = [
  "fallible-iterator",
  "percent-encoding",

+ 2 - 1
frameworks/Rust/xitca-web/Cargo.toml

@@ -95,4 +95,5 @@ codegen-units = 1
 panic = "abort"
 
 [patch.crates-io]
-xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "0cad5309beb278dc967378a35b733e26be0d4073" }
+xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "f4e7bed" }
+mio = { git = "https://github.com/fakeshadow/mio", rev = "9bae6012b7ecfc6083350785f71a5e8265358178" }

+ 1 - 2
frameworks/Rust/xitca-web/benchmark_config.json

@@ -62,8 +62,7 @@
         "database_os": "linux",
         "display_name": "xitca-web [wasm]",
         "notes": "",
-        "versus": "",
-        "tags": ["broken"]
+        "versus": ""
       },
       "axum": {
         "json_url": "/json",

+ 47 - 31
frameworks/Rust/xitca-web/src/db.rs

@@ -1,9 +1,9 @@
-use std::{collections::HashMap, fmt::Write};
+use std::fmt::Write;
 
+use xitca_io::bytes::BytesMut;
 use xitca_postgres::{
     pipeline::Pipeline, statement::Statement, AsyncLendingIterator, SharedClient,
 };
-use xitca_unsafe_collection::no_hash::NoHashBuilder;
 
 use super::{
     ser::{Fortune, Fortunes, World},
@@ -13,14 +13,16 @@ use super::{
 pub struct Client {
     client: SharedClient,
     #[cfg(not(feature = "pg-sync"))]
-    rng: std::cell::RefCell<Rand>,
+    shared: std::cell::RefCell<Shared>,
     #[cfg(feature = "pg-sync")]
-    rng: std::sync::Mutex<Rand>,
+    shared: std::sync::Mutex<Shared>,
     fortune: Statement,
     world: Statement,
-    updates: HashMap<u16, Statement, NoHashBuilder>,
+    updates: Box<[Statement]>,
 }
 
+type Shared = (Rand, BytesMut);
+
 pub async fn create() -> HandleResult<Client> {
     let mut client = SharedClient::new(DB_URL.to_string()).await?;
 
@@ -30,7 +32,11 @@ pub async fn create() -> HandleResult<Client> {
         .prepare_cached("SELECT * FROM world WHERE id=$1", &[])
         .await?;
 
-    let mut updates = HashMap::default();
+    let mut updates = Vec::new();
+
+    // a dummy statement as placeholder of 0 index.
+    // avoid off by one calculation when using non zero u16 as slicing index.
+    updates.push(Statement::default());
 
     for num in 1..=500u16 {
         let mut pl = 1;
@@ -49,34 +55,36 @@ pub async fn create() -> HandleResult<Client> {
         q.push(')');
 
         let st = client.prepare_cached(&q, &[]).await?;
-        updates.insert(num, st);
+        updates.push(st);
     }
 
+    let shared = (Rand::default(), BytesMut::new());
+
     Ok(Client {
         client,
         #[cfg(not(feature = "pg-sync"))]
-        rng: std::cell::RefCell::new(Rand::default()),
+        shared: std::cell::RefCell::new(shared),
         #[cfg(feature = "pg-sync")]
-        rng: std::sync::Mutex::new(Rand::default()),
+        shared: std::sync::Mutex::new(shared),
         fortune,
         world,
-        updates,
+        updates: updates.into_boxed_slice(),
     })
 }
 
 impl Client {
     #[cfg(not(feature = "pg-sync"))]
-    fn borrow_rng_mut(&self) -> std::cell::RefMut<'_, Rand> {
-        self.rng.borrow_mut()
+    fn shared(&self) -> std::cell::RefMut<'_, Shared> {
+        self.shared.borrow_mut()
     }
 
     #[cfg(feature = "pg-sync")]
-    fn borrow_rng_mut(&self) -> std::sync::MutexGuard<'_, Rand> {
-        self.rng.lock().unwrap()
+    fn shared(&self) -> std::sync::MutexGuard<'_, Shared> {
+        self.shared.lock().unwrap()
     }
 
     pub async fn get_world(&self) -> HandleResult<World> {
-        let id = self.borrow_rng_mut().gen_id();
+        let id = self.shared().0.gen_id();
         self.client
             .query_raw(&self.world, [id])
             .await?
@@ -87,17 +95,21 @@ impl Client {
     }
 
     pub async fn get_worlds(&self, num: u16) -> HandleResult<Vec<World>> {
-        let mut pipe = Pipeline::new();
+        let len = num as usize;
+
+        let mut res = {
+            let (ref mut rng, ref mut buf) = *self.shared();
+
+            let mut pipe = Pipeline::<_, false>::with_capacity_from_buf(len, buf);
 
-        {
-            let mut rng = self.borrow_rng_mut();
             (0..num).try_for_each(|_| pipe.query_raw(&self.world, [rng.gen_id()]))?;
+
+            self.client.pipeline(pipe)
         }
+        .await?;
 
-        let mut worlds = Vec::new();
-        worlds.reserve(num as usize);
+        let mut worlds = Vec::with_capacity(len);
 
-        let mut res = self.client.pipeline(pipe).await?;
         while let Some(mut item) = res.try_next().await? {
             while let Some(row) = item.try_next().await? {
                 worlds.push(World::new(row.get_raw(0), row.get_raw(1)))
@@ -113,27 +125,31 @@ impl Client {
         let mut params = Vec::new();
         params.reserve(len * 3);
 
-        let mut pipe = Pipeline::new();
+        let mut res = {
+            let (ref mut rng, ref mut buf) = *self.shared();
+
+            let mut pipe = Pipeline::<_, false>::with_capacity_from_buf(len + 1, buf);
 
-        {
-            let mut rng = self.borrow_rng_mut();
             (0..num).try_for_each(|_| {
                 let w_id = rng.gen_id();
                 let r_id = rng.gen_id();
                 params.extend([w_id, r_id]);
                 pipe.query_raw(&self.world, [w_id])
             })?;
-        }
 
-        params.extend_from_within(..len);
-        let st = self.updates.get(&num).unwrap();
-        pipe.query_raw(st, &params)?;
+            params.extend_from_within(..len);
+
+            let st = self.updates.get(len).unwrap();
+            pipe.query_raw(st, &params)?;
+
+            self.client.pipeline(pipe)
+        }
+        .await?;
 
         let mut worlds = Vec::new();
         worlds.reserve(len);
         let mut r_ids = params.into_iter().skip(1).step_by(2);
 
-        let mut res = self.client.pipeline(pipe).await?;
         while let Some(mut item) = res.try_next().await? {
             while let Some(row) = item.try_next().await? {
                 let r_id = r_ids.next().unwrap();
@@ -148,8 +164,8 @@ impl Client {
         let mut items = Vec::with_capacity(32);
         items.push(Fortune::new(0, "Additional fortune added at request time."));
 
-        let mut stream = self.client.query_raw::<[i32; 0]>(&self.fortune, []).await?;
-        while let Some(row) = stream.try_next().await? {
+        let mut res = self.client.query_raw::<[i32; 0]>(&self.fortune, []).await?;
+        while let Some(row) = res.try_next().await? {
             items.push(Fortune::new(row.get_raw(0), row.get_raw::<String>(1)));
         }
         items.sort_by(|it, next| it.message.cmp(&next.message));

+ 3 - 3
frameworks/Rust/xitca-web/src/db_diesel.rs

@@ -16,8 +16,8 @@ pub struct _Pool {
 
 pub fn create() -> std::io::Result<Arc<_Pool>> {
     r2d2::Builder::new()
-        .max_size(256)
-        .min_idle(Some(256))
+        .max_size(100)
+        .min_idle(Some(100))
         .test_on_check_out(false)
         .idle_timeout(None)
         .max_lifetime(None)
@@ -34,7 +34,7 @@ pub fn create() -> std::io::Result<Arc<_Pool>> {
 #[cold]
 #[inline(never)]
 fn not_found() -> Error {
-    format!("world not found").into()
+    "world not found".into()
 }
 
 impl _Pool {

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

@@ -53,7 +53,7 @@ where
 
 async fn plain_text(ctx: Ctx<'_>) -> HandleResult<Response> {
     let (req, _) = ctx.into_parts();
-    let mut res = req.into_response(Bytes::from_static(b"Hello, World!"));
+    let mut res = req.into_response(const { Bytes::from_static(b"Hello, World!") });
     res.headers_mut().insert(CONTENT_TYPE, TEXT);
     Ok(res)
 }

+ 1 - 2
frameworks/Rust/xitca-web/src/main_iou.rs

@@ -57,8 +57,7 @@ async fn handler(ctx: Ctx<'_, Request>) -> Result<Response, Infallible> {
     let (req, state) = ctx.into_parts();
     let mut res = match req.uri().path() {
         "/plaintext" => {
-            const HELLO: Bytes = Bytes::from_static(b"Hello, World!");
-            let mut res = req.into_response(HELLO);
+            let mut res = req.into_response(const { Bytes::from_static(b"Hello, World!") });
             res.headers_mut().insert(CONTENT_TYPE, TEXT);
             res
         }

+ 3 - 4
frameworks/Rust/xitca-web/src/main_sync.rs

@@ -27,6 +27,7 @@ fn main() -> std::io::Result<()> {
         .at_typed(updates)
         .map(header)
         .serve()
+        .disable_vectored_write()
         .bind("0.0.0.0:8080")?
         .run()
         .wait()
@@ -45,10 +46,8 @@ fn db(StateOwn(pool): StateOwn<Pool>) -> HandleResult<Json<impl Serialize>> {
 #[route("/fortunes", method = get)]
 fn fortunes(StateOwn(pool): StateOwn<Pool>) -> HandleResult<Html<String>> {
     use sailfish::TemplateOnce;
-    pool.tell_fortune()?
-        .render_once()
-        .map(Html)
-        .map_err(Into::into)
+    let html = pool.tell_fortune()?.render_once()?;
+    Ok(Html(html))
 }
 
 #[route("/queries", method = get)]

+ 1 - 1
frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile

@@ -1,7 +1,7 @@
 ARG WASMTIME_VERSION=15.0.0
 ARG WASM_TARGET=wasm32-wasip1-threads
 
-FROM rust:1.77 AS compile
+FROM rust:1.79 AS compile
 
 ARG WASMTIME_VERSION
 ARG WASM_TARGET