work-on-core #50

Merged
christof.schadt merged 27 commits from work-on-core into main 2026-07-14 21:23:53 +02:00
No description provided.
chore: update max PDU size to 256KiB
All checks were successful
CI / build-and-test (push) Successful in 9m40s
42add7ca43
chore: do not parse the full wado-retrieved instance
All checks were successful
CI / build-and-test (push) Successful in 9m25s
b5c173ff32
chore: improve parsing
Some checks failed
CI / build-and-test (push) Has been cancelled
da40c2b3ba
chore: optimize UID parsing
All checks were successful
CI / build-and-test (push) Successful in 9m28s
46d2522cbe
chore: improve byte handling
All checks were successful
CI / build-and-test (push) Successful in 9m22s
5643e2f061
chore: do not drain full Study
All checks were successful
CI / build-and-test (push) Successful in 9m19s
e6f0e08dd1
chore: use a shared http client
All checks were successful
CI / build-and-test (push) Successful in 9m16s
a589135e5b
chore: use reqwest gzip feature
fix: empty query attributes were not forwarded
chore: plan to optimize archive
All checks were successful
CI / build-and-test (push) Successful in 9m13s
2c17182c17
Move the meta-only part parser (wado client) and the Part-10 header
synthesis (stow client) into dicomweb::part10 so the DICOMweb server
side can reuse them (plan-09 change 1).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Parse only the File Meta group of each part and forward the dataset
bytes verbatim instead of decoding and force-re-encoding everything to
Explicit VR LE (which would corrupt compressed pixel data). Study and
Series UIDs now come from the early-terminating token read
(plan-09 change 2).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Synthesize the Part-10 header from the instance identifiers and append
the stored dataset bytes verbatim instead of decoding and re-serializing
every instance (plan-09 change 3).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
execute_cget/execute_cmove gain visitor variants that hand each
instance over as its C-STORE sub-operation arrives, before the
acknowledgement — a slow consumer throttles the PACS via DIMSE flow
control. Backend::Dimse::retrieve returns a bounded channel immediately
instead of collecting the whole transfer (plan-09 change 4).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Peek the first instance to decide 204 vs 200, then stream each
multipart part into the body as it arrives from the backend
(Body::from_stream over the retrieve channel). Time-to-first-byte
drops to one instance; a mid-stream error truncates the body without
the closing delimiter (plan-09 change 5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New BackendTrait::store_batch with per-instance outcomes; the DIMSE
backend negotiates once with the batch's deduplicated (SOP class,
transfer syntax) pairs and sends every instance on that association
instead of opening one per instance (plan-09 change 6).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Feed multer from the axum body stream instead of buffering the whole
request in memory first (plan-09 change 7).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New read_sparse_dataset on dicom-parser's lazy token reader: only the
indexed attributes are materialized, sequence payloads (e.g. RTSTRUCT
contour data) are skipped via seeks, the scan stops before PixelData,
and SpecificCharacterSet is always read so text decoding stays correct.
The archive store path no longer parses whole instances for 38 metadata
columns (plan-10 change 1).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
decode_stored_dataset and the legacy transfer-syntax inference use the
sparse read, so an index rebuild costs the per-file header region
instead of decoding whole instances; full decode remains as a fallback
(plan-10 change 2).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Write files as two writes (shared synthesized header + dataset bytes
verbatim) instead of concatenating the whole instance in memory, and
unwrap on read via a Bytes slice instead of copying the dataset out.
On-disk format unchanged: still self-describing Part-10
(plan-10 change 3).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One SELECT DISTINCT per retrieve scope, so C-MOVE/SEND-RS out of the
archive negotiates the exact stored SOP classes instead of the 89-class
fallback list (plan-10 change 4, closes the plan-08 follow-up).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Batch stores extract metadata and write files per instance, then insert
every index row inside a single SQLite transaction (one WAL commit and
one blocking task per STOW request instead of one per instance); a bad
instance fails only its own outcome (plan-10 change 5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore: keep reconcile micro-benchmark, defer parallel indexing
All checks were successful
CI / build-and-test (push) Successful in 9m12s
c76378ff9f
200 x 1 MiB files reindex in ~99 ms after the sparse-read switch
(~0.5 ms/file), so plan-10 change 6 (parallel reconcile) is not needed;
the ignored benchmark stays for future verification.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chore: make FHIR server more robust
All checks were successful
CI / build-and-test (push) Successful in 9m16s
f3250b534f
chore: fix several minor issues
All checks were successful
CI / build-and-test (push) Successful in 9m14s
7568eacbd1
chore: test HAPI FHIR server via docker
All checks were successful
CI / build-and-test (push) Successful in 9m17s
a879ca04cd
christof.schadt deleted branch work-on-core 2026-07-14 21:23:53 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
IHE-RO-Tooling/dicom-gateway!50
No description provided.