Skip to content

Commit 06fada7

Browse files
authored
[xitca-web] join futures (TechEmpower#8239)
1 parent a09f427 commit 06fada7

File tree

4 files changed

+60
-77
lines changed

4 files changed

+60
-77
lines changed

frameworks/Rust/xitca-web/Cargo.lock

+34-39
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frameworks/Rust/xitca-web/Cargo.toml

+2-5
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ web = ["xitca-web"]
3535
# template optional
3636
template = ["sailfish"]
3737
# io-uring optional
38-
io-uring = ["tokio-uring", "xitca-http/io-uring", "xitca-server/io-uring"]
38+
io-uring = ["xitca-http/io-uring", "xitca-server/io-uring"]
3939

4040
[dependencies]
4141
xitca-http = { version = "0.1", features = ["util-service"] }
@@ -61,9 +61,6 @@ tang-rs = { version = "0.2", optional = true }
6161
serde = { version = "1", optional = true }
6262
serde_json = { version = "1", optional = true }
6363

64-
# io-uring optional
65-
tokio-uring = { version = "0.4", features = ["bytes"], optional = true }
66-
6764
# template optional
6865
sailfish = { version = "0.6", optional = true }
6966

@@ -90,4 +87,4 @@ xitca-service = { git = "https://github.com/HFQR/xitca-web.git", rev = "061a61ad
9087
xitca-unsafe-collection = { git = "https://github.com/HFQR/xitca-web.git", rev = "061a61adc33205a7d7a124cee5665522a3df4d59" }
9188
xitca-web = { git = "https://github.com/HFQR/xitca-web.git", rev = "061a61adc33205a7d7a124cee5665522a3df4d59" }
9289

93-
mio = { git = "https://github.com/fakeshadow/mio.git", rev = "2e80aa89ee94a0e2d343331b8df106d7321148b9" }
90+
mio = { git = "https://github.com/fakeshadow/mio.git", rev = "e506b0d87aa89e06c450a3991c491de35968cb12" }

frameworks/Rust/xitca-web/src/db.rs

+22-31
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{
55
future::{Future, IntoFuture},
66
};
77

8-
use futures_util::stream::{FuturesUnordered, TryStreamExt};
8+
use futures_util::future::{try_join, try_join_all, TryFutureExt};
99
use xitca_postgres::{statement::Statement, AsyncIterator, Postgres};
1010
use xitca_unsafe_collection::no_hash::NoHashBuilder;
1111

@@ -94,46 +94,37 @@ impl Client {
9494

9595
pub fn get_worlds(&self, num: u16) -> impl Future<Output = HandleResult<Vec<World>>> + '_ {
9696
let mut rng = self.rng.borrow_mut();
97-
(0..num)
98-
.map(|_| {
99-
let id = rng.gen_id();
100-
self.query_one_world(id)
101-
})
102-
.collect::<FuturesUnordered<_>>()
103-
.try_collect()
97+
let gets = (0..num).map(|_| self.query_one_world(rng.gen_id()));
98+
try_join_all(gets)
10499
}
105100

106101
pub async fn update(&self, num: u16) -> HandleResult<Vec<World>> {
107-
let worlds = {
102+
let len = num as usize;
103+
104+
let mut params = Vec::new();
105+
params.reserve(len * 3);
106+
107+
let gets = {
108108
let mut rng = self.rng.borrow_mut();
109-
(0..num)
110-
.map(|_| {
111-
let id = rng.gen_id();
112-
let w_id = rng.gen_id();
113-
async move {
114-
self.query_one_world(w_id).await.map(|mut world| {
115-
world.randomnumber = id;
116-
world
117-
})
118-
}
109+
let gets = (0..num).map(|_| {
110+
let w_id = rng.gen_id();
111+
let r_id = rng.gen_id();
112+
params.push(w_id);
113+
params.push(r_id);
114+
self.query_one_world(w_id).map_ok(move |mut world| {
115+
world.randomnumber = r_id;
116+
world
119117
})
120-
.collect::<FuturesUnordered<_>>()
118+
});
119+
try_join_all(gets)
121120
};
122121

123-
let worlds = worlds.try_collect::<Vec<_>>().await?;
124-
125-
let params = worlds
126-
.iter()
127-
.map(|w| [w.id, w.randomnumber])
128-
.flatten()
129-
.chain(worlds.iter().map(|w| w.id))
130-
.collect::<Vec<_>>();
122+
params.extend_from_within(..len);
131123

132124
let st = self.updates.get(&num).unwrap();
125+
let update = self.client.execute_raw(st, &params).map_err(Into::into);
133126

134-
self.client.execute_raw(st, &params).await?;
135-
136-
Ok(worlds)
127+
try_join(gets, update).await.map(|(world, _)| world)
137128
}
138129

139130
pub async fn tell_fortune(&self) -> HandleResult<Fortunes> {

frameworks/Rust/xitca-web/src/main_iou.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use xitca_http::{
3636
use xitca_io::{
3737
bytes::{Bytes, BytesMut},
3838
io_uring::IoBuf,
39-
net::TcpStream,
39+
net::{io_uring::TcpStream as IOUTcpStream, TcpStream},
4040
};
4141
use xitca_service::{fn_service, middleware::UncheckedReady, Service, ServiceExt};
4242

@@ -173,7 +173,7 @@ where
173173
let mut write_buf = BytesMut::with_capacity(4096);
174174

175175
let std = stream.into_std()?;
176-
let stream = tokio_uring::net::TcpStream::from_std(std);
176+
let stream = IOUTcpStream::from_std(std);
177177

178178
loop {
179179
let len = read_buf.len();

0 commit comments

Comments
 (0)