Skip to content

feat(cli): Add standalone --server and --client modes#110

Open
sberg-rh wants to merge 12 commits intomainfrom
feat/standalone-client-server
Open

feat(cli): Add standalone --server and --client modes#110
sberg-rh wants to merge 12 commits intomainfrom
feat/standalone-client-server

Conversation

@sberg-rh
Copy link
Copy Markdown

@sberg-rh sberg-rh commented Mar 26, 2026

Add the ability to run the benchmark server and client as independent processes, enabling cross-environment IPC testing (e.g., host and container).

  • Add --server flag to start a standalone server that listens for client connections using the specified IPC mechanism
  • Add --client flag to connect to a running server and execute the benchmark workload with retry logic (100ms backoff, 30s timeout)
  • Promote --socket-path, --shared-memory-name, and --message-queue-name from hidden internal flags to user-facing under "Standalone Mode"
  • Support both async (Tokio) and blocking (std) execution modes
  • Default transport endpoints work without extra flags for simple usage
  • Add 11 tests for CLI flag parsing and transport config building
  • Update examples and doctest to include new Args fields

Relates to #11

Description

Brief description of changes

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Testing

  • Tests pass locally
  • Added tests for new functionality
  • Updated documentation

Checklist

  • Code follows style guidelines
  • Self-review completed
  • Comments added for complex code
  • Documentation updated
  • No breaking changes (or marked as breaking)

@sberg-rh sberg-rh self-assigned this Mar 26, 2026
@github-actions

This comment was marked as outdated.

@redhat-performance redhat-performance deleted a comment from github-actions bot Mar 26, 2026
Copy link
Copy Markdown
Collaborator

@dustinblack dustinblack left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good first step toward #11. The scope is right — standalone server/client as independent processes without touching transport internals. A few things to think about as this develops:

  1. No integration with existing metrics/reporting. The standalone client does its own ad-hoc stats via info! logging (mean/P50/P95/P99) rather than using ResultsManager/MetricsCollector. This means no streaming output, no JSON/CSV, no integration with the reporting pipeline or dashboard. Fine for an initial draft, but worth planning how to close that gap.

  2. Blocking/async code duplication. The blocking and async server/client paths are nearly identical except for await. Consider whether a shared structure or helper could reduce the duplication — the current pattern will be a maintenance burden as features are added.

  3. Two server modes. --server (new, user-facing) and --internal-run-as-server (existing, hidden) now coexist. The distinction is clear in code but worth documenting so users don't stumble into the internal flag, and so future contributors understand when to use which.

  4. Duration mode not supported. The standalone client only supports message-count mode (-i). If someone passes -d, it will silently fall back to the default message count. Should either support it or reject it with a clear error.

Overall the approach is clean and well-tested. Nice to see 5 integration tests covering round-trip, one-way, ping/pong, retry, and shutdown.

@github-actions

This comment was marked as outdated.

@mcurrier2 mcurrier2 self-requested a review March 31, 2026 17:11
@mcurrier2
Copy link
Copy Markdown
Collaborator

Empty message count panic — If -i 0 or similar produces zero messages, the round-trip percentile computation will panic on an empty vector (latencies[msg_count / 2]). -i 0 can panic in round-trip summary due to divide/index operations on empty latency vectors.
Add explicit validation for msg_count >= 1 in count mode, and robust percentile guards for tiny sample sets.

main.rs:
latencies.sort();
let total: std::time::Duration = latencies.iter().sum();
let mean = total / msg_count as u32;
let p50 = latencies[msg_count / 2];
let p95 = latencies[(msg_count as f64 * 0.95) as usize];
let p99 = latencies[(msg_count as f64 * 0.99) as usize];

Ignored config options — concurrency, send_delay, include_first_message, percentiles, streaming/output_file are all silently ignored. Should either be supported or rejected.

No shutdown message — Client relies on transport close for server to detect disconnect. The internal server path uses explicit MessageType::Shutdown which is more deterministic.

main.rs:
transport.close_blocking()?;
info!("Standalone client finished.");

Duration mode is not honored in standalone client paths:
BenchmarkConfig supports duration by setting msg_count = None, but standalone client code falls back to default count.
main.rs:
let msg_count = config
.msg_count
.unwrap_or(ipc_benchmark::defaults::MSG_COUNT);

