github.com-cloudflare-pingora
all · 6 devs · built 2026-06-13
Repository snapshot
Monthly reports
Highlights
- Introduced extensive new capabilities for *runtime configuration* and *observability*, including overriding runtime options for proxy services [318d354a · Edward Wang], adding Dial9 runtime telemetry [commit/c23856d], and enabling Tokio runtime poll-time histograms [5e78b4d3 · Edward Wang].
- Enhanced *HTTP protocol handling* with opt-in HTTP/1.1 request pipelining for downstream sessions [4a9a34c5 · Cody Carlsen] and implemented a cancel-safe proxy task API for Subrequest server sessions [77cce2cd · Edward Wang].
- Improved *connection management* and *resource control* by allowing dynamic adjustment of LRU cache weight limits [3c55518b · Edward Wang] and adding a callback to track idle connection age in keepalive pools [eb9259a0 · Andrew Hauck].
- Provided greater *operational control* with a new option for specifying the working directory in daemon mode [ab48509e · ewang] and per-listener L4 buffer configuration [c0845a86 · Edward Wang].
- Strengthened *system reliability* and *resilience* through fixes for connection pooling race conditions [6e2158d5 · Andrew Hauck] and improved tolerance for per-shard errors in LRU cache persistence [d64bf93b · ewang].
Observations
- The *grow score* significantly increased by +106% (5 this month vs 2 5-month average), indicating a strong focus on new feature development and enhancements.
- The *waste score* saw a dramatic decrease of -86% (1 this month vs 4 5-month average), reflecting highly efficient development with minimal rework or discarded changes.
- Maintenance activity remained stable with a score of 1, consistent with the 5-month average.
- Multiple bug fixes were addressed in the *connection pooling* (`pingora-pool`) component, including issues with replaced connections being incorrectly evicted [b9257e72 · Andrew Hauck], missed eviction events [5220b5a0 · Andrew Hauck], and race conditions in `PoolNode` [6e2158d5 · Andrew Hauck].
- Critical issues were resolved in *HTTP health checks* by applying write timeouts [cb397dd7 · Abhishek Aiyer] and in the *HTTP/2 server's graceful shutdown* to ensure in-flight streams are drained [aece9932 · Matthew Gumport].
- A significant refactoring effort was undertaken to remove the custom `async_write_vec` module in favor of `tokio::io::AsyncWriteExt::write_all_buf` for *HTTP/1 protocol implementation* [309b2625 · Fei Deng].
- Testing infrastructure received attention with improvements to HTTP header serialization tests [d9e6d7a3 · Edward Wang] and conditional compilation for `CONNECT` proxying tests [a9e4c427 · Edward Wang]. One test was ignored due to timing dependencies causing CI failures [7d3677de · Kevin Guthrie].
Performance over time
ETV stacked by Growth, Maintenance and Fixes — 90-day moving average, normalized to ETV / month.
Average performance per developer
ETV per active developer per month — 30-day moving average.
Active developers over time
Unique developers committing each day — 90-day moving average.
Knowledge concentration
How dependent is this repo on a small number of contributors? Higher top-1 share = higher key-person risk.
Edward Wang owns 58.6 % of commits.
Top contributors
Most impactful commits
Top 20 by ETV in the all-time window.
- 5.4ETVUpgrade body mode on 101 Previously the body reader would initialize to HTTP/1.0 mode when the upgrade request header is found. Now the reader is only converted to that mode when both the upgrade header and 101 is received.Edward Wang · 824bdeef · 2025-12-29
- 3.7ETVFix chunked trailer end parsing httparse itself does not treat the terminating chunk (0 + CRLF) any differently when parsing its chunk size, and the body reader does not validate the following CRLF required to close the body. Additionally, that current parsing scheme will not consider trailers before the end CRLF. Now the trailers are considered but simply discarded. The CRLFs between the trailers (and now, the CRLFs after the body payloads) are validated, however.Edward Wang · a88d0483 · 2025-06-02
- 3.0ETVSubrequest sessions, clear body headers if no input Subrequests are now a separate server Session type, instantiated with corresponding SubrequestHandles that can send or receive HttpTasks to or from the subrequest. This makes it possible to communicate with created subrequests. Additionally the subrequest ctx now has a BodyMode input. If unset the background subrequest will clear request headers related to the request body to prevent issues where the upstream might expect body.Edward Wang · cbb69832 · 2025-08-19
- 2.0ETVAdd cancel-safe body and header writer primitives Add BodyWriter task API (send_body_task, write_current_body_task, send_finish_task, write_current_finish_task) and HeaderWriter for cancel-safe writes that can be used in tokio::select! loops.Edward Wang · d7728cac · 2026-02-28
- 1.9ETVtransfer-encoding parsing robustnessFei Deng · 7f7166d6 · 2026-01-27
- 1.8ETVAdd cancel-safe proxy task API for Subrequest server sessions Implement the same proxy task API functionality for subrequest server sessions as HTTP/1. Also fix the regular subrequest header write path so upgrade state is only marked after the 101 task is sent.Edward Wang · 77cce2cd · 2026-05-04
- 1.8ETVYear 2026Andrew Hauck · ef017ceb · 2026-01-10
- 1.7ETVAvoid close delimit mode on http/1.0 req RFC9112 is now extra explicit about the close delimiting applying exclusively to response messages for HTTP/1.0. Also disables reuse explicitly when close delimiting on the response side as defense-in-depth that shouldn't have behavioral diff.Edward Wang · 40c3c1e9 · 2026-01-31
- 1.3ETVValidate invalid content-length on v1 resp by default Rejecting bad upstream content-length by default to avoid forwarding ambiguously framed messages. An option still exists to allow this in the peer options, if needed, and treat these responses as close-delimited though this is non-RFC-compliant. The content-length is now also removed on the response if transfer-encoding is present, per RFC.Edward Wang · 460b7f3b · 2026-02-01
- 1.2ETVDiscard extra upstream body and disable keepalive Explicitly disable keepalive on upstream connection when excess body (content-length) is detected.Edward Wang · 60a7bcc2 · 2025-06-10
- 1.1ETVAdd a system for specifying and using service-level dependenciesKevin Guthrie · b083273e · 2026-02-19
- 1.1ETVDefault to close on downstream response before body finish For v1, this represents a safe default to prevent the next request after an unfinished request write from appearing as and being rejected as a pipelined request on the same connection.Edward Wang · 5378f7e6 · 2025-12-27
- 1.0ETVReject invalid content-length v1 requests If a content-length is present RFC9112 indicates we must reject invalid forms of that content-length header. This eliminates situations where we might be dealing with ambiguous request framing.Edward Wang · fc904c0d · 2026-02-01
- 1.0ETVDon't init body reader on HEAD 1xx This prevents headers like 100-continue from ending the stream and causing hangs while the downstream is waiting.Edward Wang · af7dd468 · 2026-03-18
- 1.0ETVMark previously too large chunked assets as cacheable Too large assets without content-length could previously be skipped as uncacheable indefinitely by the cacheable predictor. This change moves the max file size tracking outside of the miss handler itself such that it can also be used to track body bytes after caching was disabled. This also adjusts the cache inner structs such that cache key and the cacheable predictor are accessible, so that an asset can be remembered as cacheable even if caching was disabled. Additional safeguards are also in place to ensure that the NeverEnabled reason is not overridden when disabling cache, as it does not make sense to disable cache when it was never enabled in the first place.Edward Wang · 889b69e6 · 2025-07-09
- 0.9ETVRequire WritePermit to release lock, fix dangling detection Dangling cache locks could occur when there were simply many readers at once waiting for the lock, the reason being the available permits could immediately be used up upon unlocking and before the WritePermit is dropped, resulting in a false positive dangling lock. Instead, just mark the WritePermit as finished when the cache key lock is unlocked as a result of having the permit. The most intuitive way to do this is to "turn in" the WritePermit back to the CacheKeyLock that created it when unlocking, so that the CacheKeyLock can mark it as finished.Edward Wang · 0860721f · 2025-02-01
- 0.8ETVAdd a mechanism for signalling between old and new processes when doing graceful upgradesKevin Guthrie · ee387f4a · 2026-03-29
- 0.7ETVAdd cache lock wait timeout for readers Currently the lock timeout expressed by the CacheKeyLock is actually a lock age timeout. A reader wait timeout should be separately configurable, especially since a reader can wait on multiple different writers which are each considered separate locks. This wait timeout is made configurable by cache key (standard CacheLock API for this TBD). Also reacquire cache locks for the standard CacheLock when Timeouts occur (indicating lock age expiry).Edward Wang · e5960f82 · 2025-06-02
- 0.6ETVPipe subrequests utility Creates a pipe subrequest state machine utility to be able to treat the subrequest as a "pipe" (sending request body and writing response tasks directly from the subrequest). Also adds a handler to be able to propagate the downstream / final proxy error that a subrequest server session encounters to the pipe state machine. The subrequest pipe is also allowed to receive a preset input body, which may also be created from a previously captured downstream session body. In this case the captured session body may be reused for multiple "chained" subrequests. Co-authored-by: Matthew Gumport <mbg@cloudflare.com>Matthew Gumport · d3a3b1a4 · 2026-01-30
- 0.6ETVShard connection pool and use a true global LRU rather than ThreadLocal to avoid stale entries in LRU, address other outstanding TODOsAndrew Hauck · 3d55df55 · 2026-01-05