Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,6 @@ jobs:
- name: Pack ioxide.pg
run: dotnet pack src/clients/ioxide.pg/ioxide.pg.csproj --configuration Release --no-build --output ./artifacts

- name: Pack ioxide.redis
run: dotnet pack src/clients/ioxide.redis/ioxide.redis.csproj --configuration Release --no-build --output ./artifacts

- name: Pack ioxide.timer
run: dotnet pack src/clients/ioxide.timer/ioxide.timer.csproj --configuration Release --no-build --output ./artifacts

Expand Down
19 changes: 0 additions & 19 deletions Playground/Clients/Redis/Playground.Clients.Redis.csproj

This file was deleted.

238 changes: 0 additions & 238 deletions Playground/Clients/Redis/Program.cs

This file was deleted.

6 changes: 3 additions & 3 deletions Playground/Http3/Nghttp3Buffered/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
//
// BUFFERED: dispatch waits for end-of-stream, so the whole body is already in request.Body when
// your handler runs - no BodyReader, no pacing - and the handler may still await (a PgPool query,
// Redis, anything ioxide-native resumes inline on the reactor).
// anything ioxide-native resumes inline on the reactor).
//
// The trade: memory holds the entire body, so this suits normal-sized requests. Use Playground/Http3/Nghttp3Request
// when uploads can be large or hostile.
Expand Down Expand Up @@ -149,8 +149,8 @@
{
// Dispatch waited for end-of-stream, so the body is ALREADY here: request.Body is
// complete and request.Body.Length is just a property read. No BodyReader, no pacing.
// This overload is synchronous, but the awaiting one exists too - a PgPool query or a
// Redis command resumes inline on this reactor, so you can await it right here.
// This overload is synchronous, but the awaiting one exists too - a PgPool query
// resumes inline on this reactor, so you can await it right here.
_ = request.Body.Length;

// One response object, reused for every request: zero allocations on this path. To
Expand Down
1 change: 0 additions & 1 deletion Playground/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,6 @@ reference implementation. QUIC itself is always ngtcp2 + picotls, bundled as one
| [`Clients.Quic`](Clients/Quic/Program.cs) | 166 | The client half of QUIC, and the thing that drives `Quic/Raw`. No listener of any kind. | `ioxide.ngtcp2` |
| [`Clients.File`](Clients/File/Program.cs) | 422 | A static file server: every file opened ONCE, descriptors shared across reactors, read positionally off the ring. | `ioxide.file` |
| [`Clients.Pg`](Clients/Pg/Program.cs) | 224 | A Postgres-backed server, whole: a pool per reactor, connect/query/row streaming all ring operations. | `ioxide.pg` |
| [`Clients.Redis`](Clients/Redis/Program.cs) | 236 | A `RedisPool` per reactor; concurrent requests share connections and pipeline automatically. | `ioxide.redis` |
| [`Clients.Timer`](Clients/Timer/Program.cs) | 184 | A deadline that stays on the ring: `GET /<ms>` answers after that long, one `IORING_OP_TIMEOUT` per wait. A knob swaps in `Task.Delay` to price the difference. | `ioxide.timer` |
| [`Proxy.H1ToH1`](Proxy/H1ToH1/Program.cs) | 259 | A reverse proxy with TLS on BOTH hops - ioxide TLS in, `TlsClientContext` out. Read this one first. | `ioxide.httpclient` |
| [`Proxy.H2ToH1`](Proxy/H2ToH1/Program.cs) | 233 | The classic edge: h2 over TLS in (browsers refuse h2c), h1 origin behind. | `ioxide.http2`, `ioxide.httpclient` |
Expand Down
9 changes: 0 additions & 9 deletions Playground/Shared/Env.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,15 +147,6 @@ public static void OverridePg(ref string host, ref ushort pgPort, ref string use
commandTimeoutMs = Int("PLAYGROUND_PG_TIMEOUT", commandTimeoutMs);
}

/// <summary>The Redis sample's connection settings.</summary>
public static void OverrideRedis(ref string host, ref ushort redisPort, ref string? password, ref int poolSize)
{
host = Str("PLAYGROUND_REDIS_HOST", host);
redisPort = Port("PLAYGROUND_REDIS_PORT", redisPort);
password = StrOrNull("PLAYGROUND_REDIS_PASSWORD") ?? password;
poolSize = Int("PLAYGROUND_REDIS_POOL", poolSize);
}

/// <summary>Where a proxy sample forwards to, and how it trusts the origin.</summary>
public static void OverrideUpstream(ref string host, ref ushort upstreamPort, ref string serverName,
ref int poolSize, ref string? caFile, ref bool insecure)
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ accepted the request.
| --- | --- |
| [`ioxide.httpclient`](https://www.nuget.org/packages/ioxide.httpclient/) | The HTTP/1.1 upstream leg between a proxy and an origin, with client-side TLS and mutual TLS for `https://`. |
| [`ioxide.pg`](https://www.nuget.org/packages/ioxide.pg/) | Postgres. Connect, query and stream rows on the owning ring. |
| [`ioxide.redis`](https://www.nuget.org/packages/ioxide.redis/) | Redis. RESP2, pipelining, pub/sub. |
| [`ioxide.file`](https://www.nuget.org/packages/ioxide.file/) | Static assets. Immutable snapshots, baked responses, positional ring reads. |
| [`ioxide.timer`](https://www.nuget.org/packages/ioxide.timer/) | Deadlines. A wait is one `IORING_OP_TIMEOUT` on the caller's own ring - no timer thread, nothing allocated per wait. |

Expand Down
13 changes: 2 additions & 11 deletions bench/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
# Servers run 4 reactors (BENCH_REACTORS to override); the tcp-raw/tcp-pipe pair repeats at 12
# reactors as the io_uring baseline. Loads: wrk for everything TCP (fixed -c 64 -t 4,
# time-bounded), h2load built with HTTP/3 for the HTTP/3 server (H2LOAD_H3 to point at it), Bench.Clients for the
# ring-native clients. Sidecars (redis, postgres, an h2c nginx) start via docker when available;
# ring-native clients. Sidecars (postgres, an h2c nginx) start via docker when available;
# anything missing skips with a note instead of failing the run.
#
# Numbers are hardware-specific: compare runs on one machine, never across machines.
Expand Down Expand Up @@ -126,16 +126,8 @@ else
note "client-h2" "${R}r" "SKIP (docker unavailable for the h2c upstream)"
fi

# ── redis / pg / file ───────────────────────────────────────────────────────────────────────
# ── pg / file ───────────────────────────────────────────────────────────────────────
if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
docker rm -f bench-redis >/dev/null 2>&1
docker run -d --name bench-redis --network host redis:7-alpine >/dev/null 2>&1
sleep 2
play Clients/Redis PLAYGROUND_REACTORS=$R PLAYGROUND_PORT=18085 \
&& note "redis" "${R}r" "$(wrk_h1 http://127.0.0.1:18085/) req/s"
stop_play
docker rm -f bench-redis >/dev/null 2>&1

docker rm -f bench-pg >/dev/null 2>&1
docker run -d --name bench-pg --network host \
-e POSTGRES_USER=bench -e POSTGRES_PASSWORD=bench -e POSTGRES_DB=bench \
Expand All @@ -146,7 +138,6 @@ if command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1; then
stop_play
docker rm -f bench-pg >/dev/null 2>&1
else
note "redis" "${R}r" "SKIP (docker unavailable)"
note "pg" "${R}r" "SKIP (docker unavailable)"
fi

Expand Down
1 change: 0 additions & 1 deletion bench/samples.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@ Quic/Raw echo 8443 / - -
# upstream clients and static files
Clients/File h1 8080 /f.bin - PLAYGROUND_DIR=/tmp/ioxide-bench-assets
Clients/Pg h1 8080 / - -
Clients/Redis h1 8080 / - -
Clients/Http h1 8090 / Tcp/Raw -
Clients/Https h1 8080 / Tls/OpenSsl PLAYGROUND_UPSTREAM_CA=/tmp/ioxide-playground-quic/quic.crt
Clients/Timer h1 8080 / - PLAYGROUND_DELAY_MS=0
Expand Down
Loading
Loading