#prog #rust #article
Why I built wrkflw
Why I built wrkflw
If you have spent enough time around CI, you probably know the loop. Change one line in a workflow. Push. Wait for the runner. Watch the job fail for a reason that has nothing to do with the line you changed. Push again. A few rounds later, the real feature is tiny and your git history is mostly you arguing with YAML in public. wrkflw started because I wanted that whole loop to happen on my laptop instead of on GitHub's servers, and preferably without leaving a trail of embarrassing commits behind.
Two years and more edge cases than I expected later, it has turned into a Cargo workspace with sixteen crates. It validates and runs GitHub Actions workflows locally, has a TUI, a proper expression evaluator, four runtime modes, watch mode, secrets, artifacts, cache, reusable workflows, and even a GitLab pipeline parser because apparently I don't know how to leave a side project alone. This post is mostly my attempt to answer the questions people keep asking me: why not just use act, why Rust, and what part was actually hard?
❤18😁1🤔1
#prog #rust #article
The hidden cost of mpsc channels
TL;DR: mpsc-каналы в tokio выделяют память под значения в виде связного списка из массивов фиксированного размера, из-за чего они почти всегда используют больше памяти, чем необходимо для указанной при создании ёмкости. При наличии большого количества каналов небольшой ёмкости это может привести к высокому и при этом не эффективному потреблению памяти.
The hidden cost of mpsc channels
TL;DR: mpsc-каналы в tokio выделяют память под значения в виде связного списка из массивов фиксированного размера, из-за чего они почти всегда используют больше памяти, чем необходимо для указанной при создании ёмкости. При наличии большого количества каналов небольшой ёмкости это может привести к высокому и при этом не эффективному потреблению памяти.
howardjohn's blog
The hidden cost of mpsc channels
Recently I have been spending a lot of time analyzing and optimizing memory usage in our Rust reverse-proxy, agentgateway. One thing that repeatedly came up was a surprisingly large amount of memory allocated to innocent-looking Tokio mpsc channels.
In my…
In my…
🤔3
#prog #rust #rustlib #article
A faster bump allocator for rust
Новый bump-аллокатор, который на множестве бенчмарков быстрее альтернатив (blink-alloc и bumpalo), часто в 2-3 раза, а в остальных не уступает им. Поддерживает регионы (считай, суб-арены, которые автоматически очищаются на выходе из функции), которые могут быть вложенными.
Из недостатков, которые я заметил: в API есть функции, которые выделяют память под значение, возвращаемое переданной функцией, и они не очищают выделенную память, если функция паникует.
A faster bump allocator for rust
Новый bump-аллокатор, который на множестве бенчмарков быстрее альтернатив (blink-alloc и bumpalo), часто в 2-3 раза, а в остальных не уступает им. Поддерживает регионы (считай, суб-арены, которые автоматически очищаются на выходе из функции), которые могут быть вложенными.
Из недостатков, которые я заметил: в API есть функции, которые выделяют память под значение, возвращаемое переданной функцией, и они не очищают выделенную память, если функция паникует.
owen.cafe
A faster bump allocator for rust
Announcing stumpalo, an extremely fast bump allocator for rust, with chunk reuse and safe scoped stack support.
👍6
#prog #rust #article
Only Bounds
Статья о грядущих изменениях в Rust, которые позволят добавить новые иерархии трейтов по умолчанию (помимо существующего сейчас
Only Bounds
Статья о грядущих изменениях в Rust, которые позволят добавить новые иерархии трейтов по умолчанию (помимо существующего сейчас
Sized). Работа ведётся главным образом ради поддержки Scalable Vector/Matrix Extensions — набора инструкций для процессоров ARM, который позволяет писать SIMD-код, не завязанный на конкретную ширину SIMD-регистров и потому переносимый между разными процессорами без перекомпиляции. Помимо этого, Нико показывает, что only bounds также открывают путь другим, более абмициозным дополнениям в язык. В частности, это в теории позволит писать код, который опирается на гарантированные вызовы деструкторов (без этого сейчас невозможно написать безопасный scoped async).🔥16❤1
#prog #rust #swift #amazingopensource
swift-bridge makes it easy to pass and share high-level types between Rust and Swift, such as String, Option<T>, Result<T, E>, struct, class and more.
It also helps you bridge higher level language features, such as async functions and generics.
Using swift-bridge should be safer, more performant and more ergonomic than managing Rust and Swift FFI by hand.
❤2👍1
#prog #rust #article
Building software for places where the internet barely exists
Статья о программе для синхронизации данных в условиях, когда соединение медленное и крайне ненадёжное. Нацелено на решение крайне практической задачи: связи между поликлинниками в Бутане. Технически связь есть, но 2G, и в силу множества причин связь часто обрывается, порой на несколько дней. Починка инфраструктуры — дело сложное из-за горного ландшафта, где ещё и дороги регулярно размывает дождями. Написанный автором ZamSync позволяет надёжно реплицировать данные даже в таких условиях. В статье также есть сравнения с уже существующими решениями.
Building software for places where the internet barely exists
Статья о программе для синхронизации данных в условиях, когда соединение медленное и крайне ненадёжное. Нацелено на решение крайне практической задачи: связи между поликлинниками в Бутане. Технически связь есть, но 2G, и в силу множества причин связь часто обрывается, порой на несколько дней. Починка инфраструктуры — дело сложное из-за горного ландшафта, где ещё и дороги регулярно размывает дождями. Написанный автором ZamSync позволяет надёжно реплицировать данные даже в таких условиях. В статье также есть сравнения с уже существующими решениями.
DEV Community
Building software for places where the internet barely exists
By Mathéo Delbarre, 2nd year CS student at EPITECH Nancy, France TL;DR Problem: district...
👍18❤🔥1
#prog #rust #article
How we found a bug in the hyper HTTP library
Баг присутствовал в нескольких мажорных версиях hyper и, что иронично, проявился в Cloudflare из-за, в конечном счёте, оптимизаций архитектуры. А ещё это хорошее напоминание, что Rust защищает от гонок данных, но не от состояния гонок в целом.
How we found a bug in the hyper HTTP library
None of the tools at the application level surfaced any errors, crashes, or log entries that provided useful clues. Application-level observability can have a blind spot for bugs that live below its awareness.
The failure occurred intermittently, scaled with response size, couldn’t be reproduced with simple tools like curl, and disappeared when we observed the system more closely. These signals pointed to a timing-dependent bug in the connection layer, not in the application logic.
Our breakthrough came from using kernel-level tooling with strace, the one layer that records what actually happened on the socket. The underlying bug lived in the few milliseconds between a partial flush and a premature shutdown — a window that opened only after we made the system faster.
Баг присутствовал в нескольких мажорных версиях hyper и, что иронично, проявился в Cloudflare из-за, в конечном счёте, оптимизаций архитектуры. А ещё это хорошее напоминание, что Rust защищает от гонок данных, но не от состояния гонок в целом.
The Cloudflare Blog
How we found a bug in the hyper HTTP library
By rearchitecting the Images binding, we accidentally uncovered a bug that existed in the open-source hyper library across multiple major versions.
👍8