Skip to content

test(qwp): cover batched WebSocket sends against a real server - OSS tandem - #8240

Open
jerrinot wants to merge 4 commits into
masterfrom
perf/ws-send-first
Open

jerrinot wants to merge 4 commits into
masterfrom
perf/ws-send-first

Conversation

@jerrinot

@jerrinot jerrinot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Tandem: questdb/java-questdb-client#121, questdb/questdb-enterprise#1396

Merge after questdb/java-questdb-client#121. This PR pins the client PR's branch commit. Once questdb/java-questdb-client#121 is squash-merged, re-point java-questdb-client at the squash commit on the client's main before merging.

  • The QWP server suites now run against a client that batches frames into TCP writes.
  • New end-to-end tests cover per-row flushing, mixed frame sizes, transactions and TLS under batching.
  • An egress test streams one row per frame, so the client parses bursts of frames per recv.
  • Tests pin that ws:: senders accept auto_flush_interval=off and reject auto_flush=off.

The client change groups already-published QWP frames into one TCP write of up to 64 KiB. The bytes on the wire do not change, but the server now receives bursts of frames per read, often ending mid-frame. The data tests give every row a new symbol, so every frame carries a symbol-dictionary delta and a lost, duplicated or reordered frame shows up as a wrong or NULL symbol, not only as a wrong row count.

Points the client submodule at the head of
questdb/java-questdb-client#121. That change groups already-published
QWP frames into one TCP write of up to 64 KiB, sends before polling for
writability, compacts the receive buffer once per recv instead of once
per parsed frame, and accepts auto_flush_interval=off / auto_flush=off
on ws:: senders. Wire bytes are unchanged; only the grouping of frames
into TCP writes changes, so the QWP server suites now run against
batched writes.
The bumped client packs every published frame into one TCP write of up
to 64 KiB, so the server now receives bursts of frames per read, often
ending mid-frame. These tests drive the real client in those shapes:

- QwpSenderBatchedSendE2ETest flushes every row with a new symbol per
  row, fragmented and unfragmented, so each frame carries a dictionary
  delta and a lost or reordered frame shows up as a wrong or NULL
  symbol. It also mixes frames above the 64 KiB batch cap with small
  ones, runs deferred-commit transactions whose frames share writes,
  and pins auto_flush=off and auto_flush_interval=off on ws::.
- QwpWebSocketSenderTlsE2ETest adds the per-row case over wss through
  the TLS proxy.
- QwpEgressSmallFrameBurstTest streams a result one row per frame, so
  the client parses bursts of small frames per recv and keeps a partial
  tail until its next recv.
@coderabbitai

coderabbitai Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).
There may be pipelines that require an authorized user to comment /azp run to run.

Picks up the client commit that rejects auto_flush=off /
disableAutoFlush() on ws:: again, as main does. Only the time-based
trigger can now be turned off on WebSocket, with
auto_flush_interval=off.
The client keeps rejecting auto_flush=off on WebSocket and accepts only
auto_flush_interval=off. The test that published only on flush() and
close() now turns the row and interval triggers off individually, and a
new test pins that auto_flush=off fails at build with the WebSocket
rejection.

This branch has not been deployed

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant