-
Notifications
You must be signed in to change notification settings - Fork 290
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
0.5 release prevents going back from Bytes to BytesMut #350
Comments
Are you dropping the If the latter, you can just try to reserve space on it, and if all frozen |
Thanks for the quick reply.
I can structure it either way, but I was originally thinking the latter so that the original buffer size is a hard guarantee (to avoid all allocations).
With a possible exception of the case where the Even if fragmentation or lack of contiguity were not an issue, I think there would be merit in offering an explicit API, if only for a developer's peace of mind? |
ILP-Packet is built using Bytes 0.4. The Futures 0.3 ecosystem's HTTP crates use Bytes 0.5. Porting this crate to use Bytes 0.5 is non-trivial due to significant breaking changes in the Bytes API: tokio-rs/bytes#350 tokio-rs/bytes#288
ILP-Packet is built using Bytes 0.4. The Futures 0.3 ecosystem's HTTP crates use Bytes 0.5. Porting this crate to use Bytes 0.5 is non-trivial due to significant breaking changes in the Bytes API: tokio-rs/bytes#350 tokio-rs/bytes#288
* feat(packet): implement From<Fulfill/Reject> for bytes05::BytesMut ILP-Packet is built using Bytes 0.4. The Futures 0.3 ecosystem's HTTP crates use Bytes 0.5. Porting this crate to use Bytes 0.5 is non-trivial due to significant breaking changes in the Bytes API: tokio-rs/bytes#350 tokio-rs/bytes#288 # Interledger Service: Futures 0.3 Transition (#596) * feat(service): upgrade to futures 0.3 and async/await * feat(service): Box wrapper methods to avoid exponential type blowup Relevant rust-lang issue: rust-lang/rust#68508 * docs(service): add explanation on IlpResult * chore(service): remove unused associated type # Interledger Router: Futures 0.3 Transition (#595) * feat(router): upgrade to futures 0.3 and async/await # Interledger ILDCP: Futures 0.3 Transition (#597) * feat(client): convert client to async/await * docs(ildcp): enhance docs * feat(server): make the service async * test(server): add tests # Interledger CCP: Futures 0.3 Transition (#598) * feat(ccp): convert store traits to async/await * feat(ccp-server): make the ccp server async * test(ccp-server): make tests async * chore(routing-table): limit api visibility of table methods # Interledger BTP: Futures 0.3 Transition (#599) * feat(btp): update traits to be async * refactor(btp/wrapped-ws): refactor WsWrap to a separate file Ideally, we would want to get rid of it by doing a `StreamExt::map_ok` and `SinkExt::with` to map both WebSocket return types to the same value. We also use `filter_map` to get rid of any errors from the WebSocket. The WsError type has been removed as a result of that. * feat(btp/client): port to async/await * feat(btp/server): move to async/await * feat(btp/service): move service to async/await * We refactored the service to be more readable. Basically, we split the websocket in a Sink (write) and a Stream (read). We also create a `tx`/`rx` pair per account. The rx receiver gets attached to the sink, meaning any data sent over by the `tx` sender will get forwarded to the sink, which will forward it to the other end of the websocket. Unfortunately, due to being unable to combine the read and write sockets, we have to spawn them separately. This means that we have to remove the hook which cancels the streams. # Interledger HTTP: Futures 0.3 Transition (#600) * feat(http): Update HttpStore trait to futures 0.3 and deserialize_json method * feat(http): Update HTTP Errors and client * feat(http): Update HTTP Server * docs(http): extend http docs # Interledger Stream: Futures 0.3 Transition (#601) * feat(stream): Update Stream server * feat(stream): Update Stream client * docs(stream): extend stream docs * fix(stream): add extra limits to ensure all the pending request futures are thread safe # Interledger Settlement: Futures 0.3 Transition (#602) * feat(settlement/core): Upgrade types and idempotency * feat(settlement/core): Upgrade engines API Warp interface * feat(settlement/core): Upgrade Redis backend implementation * feat(settlement/api): Upgrade the message service * feat(settlement/api): Upgrade the settlement client * feat(settlement/api): Upgrade the Settlement API exposed by the node * chore(settlement): remove need to pass future wrapped in closure * docs(settlement): extend settlement docs # Interledger SPSP: Futures 0.3 Transition (#603) * feat(spsp): move to futures 0.3 and async/await * docs(spsp): extend spsp docs * fix(spsp): tighten trait bounds to account for stream changes # Interledger Service Util: Futures 0.3 Transition (#604) * feat(service-util): update validator service * feat(service-util): update rate limit service * feat(service-util): update max packet amount service * feat(service-util): update expiry shortener service * feat(service-util): update exchange rate service and providers * feat(service-util): update echo service * feat(service-util): update balance service # Interledger API: Futures 0.3 Transition (#605) * feat(api): update trait definitions and dependencies * feat(api): update http retry client * test(api): migrate test helpers * feat(api): update node-settings route * test(api): update node-settings route tests * feat(api): update accounts route * test(api): update accounts route tests * chore(api): add missing doc # Interledger Store: Futures 0.3 Transition (#606) * feat(store): Update redis reconnect * feat(store): Update base redis struct * feat(store): Update AccountStore trait * feat(store): Update StreamNotificationsStore trait * feat(store): Update BalanceStore trait * feat(store): Update BtpStore trait * feat(store): Update HttpStore trait * feat(store): Update NodeStore trait * feat(store): Update AddressStore trait * feat(store): Update RouteManagerStore trait * feat(store): Update RateLimitStore trait * feat(store): Update IdempotentStore trait * feat(store): Update SettlementStore trait * feat(store): Update LeftoversStore trait * feat(store): Update update_routes * test(store): convert all tests to tokio::test with async/await * feat(store): update secrecy/bytes/zeroize * docs(store): add more docs # ILP CLI: Futures 0.3 Transition (#607) * feat(ilp-cli): update CLI to async/await # ILP Node: Futures 0.3 Transition (#608) (#609) * test(ilp-node): migrate tests to futures 0.3 * feat(ilp-node): move metrics related files to feature-gated module * feat(ilp-node): remove deprecated insert account function * feat(ilp-node): make the node run on async/await * ci(ilp-node): disable some advisories and update README * fix(ilp-node): spawn prometheus filter
I stumbled across this from Tokio AFAICT I'd expect to be able to do something like the following:
I could do Edit: Edit edit: |
@andrewbaxter If the reference count is equal to one (i.e. all other split |
Ah, thanks for the quick reply! Okay, so that usage is idiomatic. I think my confusion arose basically from crate documentation that says Reading deeper into the So this would be the ideal usage for write/read/reuse:
|
Indeed, a single allocation can contain any number of |
Is the (new) inability to roundtrip between
Bytes
andBytesMut
intentional? The inability to do so somewhat diminishes the usefulness of the reference counting feature this crate offers, if it means thatfreeze()
renders a chunk of memory permanently immutable with no way to reclaim borrowed ranges and start over again without reallocating.I understand that
Bytes
is (now) unaware of the existence ofBytesMut
at this time, but it should still be possible to update theBytesMut
api to recover memory whose ref count has reached zero. I was all set to patchBytesMut
to add a version offreeze()
that looked like this:where
Unfreeze
is a struct with a single functionwith
Unfreeze
itself containing a weak reference to the same shared memory used byBytes
instances, but then I discovered thatBytes
doesn't useArc
but rather a custom implementation that does not support weak references.(The reason for having
BytesMut
return anUnfreeze
rather than adding, e.g., anunfreeze()
/try_mut()
method toBytes
is that the latter would requireBytes
keeping track of whether it was instantiated from read-only memory or not, which the current vtable mask isn't capable of distinguishing between.)(My use case involves reading some bytes into a buffer, sending the ref-counted read bytes to another thread for processing, then reclaiming them when an event is set (and the
Bytes
have been dropped) to reuse the buffer for the next cycle.)The text was updated successfully, but these errors were encountered: