Runtime Reflections

Notes on distributed systems, compilers, and the occasional runtime bug.

eBPF Tracing Gotchas I Wish I'd Known

June 12, 2026 · 9 min read · tagged ebpf linux observability

After spending three weeks debugging a production outage caused by a kprobe that worked fine on 5.15 but panicked on 6.1, I've compiled a list of eBPF tracing footguns that nobody talks about.

Rule #1: Never trust bpf_probe_read_user() on a page that might have been swapped out.
SEC("kprobe/tcp_connect")
int trace_tcp_connect(struct pt_regs *ctx) {
    struct sock *sk = (struct sock *)PT_REGS_PARM1(ctx);
    // ⚠️  This will crash on kernel ≥ 6.1
    bpf_probe_read_kernel(&dport, sizeof(dport),
        &sk->__sk_common.skc_dport);
    return 0;
}

Go Generics in the Wild: A Year Later

May 28, 2026 · 7 min read · tagged golang generics

It's been over a year since Go 1.18 shipped generics. I surveyed 50 open-source projects to see how they're actually using type parameters — the results surprised me.

The most common pattern isn't data structures or algorithms. It's functional options.

Raft Is Not a Silver Bullet

May 14, 2026 · 11 min read · tagged distributed-systems raft

I've seen too many teams reach for Raft when a simple leader-follower with WAL would suffice. Here's a decision framework I use before introducing consensus into a system.

Three Traps in Rust's Async Ecosystem

April 30, 2026 · 8 min read · tagged rust async

Cancellation safety, Send bounds on nested futures, and the subtle difference between tokio::spawn and select! — these are the three things that trip up even experienced Rust developers.

Postgres Query Planner Mysteries, Explained

April 15, 2026 · 13 min read · tagged postgres performance

Why did Postgres choose a sequential scan over your perfectly crafted index? A deep dive into random_page_cost, correlation statistics, and the dark art of EXPLAIN ANALYZE.