When -d 5s is passed, BenchmarkConfig::from_args sets msg_count = None (duration takes precedence). The standalone client then falls back to the default count via unwrap_or. The config.duration field is never read anywhere in the standalone paths. So --client -d 5s -m tcp --blocking silently runs the default message count instead of a 5-second timed test.

Heap allocation per message in measurement loop
main.rs:
for i in 0..msg_count {
let msg = Message::new(i as u64, payload.clone(), MessageType::OneWay);
transport.send_blocking(&msg)?;

payload.clone() allocates a new Vec on every iteration. Per the project's own guidelines ("No allocations in measurement loops"), this adds allocation overhead to every measurement sample. The same pattern appears in the round-trip loop and both async variants. This will skew latency numbers, particularly for small messages where allocation cost is proportionally large.

Standalone client bypasses existing reporting pipeline (ResultsManager/streaming JSON/CSV), unlike established benchmark flows

Test coverage claim mismatch: this branch diff does not add standalone-specific CLI/integration tests; new flags/paths need explicit coverage.

--server / --client flag parsing
--server + --client conflict
build_standalone_transport_config()
Endpoint override defaults (socket_path, shared_memory_name, message_queue_name)
Duration mode in standalone client
connect_blocking_with_retry / connect_async_with_retry
shutdown behavior and retry timeout behavior - shutdown message from client

When I asked to compare against C2C branch:

lacking server-side latency file support
Integration with the full benchmark/results pipeline
--cross-container SHM auto-detection in C2C

@github-actions

This comment was marked as outdated.

@github-actions

This comment was marked as outdated.

…ting

Add the ability to run the benchmark server and client as independent
processes, enabling cross-environment IPC testing (e.g., host and
container). Relates to #11.

Standalone mode features:
- --server flag starts a server that listens for client connections
- --client flag connects to a running server with retry logic
  (100ms backoff, 30s timeout)
- Both async (Tokio) and blocking (std) execution modes supported
- Duration (-d) and message-count (-i) modes both supported
- Default transport endpoints work without extra flags
- Endpoint flags (--socket-path, --shared-memory-name,
  --message-queue-name) promoted to user-facing

Reporting integration:
- Full ResultsManager/MetricsCollector integration for structured
  output (JSON, streaming CSV, console summary with HDR percentiles)
- Server-side one-way latency measurement using monotonic clock
  (accurate for same-host and container scenarios)
- Round-trip latency with per-message streaming support

Code quality:
- Shared helpers: dispatch_server_message(), retry constants
- 25 tests covering CLI parsing, transport config, server dispatch,
  connection retry, shutdown, duration mode, one-way, round-trip
- Explicit MessageType::Shutdown on client disconnect

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@sberg-rh sberg-rh force-pushed the feat/standalone-client-server branch from f382afc to 93bfac7 Compare April 7, 2026 19:00
@github-actions

This comment was marked as outdated.

- Add --send-delay support: inserts a configurable pause after each
  message send (blocking uses thread::sleep, async uses tokio::sleep)
- Add --include-first-message support: when false (default), sends a
  canary message before measurement to warm up the connection, matching
  the existing BenchmarkRunner behavior
- Applied to both one-way and round-trip tests in both blocking and
  async client paths

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

This comment was marked as outdated.

Reuse a single Message struct across loop iterations instead of
calling Message::new() with payload.clone() on every send. The
message id and timestamp are updated in-place before each send.

This removes one Vec<u8> heap allocation per message in the
measurement loop, reducing allocation overhead that can skew
latency results, especially for small messages.

Applied to both one-way and round-trip tests in both blocking
and async client paths.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

This comment was marked as outdated.

Server-side multi-accept:
- TCP and UDS servers now accept multiple concurrent connections,
  spawning a handler thread per client with its own MetricsCollector
- Grace period after first client prevents premature server exit
- SHM and PMQ fall back to single-client mode with a warning
- Server aggregates one-way latency metrics across all handlers

Client-side multi-threaded execution:
- Blocking client spawns N worker threads, each with its own transport
  connection, MetricsCollector, and message loop
- Async client uses tokio::task::JoinSet for concurrent workers
- Results aggregated via MetricsCollector::aggregate_worker_metrics()
- Per-message streaming disabled for concurrent mode (aggregated only)

Transport additions:
- BlockingTcpSocket::from_stream() wraps pre-accepted TcpStream
- BlockingUnixDomainSocket::from_stream() wraps pre-accepted UnixStream

Shared helpers:
- handle_client_connection() -- per-client message dispatch and metrics
- aggregate_and_print_server_metrics() -- shared aggregation logic

Tests:
- test_standalone_concurrent_tcp_round_trip (3 concurrent clients)
- test_handle_client_connection_round_trip (dispatch correctness)
- test_handle_client_connection_one_way_metrics (metrics recording)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

This comment was marked as outdated.

- test_standalone_concurrent_tcp_one_way: multi-accept server with 2
  concurrent one-way clients, verifying server-side metrics recording
- test_tcp_from_stream_send_receive: BlockingTcpSocket::from_stream()
  full send/receive round-trip
- test_uds_from_stream_send_receive: BlockingUnixDomainSocket::from_stream()
  full send/receive round-trip (unix-only)
- test_concurrency_forced_to_one_for_shm: CLI parsing for SHM with
  concurrency > 1
- test_aggregate_and_print_empty_collectors: empty input edge case
- test_aggregate_and_print_single_collector: single collector with data

Total binary tests: 34.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

This comment was marked as outdated.

- Add multi-accept support for async TCP and UDS servers, matching
  the blocking server's concurrency support. Uses tokio::net listeners
  with spawn_blocking for per-client handler threads.
- Remove unused _args parameter from run_standalone_server_async
- Replace inline latency printing in async server with shared
  print_server_one_way_latency helper

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

This comment was marked as outdated.

- Replace all 12 hardcoded test ports (18301-18314) with OS-assigned
  ports via get_free_port() helper (binds to port 0, extracts assigned
  port). Prevents port conflicts in parallel test runs and with other
  processes.
- Extract 2-second multi-accept grace period into
  SERVER_ACCEPT_GRACE_PERIOD constant with documentation explaining
  the behavior and limitation.
- Document the grace period in --server CLI help text so users know
  concurrent clients should connect within 2 seconds of each other.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

This comment was marked as outdated.

sberg-rh and others added 2 commits April 8, 2026 15:49
tokio::net::TcpStream::into_std() leaves the stream in non-blocking
mode (set by tokio for epoll/kqueue). The blocking transport's
read_exact/write_all calls then fail with WouldBlock errors,
causing immediate disconnection.

Fix: call set_nonblocking(false) on streams after into_std() in
both TCP and UDS async multi-accept servers.

Add test_standalone_async_concurrent_tcp_round_trip to exercise
the async multi-accept path (tokio accept + spawn_blocking +
from_stream + handle_client_connection).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- test_standalone_blocking_tcp_one_way: verify server received exact
  message count with correct sequential IDs, add shutdown message
- test_standalone_blocking_tcp_duration_round_trip: verify response
  IDs match requests, assert count > 10 for 200ms test, add shutdown
- test_standalone_blocking_tcp_duration_one_way: verify server received
  exact count with sequential IDs, assert count > 10 for 200ms test
- test_concurrency_forced_to_one_for_shm: test actual concurrency
  forcing logic instead of just CLI parsing
- test_standalone_concurrent_tcp_one_way: assert exact message count
  per handler instead of just "greater than zero"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

This comment was marked as outdated.

1 similar comment
@github-actions

This comment was marked as outdated.

- Clean up garbled doc comment on async concurrent test (editing
  artifacts from multiple rewrites)
- Replace silent panic swallowing in async multi-accept servers:
  try_join_next().transpose() silently dropped JoinErrors from
  panicked handler tasks. Now logs warnings via warn!().
- Extract effective_concurrency() helper to deduplicate the
  concurrency-forcing logic (was copied in blocking client, async
  client, and test). Test now calls the actual helper instead of
  reimplementing the logic inline.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

This comment was marked as outdated.

- test_standalone_large_payload_integrity: 4KB payloads with
  recognizable byte pattern, server echoes back, client verifies
  content byte-for-byte to catch corruption
- test_handle_client_connection_filters_canary: verifies warmup
  canary messages (id=u64::MAX) are excluded from one-way metrics
- test_handle_client_connection_mixed_message_types: interleaved
  OneWay and Request messages on a single connection, verifies
  correct metrics recording and response dispatch
- test_aggregate_and_print_multiple_collectors: aggregation across
  2 collectors with different latency distributions
- test_effective_concurrency_all_mechanisms: covers UDS, PMQ, SHM,
  TCP, and concurrency=1 edge case

Total binary tests: 40.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@github-actions

This comment was marked as outdated.

Accepted TCP/UDS streams inherit non-blocking mode from the
listener (set for the accept poll loop). The handler threads need
blocking mode for the transport's read_exact/write_all operations.

This is the blocking-server equivalent of the async into_std fix
in commit 8723429. Without this fix, standalone server handlers
immediately disconnect from clients.

Applies to both run_standalone_server_blocking_multi_accept_tcp
and _uds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@sberg-rh
Copy link
Copy Markdown
Author

sberg-rh commented Apr 9, 2026

Normal vs Standalone Benchmark Comparison

Manual comparison of benchmark results between normal mode (main branch) and standalone client/server mode (this PR). All tests run locally on the same machine with 1000 warmup iterations.

TCP Round-Trip (10000 msgs, 1024 bytes)

Metric Normal (main) Standalone Diff
Mean 18.93 us 16.92 us -11%
P95 33.70 us 19.71 us -41%
P99 51.81 us 22.25 us -57%
Min 10.92 us 11.75 us +8%
Max 80.58 us 37.33 us -54%
Throughput 50,933 msg/s 59,550 msg/s +17%

UDS Round-Trip (10000 msgs, 1024 bytes)

Metric Normal (main) Standalone Diff
Mean 8.52 us 9.56 us +12%
P95 10.54 us 11.75 us +11%
P99 11.67 us 13.38 us +15%
Min 5.04 us 5.00 us -1%
Max 53.83 us 23.79 us -56%
Throughput 111,590 msg/s 104,240 msg/s -7%

TCP Large Payload Round-Trip (5000 msgs, 8192 bytes)

Metric Normal (main) Standalone Diff
Mean 28.24 us 25.69 us -9%
P95 51.81 us 31.21 us -40%
P99 61.82 us 36.06 us -42%
Throughput 274,100 msg/s 315,530 msg/s +15%

TCP One-Way (10000 msgs, 1024 bytes)

Metric Normal (main) Standalone
Throughput 126,180 msg/s 196,060 msg/s

Note: Standalone one-way reports throughput only on client side; server reports latency separately. Normal mode measures server-side latency via latency file.

Summary

  • Mean latencies are within ~10-15% of each other, which is expected given different process spawning models
  • Standalone mode shows better tail latency (P95/P99) in most cases, likely due to message struct reuse (no per-message heap allocation)
  • Throughput is comparable or better in standalone mode
  • Results confirm standalone mode is a valid alternative for benchmarking within reasonable tolerance

@sberg-rh
Copy link
Copy Markdown
Author

sberg-rh commented Apr 9, 2026

PR Summary

This PR adds standalone --server and --client modes to enable running the benchmark server and client as independent processes, supporting cross-environment IPC testing (container-to-container, container-to-host). Relates to #11.

Features

  • --server / --client CLI flags with mutual exclusivity, under a "Standalone Mode" help heading
  • Multi-accept server for TCP and UDS (one handler thread per client connection)
  • Concurrency support (-c N) with automatic SHM/PMQ fallback to concurrency=1
  • Connection retry with 100ms backoff and 30s timeout
  • Duration (-d) and message-count (-i) modes
  • send_delay, include_first_message, and percentiles options supported
  • Explicit MessageType::Shutdown for deterministic server exit

Reporting

  • Full ResultsManager/MetricsCollector integration: JSON output (-o), streaming CSV/JSON, and console summary with HDR histogram percentiles
  • Server-side one-way latency measurement using shared monotonic clock (accurate for same-host and container scenarios)
  • Per-message heap allocation eliminated in measurement loops

Transport

  • BlockingTcpSocket::from_stream() and BlockingUnixDomainSocket::from_stream() for per-client handler threads in multi-accept servers
  • Fixed non-blocking stream inheritance from listeners in both blocking and async multi-accept paths

Code Quality

  • Shared helpers: dispatch_server_message(), effective_concurrency(), handle_client_connection(), aggregate_and_print_server_metrics(), print_server_one_way_latency()
  • SERVER_ACCEPT_GRACE_PERIOD and CONNECT_RETRY_* constants
  • 40 binary tests covering: round-trip, one-way, ping/pong, duration mode, concurrency, retry, shutdown, large payload integrity, canary filtering, mixed message types, from_stream, metrics aggregation, and async multi-accept
  • OS-assigned test ports via get_free_port() to prevent conflicts

Benchmark Comparison

Normal mode vs standalone mode results are within ~10-15% mean latency tolerance, with standalone often showing better tail latency (see comparison tables in PR comments).

Deferred Items

Two maintainability concerns were raised during review: the standalone logic adding ~2800 lines to src/main.rs (now ~3900 total), and blocking/async client code duplication. These are structural issues, not correctness concerns — the feature works and is well-tested. Extracting into a src/standalone.rs module and reducing client duplication (potentially using the spawn_blocking + shared handler pattern from the server side) would improve navigability, but we felt it was better to land the functional feature and iterate on structure separately rather than gate the PR on a large refactor. Open to discussion if the reviewers prefer to address these before merge.

@sberg-rh sberg-rh marked this pull request as ready for review April 9, 2026 16:56
@sberg-rh sberg-rh requested a review from ewchong April 9, 2026 16:56
@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 9, 2026

📈 Changed lines coverage: 7.30% (71/972)

🚨 Uncovered lines in this PR

  • src/main.rs: 96, 98, 1078-1081, 1084-1087, 1092-1095, 1098-1101, 1105-1107, 1109, 1113-1114, 1116, 1121-1122, 1124, 1138, 1144, 1146, 1150, 1152, 1157, 1163-1165, 1168, 1170-1172, 1174-1177, 1180-1185, 1188-1191, 1196-1198, 1228-1229, 1242, 1250-1253, 1256, 1258-1262, 1265, 1268, 1272, 1274-1275, 1279-1280, 1283-1287, 1291, 1294, 1298-1299, 1301-1305, 1307-1308, 1311-1312, 1314, 1316, 1320-1324, 1326, 1328-1330, 1335-1336, 1339-1340, 1342-1343, 1350, 1358, 1360-1362, 1367, 1371, 1376-1379, 1382-1386, 1390, 1394-1395, 1397-1401, 1403-1404, 1407-1408, 1410, 1412-1417, 1419, 1421-1423, 1428-1429, 1432-1433, 1436-1438, 1458-1465, 1467-1471, 1473-1474, 1478, 1484-1488, 1493-1499, 1501-1505, 1507-1508, 1520, 1525-1527, 1530-1531, 1533, 1538, 1543-1546, 1549, 1551-1553, 1556-1560, 1563-1568, 1571-1574, 1578-1580, 1585-1588, 1597, 1604-1607, 1609, 1611-1614, 1617-1623, 1626-1628, 1630-1631, 1633-1637, 1639-1640, 1643-1644, 1647-1649, 1653, 1658-1660, 1664-1667, 1672-1673, 1676-1677, 1679-1680, 1685, 1692, 1694-1696, 1702, 1707-1710, 1713-1719, 1722-1723, 1725-1726, 1728-1732, 1734-1735, 1738-1739, 1742-1744, 1748, 1752-1754, 1758-1761, 1765-1766, 1769-1770, 1772-1774, 1782-1785, 1788-1791, 1796-1799, 1802-1805, 1808-1810, 1812, 1816-1817, 1820-1824, 1826, 1829-1830, 1833-1836, 1838, 1841-1842, 1845, 1850-1851, 1853, 1856-1858, 1861, 1879, 1896, 1902, 1904, 1906, 1908-1913, 1917-1921, 1927, 1934, 1936-1938, 1940-1943, 1946-1948, 1950-1954, 1957, 1960-1962, 1964, 1966-1969, 1972, 1975-1976, 1979-1981, 1985, 1987-1989, 1993-2000, 2002, 2004, 2006, 2010-2016, 2019, 2022-2023, 2027, 2030, 2034-2036, 2039-2042, 2047, 2049-2050, 2054-2062, 2064, 2066-2070, 2072, 2074-2075, 2077, 2080, 2084-2090, 2092, 2094-2098, 2100, 2102-2103, 2108, 2111-2112, 2115-2116, 2118-2120, 2129, 2139-2142, 2144, 2149, 2152-2162, 2164-2167, 2169-2170, 2172-2174, 2177, 2179-2188, 2190, 2193-2199, 2204-2208, 2213, 2216-2218, 2222, 2224, 2228-2238, 2240-2243, 2245-2247, 2249-2252, 2256, 2258-2270, 2272, 2275-2284, 2289-2293, 2298, 2301-2303, 2307, 2309, 2314-2322, 2325-2327, 2330-2333, 2336-2337, 2339-2340, 2344, 2348, 2351-2355, 2360-2361, 2371, 2377, 2379, 2381, 2383-2387, 2389, 2391-2392, 2397, 2403, 2405-2407, 2409-2412, 2415-2417, 2419-2423, 2426, 2429-2431, 2433, 2435-2438, 2441, 2444-2445, 2448-2450, 2454, 2456-2458, 2462-2469, 2471, 2473, 2475, 2479-2485, 2488, 2491-2492, 2496, 2499, 2503-2505, 2508-2511, 2516, 2518-2519, 2523-2531, 2533, 2535-2539, 2541, 2543-2544, 2546, 2549, 2553-2559, 2561, 2563-2567, 2569, 2571-2572, 2577, 2580-2581, 2584-2585, 2587-2589, 2596, 2606-2609, 2611, 2616, 2619-2628, 2630-2633, 2635-2636, 2638-2640, 2643, 2645-2654, 2656, 2659-2665, 2670-2674, 2678-2680, 2682, 2684, 2688-2697, 2699-2702, 2704-2705, 2707-2710, 2714, 2716-2728, 2730, 2733-2742, 2747-2751, 2755-2757, 2759, 2761, 2766-2774, 2777-2779, 2782-2785, 2788-2789, 2791, 2795

📊 Code Coverage Summary

File Line Coverage Uncovered Lines
src/benchmark.rs 81.15%
(478/589)
75, 78, 89, 93, 102, 105, 107, 124, 394, 399-404, 411-416, 483-486, 591, 675, 681-683, 687-689, 709, 778-780, 785, 806, 811, 829, 935, 939-942, 944, 953-956, 958, 1034, 1065, 1068, 1070-1071, 1080-1081, 1134-1138, 1140, 1223, 1236, 1243, 1252, 1272-1276, 1278, 1374, 1383, 1385-1386, 1389-1390, 1396-1397, 1402-1403, 1405, 1410-1411, 1415-1417, 1422-1423, 1426-1427, 1459, 1517-1520, 1522-1528, 1530, 1533, 1688, 1703
src/benchmark_blocking.rs 74.30%
(318/428)
97, 111, 127, 263, 369, 375-377, 380-382, 402, 434, 488, 587, 600, 614, 644-647, 728-731, 750, 754, 769, 811-813, 816, 819-821, 823, 826, 828-832, 834-835, 843-847, 849-853, 856-857, 861-862, 897, 946, 1025, 1036, 1066, 1069, 1136-1140, 1142, 1197-1200, 1205, 1218, 1221-1224, 1228-1230, 1232, 1234-1235, 1237-1238, 1241, 1243-1247, 1249, 1253-1254, 1256, 1258, 1279, 1291-1295, 1297, 1317-1320
src/cli.rs 92.39%
(85/92)
691, 790, 830, 832, 853-855
src/execution_mode.rs 100.00%
(14/14)
``
src/ipc/mod.rs 65.28%
(47/72)
115, 425, 427-430, 740-741, 756-757, 775-776, 807, 810, 813, 818, 845-846, 860, 862, 882, 884, 1007-1009
src/ipc/posix_message_queue.rs 46.09%
(59/128)
139-140, 213-215, 217, 224, 229, 332-335, 337, 345, 437, 441-442, 446, 449-452, 454-458, 539, 679, 782, 789-790, 807-808, 819-820, 831-832, 849-850, 906, 910-911, 914-919, 921-923, 927, 929-931, 933, 935-937, 941-943, 945-947, 994-995, 1017
src/ipc/posix_message_queue_blocking.rs 81.94%
(127/155)
172, 182, 221, 251-255, 274, 325, 368, 387-390, 416-418, 422-423, 425-426, 436, 455, 457-458, 460-461
src/ipc/shared_memory.rs 69.36%
(163/235)
61, 141, 145, 246-247, 257-258, 262, 390-391, 417-419, 421, 439-441, 443-444, 446-450, 467, 474, 480, 483-484, 488, 492, 496-497, 502-503, 666-667, 670-671, 674, 676, 681-682, 709-710, 713-714, 721-723, 725, 727-732, 734-735, 738-739, 741-745, 752, 782, 784-785, 787, 791
src/ipc/shared_memory_blocking.rs 78.87%
(209/265)
196-198, 200-201, 204-206, 209-210, 212, 217, 219, 223-225, 230, 238-240, 243-245, 248-249, 251, 254, 257-258, 261-262, 266-267, 269, 273-274, 276, 311-312, 378-379, 403-407, 498, 506, 556, 573, 660, 726, 789, 798, 808, 830
src/ipc/shared_memory_direct.rs 83.80%
(150/179)
372-375, 444-451, 455, 482, 506-509, 513-514, 556-557, 569, 598, 605-606, 629-630, 636
src/ipc/tcp_socket.rs 59.43%
(63/106)
31-32, 61, 96, 113-114, 118, 124-125, 129, 136-137, 141, 147-148, 152, 171-172, 175-177, 184-185, 188, 362-363, 366-367, 370-371, 376-377, 422, 429, 447-449, 478, 480-482, 484, 487
src/ipc/tcp_socket_blocking.rs 97.67%
(84/86)
145, 170
src/ipc/unix_domain_socket.rs 59.43%
(63/106)
29-30, 58, 93, 103, 122-123, 127, 133-134, 138, 145-146, 150, 156-157, 161, 180-181, 184-186, 193-194, 197, 346-347, 350-351, 354-355, 360-361, 412-414, 443, 445-447, 449, 452, 468
src/ipc/unix_domain_socket_blocking.rs 94.44%
(102/108)
287-288, 294-296, 298
src/logging.rs 100.00%
(13/13)
``
src/main.rs 16.14%
(211/1307)
87-89, 91, 96, 98, 132-133, 143-147, 151-153, 155-156, 158-159, 179-182, 206-210, 218, 224, 227, 232-235, 240-241, 247, 253, 255-257, 259, 265-266, 272, 277, 280-281, 285, 287-288, 292-293, 295, 301, 305-306, 308-313, 315-316, 319, 328, 331-332, 335, 382-385, 392, 394-398, 401-404, 406-407, 409-410, 412, 414-420, 424, 426-429, 432, 436-438, 442, 444, 447, 451, 456-459, 465-466, 472-473, 479, 481-482, 486, 488, 493-495, 499, 502-503, 505-506, 511, 513-515, 519-520, 522, 529, 534-535, 537-542, 544-545, 549, 558, 561-562, 565, 567, 586, 593, 597-599, 601, 629-630, 638, 671, 717, 721, 724-727, 783-786, 823-824, 831-832, 835, 862-863, 866, 913-914, 918-921, 943, 970, 979, 984, 989-990, 1078-1081, 1084-1087, 1092-1095, 1098-1101, 1105-1107, 1109, 1113-1114, 1116, 1121-1122, 1124, 1138, 1144, 1146, 1150, 1152, 1157, 1163-1165, 1168, 1170-1172, 1174-1177, 1180-1185, 1188-1191, 1196-1199, 1228-1229, 1242, 1250-1253, 1256, 1258-1262, 1265, 1268, 1272, 1274-1275, 1279-1280, 1283-1287, 1291, 1294, 1298-1299, 1301-1305, 1307-1308, 1311-1312, 1314, 1316, 1320-1324, 1326, 1328-1330, 1335-1336, 1339-1340, 1342-1343, 1350, 1358, 1360-1362, 1367, 1371, 1376-1379, 1382-1386, 1390, 1394-1395, 1397-1401, 1403-1404, 1407-1408, 1410, 1412-1417, 1419, 1421-1423, 1428-1429, 1432-1433, 1436-1438, 1458-1465, 1467-1471, 1473-1474, 1478, 1484-1488, 1493-1499, 1501-1505, 1507-1508, 1520, 1525-1527, 1530-1531, 1533, 1538, 1543-1546, 1549, 1551-1553, 1556-1560, 1563-1568, 1571-1574, 1578-1580, 1585-1588, 1597, 1604-1607, 1609, 1611-1614, 1617-1623, 1626-1628, 1630-1631, 1633-1637, 1639-1640, 1643-1644, 1647-1649, 1653, 1658-1660, 1664-1667, 1672-1673, 1676-1677, 1679-1680, 1685, 1692, 1694-1696, 1702, 1707-1710, 1713-1719, 1722-1723, 1725-1726, 1728-1732, 1734-1735, 1738-1739, 1742-1744, 1748, 1752-1754, 1758-1761, 1765-1766, 1769-1770, 1772-1774, 1782-1785, 1788-1791, 1796-1799, 1802-1805, 1808-1810, 1812, 1816-1817, 1820-1824, 1826, 1829-1830, 1833-1836, 1838, 1841-1842, 1845, 1850-1851, 1853, 1856-1858, 1861, 1879, 1896, 1902, 1904, 1906, 1908-1913, 1917-1921, 1927, 1934, 1936-1938, 1940-1943, 1946-1948, 1950-1954, 1957, 1960-1962, 1964, 1966-1969, 1972, 1975-1976, 1979-1981, 1985, 1987-1989, 1993-2000, 2002, 2004, 2006, 2010-2016, 2019, 2022-2023, 2027, 2030, 2034-2036, 2039-2042, 2047, 2049-2050, 2054-2062, 2064, 2066-2070, 2072, 2074-2075, 2077, 2080, 2084-2090, 2092, 2094-2098, 2100, 2102-2103, 2108, 2111-2112, 2115-2116, 2118-2120, 2129, 2139-2142, 2144, 2149, 2152-2162, 2164-2167, 2169-2170, 2172-2174, 2177, 2179-2188, 2190, 2193-2199, 2204-2208, 2213, 2216-2218, 2222, 2224, 2228-2238, 2240-2243, 2245-2247, 2249-2252, 2256, 2258-2270, 2272, 2275-2284, 2289-2293, 2298, 2301-2303, 2307, 2309, 2314-2322, 2325-2327, 2330-2333, 2336-2337, 2339-2340, 2344, 2348, 2351-2355, 2360-2361, 2371, 2377, 2379, 2381, 2383-2387, 2389, 2391-2392, 2397, 2403, 2405-2407, 2409-2412, 2415-2417, 2419-2423, 2426, 2429-2431, 2433, 2435-2438, 2441, 2444-2445, 2448-2450, 2454, 2456-2458, 2462-2469, 2471, 2473, 2475, 2479-2485, 2488, 2491-2492, 2496, 2499, 2503-2505, 2508-2511, 2516, 2518-2519, 2523-2531, 2533, 2535-2539, 2541, 2543-2544, 2546, 2549, 2553-2559, 2561, 2563-2567, 2569, 2571-2572, 2577, 2580-2581, 2584-2585, 2587-2589, 2596, 2606-2609, 2611, 2616, 2619-2628, 2630-2633, 2635-2636, 2638-2640, 2643, 2645-2654, 2656, 2659-2665, 2670-2674, 2678-2680, 2682, 2684, 2688-2697, 2699-2702, 2704-2705, 2707-2710, 2714, 2716-2728, 2730, 2733-2742, 2747-2751, 2755-2757, 2759, 2761, 2766-2774, 2777-2779, 2782-2785, 2788-2789, 2791, 2795
src/metrics.rs 83.51%
(157/188)
455-460, 493-494, 552, 558, 579-582, 732-734, 736, 768, 788, 833, 838, 881, 904, 952, 980, 984, 1005, 1007-1008, 1013
src/results.rs 56.92%
(255/448)
717, 726-728, 730-731, 734-735, 738, 760, 763-764, 767, 769, 772, 776-781, 791-792, 795-800, 817, 829-830, 832, 834, 837-838, 840, 844, 871, 895-897, 900-901, 905-907, 910, 936, 941, 946, 952, 971, 973-974, 976, 978-982, 984, 986-987, 1021, 1062-1063, 1066, 1072-1073, 1077, 1081-1083, 1085-1086, 1110-1114, 1117-1120, 1123-1130, 1140-1141, 1160-1161, 1163-1167, 1169, 1186-1187, 1189-1194, 1196, 1214, 1216-1221, 1239, 1242, 1258-1259, 1274-1276, 1278-1280, 1282-1283, 1285-1286, 1288-1289, 1291, 1293-1294, 1296-1299, 1301-1303, 1305-1307, 1310, 1314-1315, 1323-1328, 1330-1331, 1335-1336, 1340-1342, 1344, 1348-1349, 1358-1361, 1365-1367, 1371, 1373, 1376, 1381-1382, 1387, 1394-1398, 1400, 1598-1599, 1819-1820, 1822-1823, 1828
src/results_blocking.rs 95.48%
(296/310)
489-490, 492-493, 544, 769, 774, 779, 815, 818-819, 827-828, 886
src/utils.rs 70.73%
(29/41)
71, 143, 147-149, 153, 159, 198-202
Total 60.02%
(2923/4870)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants