<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/open-source-maintenance-2026-07-18-ndvwfhhya" -->

---
title: Open Source Maintenance, 2026-07-18 | daily.dev
description: A live open source maintenance stream where a Rust crate maintainer works through GitHub notifications, reviews PRs, and fixes bugs across several crates. The...
canonical: https://daily.dev/posts/open-source-maintenance-2026-07-18-ndvwfhhya
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Open Source Maintenance, 2026-07-18 | daily.dev
og:description: A live open source maintenance stream where a Rust crate maintainer works through GitHub notifications, reviews PRs, and fixes bugs across several crates. The...
og:url: https://daily.dev/posts/open-source-maintenance-2026-07-18-ndvwfhhya
og:image: https://api.daily.dev/og/posts/nDvWfhHYA.png
og:image:alt: Open Source Maintenance, 2026-07-18
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Open Source Maintenance, 2026-07-18

**[Jon Gjengset](https://daily.dev/sources/jonhoo)** · 298 min read · 5 upvotes · 0 comments

## Summary

A live open source maintenance stream where a Rust crate maintainer works through GitHub notifications, reviews PRs, and fixes bugs across several crates. The main focus is on the left-right concurrency primitive crate, where a data race in WriteHandle drop is identified and fixed — specifically a bug where newly added read handles with an epoch counter of zero could be skipped during the wait loop, allowing the drop to proceed while readers were still active. A second bug is also fixed where re-entrant ReadHandle::enter could hit an unreachable! panic when the WriteHandle was concurrently dropped. Both fixes are landed with new test cases and released as version 0.11.8. The stream also briefly covers an unsafe memory initialization bug in the HDR histogram crate.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://www.youtube.com/watch?v=bAINppA0BSU>

## Questions this post answers

### Why does dropping a right handle in the left-right crate sometimes cause a data race detected by thread sanitizer?

A new read handle added after a publish call could have its epoch counter default to zero, which is treated as even (idle), causing the drop logic's wait loop to skip waiting for that reader even though it might already hold a guard. The fix re-reads all epoch counters after swapping the pointer to null, ensuring the wait actually blocks until every reader, including newly added ones, has observed the null swap.

_Developers tracking down concurrency bugs in lock-free data structures can find related fixes and discussions on daily.dev._

### How does the HDR histogram library compute multiple percentiles or quantiles in a single pass efficiently?

Instead of scanning all histogram bins separately for each requested percentile, a batch API sorts the input targets and walks the bins once, using a chunked skip-scan that sums fixed-size groups of eight bins with SIMD-friendly reduction and only inspects individual bins in the chunk where a target count is crossed. This avoids the O(n) rescans of calling value_at_percentile repeatedly and requires bumping the minimum supported Rust version to 1.88 for the array chunking API.

_Anyone optimizing histogram or metrics code can compare batching approaches like this one via daily.dev._

### What is the tradeoff between a sans-io implementation and a traditional IO-coupled implementation for a protocol library like IMAP?

A sans-io design makes the entire protocol state machine and parsers generic over IO, so callers supply their own read/write implementations for TCP, TLS, or async runtimes, buying flexibility across IO models at the cost of more buffering, more allocations, and a more complex internal implementation, since the state machine can't write directly to a concrete transport and must stage data until IO is available. The end-user-facing API can still stay simple by wrapping the sans-io core in a synchronous or async client.

_Developers weighing sans-io versus direct-IO protocol designs can dig into tradeoffs like these on daily.dev._

## Similar posts on daily.dev

- [This Week in Rust 641 · This Week in Rust](https://daily.dev/posts/this-week-in-rust-641-this-week-in-rust-cpi7nq9uo) · This Week in Rust · 3 upvotes · 0 comments
- [Changelog \#331](https://daily.dev/posts/changelog-331-8oxqmswlw) · rust-analyzer · 0 upvotes · 0 comments
- [Announcing Rust 1.94.1](https://daily.dev/posts/announcing-rust-1-94-1-r8kl7pl4j) · Rust · 4 upvotes · 0 comments

---

Tags: [#open-source](https://daily.dev/tags/open-source), [#rust](https://daily.dev/tags/rust)

[View this post on daily.dev](https://daily.dev/posts/open-source-maintenance-2026-07-18-ndvwfhhya)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Open Source Maintenance, 2026-07-18","url":"https://daily.dev/posts/open-source-maintenance-2026-07-18-ndvwfhhya","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/open-source-maintenance-2026-07-18-ndvwfhhya"},"datePublished":"2026-07-19T08:51:58.223Z","dateModified":"2026-10-15T02:22:23.979Z","description":"A live open source maintenance stream where a Rust crate maintainer works through GitHub notifications, reviews PRs, and fixes bugs across several crates. The...","image":"https://i.ytimg.com/vi/bAINppA0BSU/sddefault.jpg","thumbnailUrl":"https://i.ytimg.com/vi/bAINppA0BSU/sddefault.jpg","isAccessibleForFree":true,"articleSection":"Jon Gjengset","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Jon Gjengset","logo":"https://media.daily.dev/image/upload/s--c533xAvL--/f_auto,q_auto/v1780213716/logos/jonhoo?_a=BAMAMiWQ0","url":"https://daily.dev/sources/jonhoo"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/open-source-maintenance-2026-07-18-ndvwfhhya","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":5},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"open-source,rust","timeRequired":"PT298M","video":{"@type":"VideoObject","name":"Open Source Maintenance, 2026-07-18","description":"A live open source maintenance stream where a Rust crate maintainer works through GitHub notifications, reviews PRs, and fixes bugs across several crates. The...","thumbnailUrl":"https://i.ytimg.com/vi/bAINppA0BSU/sddefault.jpg","uploadDate":"2026-07-19T08:51:58.223Z","duration":"PT298M","url":"https://api.daily.dev/r/nDvWfhHYA","embedUrl":"https://www.youtube.com/embed/bAINppA0BSU"}}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Jon Gjengset","item":"https://daily.dev/sources/jonhoo"},{"@type":"ListItem","position":3,"name":"Open Source Maintenance, 2026-07-18"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/open-source-maintenance-2026-07-18-ndvwfhhya#faq","mainEntity":[{"@type":"Question","name":"Why does dropping a right handle in the left-right crate sometimes cause a data race detected by thread sanitizer?","acceptedAnswer":{"@type":"Answer","text":"A new read handle added after a publish call could have its epoch counter default to zero, which is treated as even (idle), causing the drop logic's wait loop to skip waiting for that reader even though it might already hold a guard. The fix re-reads all epoch counters after swapping the pointer to null, ensuring the wait actually blocks until every reader, including newly added ones, has observed the null swap. Developers tracking down concurrency bugs in lock-free data structures can find related fixes and discussions on daily.dev."}},{"@type":"Question","name":"How does the HDR histogram library compute multiple percentiles or quantiles in a single pass efficiently?","acceptedAnswer":{"@type":"Answer","text":"Instead of scanning all histogram bins separately for each requested percentile, a batch API sorts the input targets and walks the bins once, using a chunked skip-scan that sums fixed-size groups of eight bins with SIMD-friendly reduction and only inspects individual bins in the chunk where a target count is crossed. This avoids the O(n) rescans of calling value_at_percentile repeatedly and requires bumping the minimum supported Rust version to 1.88 for the array chunking API. Anyone optimizing histogram or metrics code can compare batching approaches like this one via daily.dev."}},{"@type":"Question","name":"What is the tradeoff between a sans-io implementation and a traditional IO-coupled implementation for a protocol library like IMAP?","acceptedAnswer":{"@type":"Answer","text":"A sans-io design makes the entire protocol state machine and parsers generic over IO, so callers supply their own read/write implementations for TCP, TLS, or async runtimes, buying flexibility across IO models at the cost of more buffering, more allocations, and a more complex internal implementation, since the state machine can't write directly to a concrete transport and must stage data until IO is available. The end-user-facing API can still stay simple by wrapping the sans-io core in a synchronous or async client. Developers weighing sans-io versus direct-IO protocol designs can dig into tradeoffs like these on daily.dev."}}]}
```

