Skip to content

Commit 10e73ea

Browse files
authored
fix(volo-grpc): use concat to get the entire encoded result from linkedbytes (#628)
* chore(volo): add test coverage workflow * fix(volo-grpc): use linkedbytes concat to get the full encoded results * perf(volo-grpc): yield each node as a separate frame to avoid copy * chore(volo-grpc): update version and cargo clippy * fix(volo-grpc): the start of prefix is always 0 because we use new buffer for each item * chore(volo): calculate the coverage of multiple features for each crate * chore: remove unused files
1 parent 83f989c commit 10e73ea

File tree

8 files changed

+326
-37
lines changed

8 files changed

+326
-37
lines changed

.github/codecov.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
coverage:
2+
status:
3+
project:
4+
default:
5+
informational: true
6+
patch:
7+
default:
8+
target: 70%
9+
threshold: 0%
10+
informational: false

.github/workflows/ci.yaml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,42 @@ jobs:
144144
- name: Cli tests
145145
run: |
146146
bash scripts/volo-cli-test.sh
147+
coverage:
148+
runs-on: [self-hosted, Linux, amd64]
149+
timeout-minutes: 40
150+
permissions:
151+
contents: read
152+
checks: write
153+
pull-requests: write
154+
steps:
155+
- uses: actions/checkout@v4
156+
- uses: dtolnay/rust-toolchain@nightly
157+
158+
with:
159+
components: rustfmt, clippy
160+
- uses: taiki-e/install-action@v2
161+
162+
with:
163+
tool: cargo-llvm-cov
164+
- uses: taiki-e/install-action@v2
165+
with:
166+
tool: cargo-nextest
167+
168+
169+
- name: Generate coverage (LCOV + HTML)
170+
run: |
171+
bash scripts/coverage.sh
172+
173+
- uses: actions/upload-artifact@v4
174+
with:
175+
name: coverage-html
176+
path: target/llvm-cov/html
177+
178+
179+
- name: Upload to Codecov
180+
uses: codecov/codecov-action@v4
181+
182+
with:
183+
files: lcov.info
184+
fail_ci_if_error: true
185+
verbose: true

Cargo.lock

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/Cargo.toml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,12 @@ volo = { path = "../volo" }
153153
volo-grpc = { path = "../volo-grpc", features = ["grpc-web"] }
154154
volo-thrift = { path = "../volo-thrift", features = ["multiplex"] }
155155
volo-http = { path = "../volo-http", features = [
156-
"client", "server",
157-
"json", "query", "form", "cookie",
156+
"client",
157+
"server",
158+
"json",
159+
"query",
160+
"form",
161+
"cookie",
158162
"http1",
159163
] }
160164

scripts/coverage.sh

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#!/bin/bash
2+
3+
set -o errexit
4+
set -o nounset
5+
set -o pipefail
6+
7+
IGNORE_REGEX='(^|[\\/])(benches|tests?|examples|target|gen|test_data)([\\/])|(^|[\\/])build\\.rs$|(^|[\\/])\\.cargo[\\/]registry'
8+
9+
run_nextest() {
10+
local package="$1"
11+
local features="${2:-}"
12+
local no_tests_behavior="${NO_TESTS_BEHAVIOR:-pass}"
13+
if [ -n "$features" ]; then
14+
cargo llvm-cov nextest -p "$package" --features "$features" --all-targets --no-report \
15+
--no-tests="$no_tests_behavior" \
16+
--ignore-filename-regex "$IGNORE_REGEX"
17+
else
18+
cargo llvm-cov nextest -p "$package" --all-targets --no-report \
19+
--no-tests="$no_tests_behavior" \
20+
--ignore-filename-regex "$IGNORE_REGEX"
21+
fi
22+
}
23+
24+
report_all() {
25+
cargo llvm-cov report --lcov --output-path lcov.info \
26+
--ignore-filename-regex "$IGNORE_REGEX"
27+
cargo llvm-cov report --html \
28+
--ignore-filename-regex "$IGNORE_REGEX"
29+
}
30+
31+
main() {
32+
# 1. clean up previous coverage data
33+
cargo llvm-cov clean --workspace || true
34+
35+
# 2.run tests with coverage, align with scripts/clippy-and-test.sh
36+
run_nextest volo-thrift
37+
run_nextest volo-grpc 'rustls'
38+
run_nextest volo-http 'client,server,http1,query,form,json,tls,cookie,multipart,ws'
39+
run_nextest volo-http 'client,server,http2,query,form,json,tls,cookie,multipart,ws'
40+
run_nextest volo-http 'full'
41+
run_nextest volo 'rustls'
42+
run_nextest volo-build
43+
run_nextest volo-cli
44+
45+
# 3.generate coverage report
46+
report_all
47+
}
48+
49+
main "$@"
50+
51+

volo-grpc/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "volo-grpc"
3-
version = "0.11.7"
3+
version = "0.11.8"
44
edition.workspace = true
55
homepage.workspace = true
66
repository.workspace = true
@@ -53,6 +53,7 @@ hyper-util = { workspace = true, features = [
5353
"server",
5454
"http2",
5555
] }
56+
linkedbytes.workspace = true
5657
matchit.workspace = true
5758
paste.workspace = true
5859
percent-encoding.workspace = true

volo-grpc/src/codec/compression.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ use flate2::bufread::{GzDecoder, GzEncoder};
1212
#[cfg(feature = "zlib")]
1313
use flate2::bufread::{ZlibDecoder, ZlibEncoder};
1414
use http::HeaderValue;
15-
use pilota::LinkedBytes;
1615

1716
use super::BUFFER_SIZE;
1817
#[cfg(feature = "compress")]
@@ -274,23 +273,23 @@ impl CompressionEncoding {
274273
/// Compress `len` bytes from `src_buf` into `dest_buf`.
275274
pub(crate) fn compress(
276275
encoding: CompressionEncoding,
277-
src_buf: &mut LinkedBytes,
278-
dest_buf: &mut LinkedBytes,
276+
src_buf: &mut BytesMut,
277+
dest_buf: &mut BytesMut,
279278
) -> Result<(), io::Error> {
280-
let len = src_buf.bytes().len();
279+
let len = src_buf.len();
281280
let capacity = ((len / BUFFER_SIZE) + 1) * BUFFER_SIZE;
282281

283282
dest_buf.reserve(capacity);
284283

285284
match encoding {
286285
#[cfg(feature = "gzip")]
287286
CompressionEncoding::Gzip(Some(config)) => {
288-
let mut gz_encoder = GzEncoder::new(&src_buf.bytes()[0..len], config.level);
287+
let mut gz_encoder = GzEncoder::new(&src_buf[0..len], config.level);
289288
io::copy(&mut gz_encoder, &mut dest_buf.writer())?;
290289
}
291290
#[cfg(feature = "zlib")]
292291
CompressionEncoding::Zlib(Some(config)) => {
293-
let mut zlib_encoder = ZlibEncoder::new(&src_buf.bytes()[0..len], config.level);
292+
let mut zlib_encoder = ZlibEncoder::new(&src_buf[0..len], config.level);
294293
io::copy(&mut zlib_encoder, &mut dest_buf.writer())?;
295294
}
296295
#[cfg(feature = "zstd")]
@@ -302,13 +301,13 @@ pub(crate) fn compress(
302301
level as i32
303302
};
304303
let mut zstd_encoder = zstd::Encoder::new(dest_buf.writer(), zstd_level)?;
305-
io::copy(&mut &src_buf.bytes()[0..len], &mut zstd_encoder)?;
304+
io::copy(&mut &src_buf[0..len], &mut zstd_encoder)?;
306305
zstd_encoder.finish()?;
307306
}
308307
_ => {}
309308
};
310309

311-
src_buf.bytes_mut().advance(len);
310+
src_buf.advance(len);
312311
Ok(())
313312
}
314313

@@ -349,8 +348,7 @@ pub(crate) fn decompress(
349348

350349
#[cfg(test)]
351350
mod tests {
352-
use bytes::BufMut;
353-
use pilota::LinkedBytes;
351+
use bytes::BytesMut;
354352

355353
#[cfg(feature = "gzip")]
356354
use crate::codec::compression::GzipConfig;
@@ -367,11 +365,11 @@ mod tests {
367365

368366
#[test]
369367
fn test_consistency_for_compression() {
370-
let mut src = LinkedBytes::with_capacity(BUFFER_SIZE);
371-
let mut compress_buf = LinkedBytes::new();
372-
let mut de_data = LinkedBytes::with_capacity(BUFFER_SIZE);
368+
let mut src = BytesMut::with_capacity(BUFFER_SIZE);
369+
let mut compress_buf = BytesMut::new();
370+
let mut de_data = BytesMut::with_capacity(BUFFER_SIZE);
373371
let test_data = &b"test compression"[..];
374-
src.put(test_data);
372+
src.extend_from_slice(test_data);
375373

376374
let encodings = [
377375
#[cfg(feature = "gzip")]
@@ -390,11 +388,10 @@ mod tests {
390388
];
391389

392390
for encoding in encodings {
393-
compress_buf.reset();
391+
compress_buf.clear();
394392
compress(encoding, &mut src, &mut compress_buf).expect("compress failed:");
395-
decompress(encoding, compress_buf.bytes_mut(), de_data.bytes_mut())
396-
.expect("decompress failed:");
397-
assert_eq!(test_data, de_data.bytes());
393+
decompress(encoding, &mut compress_buf, &mut de_data).expect("decompress failed:");
394+
assert_eq!(test_data, de_data.as_ref());
398395
}
399396
}
400397
}

0 commit comments

Comments
 (0)