Dynoxide 1.5.0 release notes
Dynoxide 1.5.0 is out, two days after 1.4.0. The vector fixes came out of Parity Suite, and I wrote up the billing change earlier today, so this one's just the list.
The crate moves to dynoxide-rs 3.2.0. Everything else you install is 1.5.0.
Behaviour changes
- A read of a table with a vector index is charged on the billed size. DynamoDB now bills a vector at 4 bytes per dimension on reads as well as writes, so an item whose numbers take it over a 4KB boundary costs a unit less. That covers
GetItem,BatchGetItem,TransactGetItems,Query,Scanand PartiQL reads. A read from a secondary index and the 400KB item limit still use the stored size (#264). GetItemandTransactGetItemscharge for the whole item, whatever the projection returns, asBatchGetItemand DynamoDB already did.- Stream
SequenceNumbers are 21 digits, within DynamoDB's range of 21 to 40. Records already in a database file show in the same form. GetShardIteratorvalidatesSequenceNumber.AT_SEQUENCE_NUMBERandAFTER_SEQUENCE_NUMBERrefuse a missing, wrong-length or unknown number with aValidationException, where they used to read from the start.TRIM_HORIZONandLATESTrefuse one rather than ignoring it.- An import with
record_streamsrecords aMODIFYwith the old image when it overwrites a key, asPutItemdoes. It used to record anINSERT(#265). http-serverandmcp-serverno longer turn oncli. A library embedding the HTTP server withnative-sqlitecompiles 22 fewer crates. If you build the binary from an explicit feature list, addcli. If you relied on Dynoxide to enabletracing-subscriber'senv-filter, enable it yourself.
Fixed
- A stream record's
eventIDis globally unique. It was the sequence number, so an in-memory server issued1,2,3again after every restart, and a consumer that skips eventIDs it has seen dropped new events. New records get a random 32-character hex ID, stored with the record so every read returns the same one. Existing records keep theirs (#258). - Imported stream records go to the shard
DescribeStreamlists and follow the table'sStreamViewType(#260). SearchVectorserrors match DynamoDB's search endpoint for null members, null or empty values, wrong and unknown types, and the order things are checked in (#263, #266, #267).
Security
tokio1.54.1 for RUSTSEC-2026-0386, a possible use-after-free inAsyncFd. Dynoxide doesn't useAsyncFd, but tokio is built into the binary and the server features, so the fix goes out with this release.ctutils0.4.5 for RUSTSEC-2026-0385. It only reaches Dynoxide through a test dependency, so nothing shipped was affected.
Before upgrading
- Short sequence numbers from earlier builds fail validation, so a stream consumer holding one has to restart from
TRIM_HORIZON. - Downgrading replays the stream. A sequence number saved under 1.5.0 doesn't resolve on an earlier release, and records written under 1.5.0 report different eventIDs there, so anything de-duplicating on eventID processes them again.
dynoxide-rs = "3.2"picks up the crate. For an npm project,npm install --save-dev dynoxide@1.5.0pins this release.
The 1.5.0 release notes have everything else.