1
0
mirror of https://github.com/facebook/proxygen.git synced 2026-10-24 01:33:54 +03:00

15601 Commits

Author SHA1 Message Date
Denis Yaroshevskiy
b0ccce7dfc Make HTTPCodecFilterChain an isolated class (behaviour preserving) (#644)
Summary:
Pull Request resolved: https://github.com/facebook/proxygen/pull/644

Instead of calling `codec_->` and all the chain methods, we want to encapsulate them together.
That way we can optimize them in the diffs to follow.

This diff just does the encapsulation.

This is mechanical and behaviour-preserving. The bulk of the diff is
`codec_->foo()` becoming `codec_.foo()` across `HTTPSession`, `HQSession`,
`HTTPCoroSession` and their tests.

The only problem with exposing both Chain and Codec methods was with `setCallback`
that is available on both today.
The only call site `HQSession::initIngress` where `->setCallback` was used is behaviourally identical in this diff.
(it will be fixed on top)

Reviewed By: hanidamlaj

Differential Revision: D120697369

fbshipit-source-id: 3a84d9c42b2358eb9aaa1e56b72e3052468e9717
2026-09-25 10:43:07 -07:00
Hani Damlaj
74095399ce holistically remove h2cEnabled
Summary: now that PrestoDb's usage of `h2cEnabled` has been removed, we now fully the `h2cEnabled` member of HTTPServerOptions

Reviewed By: zhangyuannie

Differential Revision: D121691328

fbshipit-source-id: d6890ec10236e515dc68059d9ed5cd57e3075388
2026-09-24 18:45:51 -07:00
Open Source Bot
101c2472ef Updating hashes
Summary:
GitHub commits:

6931eeba53
da145633c9
7b06559121
725d4a53c9
ff022a9532
0cd9a7bd0a
dd597c1706
6364344086
9a7a815add
e95da66072
6489d01cfe
85d8d3c041
06d4d3251f

Reviewed By: bigfootjon

fbshipit-source-id: 2c09b33313598c1893f5899806e22a3984d3af5a
2026-09-24 09:35:06 -07:00
Hani Damlaj
dd597c1706 simplify WtEgressContainer::enqueue XCHECK
Summary: uses the recently added enqueuedFin_ flag for the XCHECK condition

Reviewed By: afrind

Differential Revision: D119378123

fbshipit-source-id: 73a72a97b6ef78430973bca857e4603429ebc306
2026-09-23 14:04:58 -07:00
Hani Damlaj
12a67fb52f remove HttpTxn::onPushedTransaction
Summary: We're currently deprecating PUSH_PROMISE support in http/2 and http/3 for proxygen/lib – this diff is focused on the removal of `HttpTxn::onPushedTransaction`

Reviewed By: kwaugh

Differential Revision: D121228773

fbshipit-source-id: 27bda0777353587964a369333d54bc57fa93b82b
2026-09-23 10:37:04 -07:00
Open Source Bot
e9abff668b Updating hashes
Summary:
GitHub commits:

8ae6476d16
7fb7351be3
4524f86292
7fbdc667f8
424d88f832
3a2329c186
ed94069fd4
e0e6513de4
91d7d71d9c
d42b18ec2c
058a44a77e
9fb9d508b1
a8b4817143

Reviewed By: bigfootjon

fbshipit-source-id: 98ada701800f5d7b607184182d8cf4c150577a12
2026-09-23 09:32:22 -07:00
Alan Frindell
ed94069fd4 Purge queued QPACK blocks where the codec is destroyed
Summary:
The QPACK decoder keeps a raw pointer to a stream's codec while a header block
waits for encoder data. Only the abort path cleared that pointer, so a peer
GOAWAY destroys the codec with the pointer still live and the block later
decodes through freed memory. Clear the queue where the codec is actually
destroyed instead, in `eraseStream` and `removeCodec`. The purge touches no
wire state, so Stream Cancellation still goes out only where a stream is
abandoned. It does not adjust the queued byte counter, which is a pre-existing
gap.

Reviewed By: kvtsoy

Differential Revision: D120193223

fbshipit-source-id: 7cf995b526fc24b4770331c5f65126ad9b4748ff
2026-09-22 18:36:24 -07:00
Hani Damlaj
99c9fb92b1 Remove unused enableExHeaders option
Summary:
Remove the unused `HTTPServerOptions::enableExHeaders` field and its remaining assignment in `ProxyBaseHandler`.

landed-with-radar-review

Reviewed By: jbeshay

Differential Revision: D121224863

fbshipit-source-id: cf3cb9e94e3cfdb43995011ad1b1a9cc8c326607
2026-09-22 15:50:46 -07:00
Hani Damlaj
f14a7971ed erase from WritableStreams if stream- or conn-fc blocked
Summary:
This diff hardens the expectations around WtStreamManager and the state of the PriorityQueue – it fixes two small issues:

* A fin-only stream should not be inserted into ConnFcBlockedStreams. This isn't a big issue since it would have still been sitting in WritableStreams and that is what drives the write loop (either directly by reading the top of PriorityQueue or by accessing WtStreamManager::nextWritable)

* If the backing transport invokes WtStreamManager::dequeue with atMost=0 (e.g. http/2 has a fixed size write buffer of <= 64KiB for egress backpressure, and only re-enters the write loop once that write is successful), we should not remove that stream from the PriorityQueue

Reviewed By: SUJP123

Differential Revision: D120632884

fbshipit-source-id: e4940b47305fe1110c9ebc99d725ed8b26a5c4d5
2026-09-22 13:31:51 -07:00
Hani Damlaj
fd0587f8dc remove Http2Codec::parseExHeaders decl
Summary: Cleanup diff -- Http2Codec::parseExHeaders was removed a while back but I forgot to remove this method declaration in Http2Codec

Reviewed By: SUJP123

Differential Revision: D121072294

fbshipit-source-id: 78669b3663602985423edd92d819027637aec196
2026-09-22 13:14:18 -07:00
dependabot[bot]
6227f09893 Bump docker/build-push-action from 7.3.0 to 7.4.0 (#646)
Summary:
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.3.0 to 7.4.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/docker/build-push-action/releases">docker/build-push-action's releases</a>.</em></p>
<blockquote>
<h2>v7.4.0</h2>
<ul>
<li>Use the shared error helper for Buildx commands by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1620">docker/build-push-action#1620</a></li>
<li>Prevent workflow command injection in metadata logs by <a href="https://github.com/crazy-max"><code>@​crazy-max</code></a> in <a href="https://redirect.github.com/docker/build-push-action/pull/1617">docker/build-push-action#1617</a></li>
<li>Bump <code>@​docker/actions-toolkit</code> from 0.92.0 to 0.100.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1614">docker/build-push-action#1614</a> <a href="https://redirect.github.com/docker/build-push-action/pull/1618">docker/build-push-action#1618</a> <a href="https://redirect.github.com/docker/build-push-action/pull/1621">docker/build-push-action#1621</a></li>
<li>Bump <code>@​humanfs/node</code> from 0.16.7 to 0.16.8 in <a href="https://redirect.github.com/docker/build-push-action/pull/1609">docker/build-push-action#1609</a></li>
<li>Bump brace-expansion from 1.1.13 to 1.1.18 in <a href="https://redirect.github.com/docker/build-push-action/pull/1592">docker/build-push-action#1592</a></li>
<li>Bump csv-parse from 7.0.0 to 7.0.2 in <a href="https://redirect.github.com/docker/build-push-action/pull/1613">docker/build-push-action#1613</a></li>
<li>Bump js-yaml from 4.3.0 to 4.3.2 in <a href="https://redirect.github.com/docker/build-push-action/pull/1605">docker/build-push-action#1605</a> <a href="https://redirect.github.com/docker/build-push-action/pull/1615">docker/build-push-action#1615</a></li>
<li>Bump nanoid from 3.3.16 to 3.3.18 in <a href="https://redirect.github.com/docker/build-push-action/pull/1611">docker/build-push-action#1611</a></li>
<li>Bump postcss from 8.5.10 to 8.5.25 in <a href="https://redirect.github.com/docker/build-push-action/pull/1590">docker/build-push-action#1590</a></li>
<li>Bump postcss-selector-parser from 7.1.1 to 7.1.5 in <a href="https://redirect.github.com/docker/build-push-action/pull/1606">docker/build-push-action#1606</a></li>
<li>Bump sigstore from 4.1.0 to 4.1.1 in <a href="https://redirect.github.com/docker/build-push-action/pull/1577">docker/build-push-action#1577</a></li>
<li>Bump undici from 6.27.0 to 6.28.0 in <a href="https://redirect.github.com/docker/build-push-action/pull/1594">docker/build-push-action#1594</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/docker/build-push-action/compare/v7.3.0...v7.4.0">https://github.com/docker/build-push-action/compare/v7.3.0...v7.4.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="c3c9e263c2"><code>c3c9e26</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1621">#1621</a> from docker/dependabot/npm_and_yarn/docker/actions-t...</li>
<li><a href="459b674183"><code>459b674</code></a> [dependabot skip] chore: update generated content</li>
<li><a href="4dedcb23c9"><code>4dedcb2</code></a> chore(deps): Bump <code>@​docker/actions-toolkit</code> from 0.99.0 to 0.100.0</li>
<li><a href="379bf63a97"><code>379bf63</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1620">#1620</a> from crazy-max/buildx-error-message</li>
<li><a href="9877975c9e"><code>9877975</code></a> chore: update generated content</li>
<li><a href="7ed0556ffa"><code>7ed0556</code></a> use the shared Buildx error summary helper</li>
<li><a href="91670ba5a4"><code>91670ba</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1618">#1618</a> from docker/dependabot/npm_and_yarn/docker/actions-t...</li>
<li><a href="80dbc8614a"><code>80dbc86</code></a> [dependabot skip] chore: update generated content</li>
<li><a href="50cac3a3b6"><code>50cac3a</code></a> chore(deps): Bump <code>@​docker/actions-toolkit</code> from 0.98.0 to 0.99.0</li>
<li><a href="03b4d6cac0"><code>03b4d6c</code></a> Merge pull request <a href="https://redirect.github.com/docker/build-push-action/issues/1617">#1617</a> from crazy-max/fix-metadata-workflow-commands</li>
<li>Additional commits viewable in <a href="53b7df96c9...c3c9e263c2">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docker/build-push-action&package-manager=github_actions&previous-version=7.3.0&new-version=7.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

 ---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `dependabot rebase` will rebase this PR
- `dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

</details>

Pull Request resolved: https://github.com/facebook/proxygen/pull/646

Reviewed By: kvtsoy

Differential Revision: D121216322

Pulled By: afrind

fbshipit-source-id: 2044dc3ae4b687114565190181731513447a859e
2026-09-22 12:52:31 -07:00
Max Noormohammadpour
e4b227b2ee Correct four things the exported repository tells its readers
Summary:
Why?

Four statements the export makes to an external reader are wrong or
incomplete, and nothing internal checks any of them — no test reads the
READMEs, no job runs the GitHub workflow, and `oss_check`'s content lint
only looks for internal tokens.

1. `.github/ISSUE_TEMPLATE/bug_report.md` points at `examples/incast-2host.json`.
   The exported path is `packsim/examples/incast-2host.json`; a bare
   `examples/` resolves to a root directory that does not exist. The same
   file gets the sibling reference right two comments later, so this is an
   inconsistency inside one file rather than a convention.

2. `packsim/README.md` tells a maintainer to regenerate the GitHub workflow
   with a command that does not reproduce it. `--free-up-disk` and
   `--free-up-disk-before-build` both default to `False`
   (`getdeps/workflow_generator.py`), and the three steps they gate —
   deleting the Android SDK, dotnet, powershell and ghcup — are load-bearing
   on a job that builds boost, openssl, folly and fbthrift from source and
   then compiles every unit-test executable. Following the documented command
   silently drops them and yields a disk-exhaustion failure with nothing in
   the diff to explain it.

3. `packsim/README.md` names `libdwarf`, `libaio` and `libiberty` as
   "copyleft" without saying what that asks of the reader, or that all three
   arrive through folly rather than through PackSim. It also does not
   mention that the CMake path against pre-installed dependencies avoids
   them entirely. Note `libunwind` is in the same folly Linux dependency
   block but is MIT, not copyleft, so it is deliberately NOT added here.

4. `CONTRIBUTING.md` sends security reports to `facebook.com/whitehat`
   while `bug_report.md` and the shared `SECURITY.md` both use
   `bugbounty.meta.com`.

How?

Fixes all four, and adds two things the export was missing:

- `.github/ISSUE_TEMPLATE/config.yml`, which turns off the blank-issue link
  so the templates are the only route in and the security notice cannot be
  bypassed, and adds a contact link for security reports. No Configerator
  change was needed — `oss_check classify` confirms the existing
  `ISSUE_TEMPLATE/*.(md|ya?ml)` exception already admits it.
- A Contributing section on the root `README.md`. Neither `CONTRIBUTING.md`
  nor `CODE_OF_CONDUCT.md` was linked from the front page.

Two internal-only corrections ride along because they are the same class of
staleness and are cheaper to fix than to explain:

- `CMakeLists.txt` said its test sources are globbed out of 23 `oss_tests/`
  directories. There are 24. The count is dropped rather than incremented,
  since the sentence reads identically without it and cannot then drift.
- The getdeps manifest hard-coded "187 test executables" in a comment that
  ships publicly. Replaced with a pointer at the figure the configure step
  prints live.
- `.llms/rules/packsim-oss-build.md` claimed five files ship from this
  directory and that nothing under `.github/` but a workflow does. The
  contributor templates have shipped since D120640286. Its `apply_to_path`
  is widened to match, so the rule now actually fires on the files it
  describes.

Differential Revision: D121131700

fbshipit-source-id: 75439e492a46616443c4b1ab56285158f5e4b955
2026-09-22 10:30:41 -07:00
Nikhil Dixit Limaye
2a584f146f Fix Ubuntu bpftool package
Summary: Ubuntu exposes `bpftool` as a virtual APT package, which makes getdeps fail because APT cannot choose a provider. Select `linux-tools-common` for Ubuntu while retaining `bpftool` for non-Ubuntu environments.

Reviewed By: tagrawal03

Differential Revision: D121095850

fbshipit-source-id: 170d670d725da798fcc1feed925408d54a1115d9
2026-09-22 10:25:19 -07:00
Open Source Bot
259c043651 Updating hashes
Summary:
GitHub commits:

8aa5bcbfb7
a5b5db335d
f24b54837d
2b96221bdd
4ad91f058f
5c04b40ad5
887fb6faec
23e37764e4
c3b08345f0
80e0859e1c
9a69572a49
be07c91e08

Reviewed By: bigfootjon

fbshipit-source-id: 2348fa0bcac3cf4cc43446e7bacf1469b52bd467
2026-09-22 09:33:42 -07:00
generatedunixname1899117597419293
887fb6faec fbsource//xplat/proxygen:proxygen-httpserver-full
Reviewed By: hanidamlaj

Differential Revision: D120993922

fbshipit-source-id: 1dd1247eae71097b8481f9b6ac23bd8b31cb0654
2026-09-21 16:36:49 -07:00
generatedunixname898294613133534
bc63c61d42 Fix CQS signal facebook-hte-CArray in xplat/proxygen/lib/utils
Differential Revision: D120970279

fbshipit-source-id: 048724a6127ad9b7609f603f11c9672d09da6834
2026-09-21 14:25:11 -07:00
Sujay Patel
8ec08dceb0 HQ codecs: log parse-error context
Summary:
Same attribution for HTTP/3, and the largest gap of the three.
`HQFramedCodec::checkConnectionError` built every frame-layer `HTTPException`
from the hardcoded literal `Connection error`, so `HQControlCodec`'s five
indistinguishable `HTTP_FRAME_UNEXPECTED` returns and `HQFramer`'s message-less
returns all collapsed into one string. Only the numeric HTTP/3 code
differentiated them.

  Connection error [File]=HQControlCodec.cpp
  [Context]=settings-not-first-frame

The frame loop lives in the base class while the checks live in the derived
codecs, so `setParseErrorContext` takes the caller's file and the origin points
at the real rejecting file rather than the base. The base clears the context
before `checkFrameAllowed` and falls back to a generic reason only when the
derived codec named none, so a specific attribution is never overwritten.

Instrumented `HQFramedCodec`, `HQControlCodec` and `HQStreamCodec`.

Reviewed By: afrind

Differential Revision: D114943895

fbshipit-source-id: 47123a6e08d1ecca411f505f500f3bee3f285680
2026-09-21 11:57:47 -07:00
Michel Lind
e1aae3eb6e Drop unused mvfst dep from mcrouter manifest
Summary:
`mcrouter`'s buck targets, sources, and CMake `find_package` list never reference `mvfst`. The single hit is a test string literal (`set_umember3() = "mvfst"`) exercising serialization round-trips — pure test data, no headers used, no libraries linked, and it would pass identically with any other string.

So the manifest's direct `mvfst` entry is dropped. Note: `mvfst` stays in the resolved closure transitively via `fbthrift`; this changes declared direct deps only, not what gets built.

Reviewed By: bigfootjon

Differential Revision: D121020246

fbshipit-source-id: d9fe8f7934af7cdcc2d8be271c4151f246ba75c0
2026-09-21 11:40:26 -07:00
generatedunixname1899117597419293
81956da22f fbsource//xplat/proxygen:http2_codec
Reviewed By: hanidamlaj

Differential Revision: D120685213

fbshipit-source-id: 9002ff5a89a4a38bc69b9e60a0b570254b2a72e2
2026-09-21 11:04:22 -07:00
meta-codesync[bot]
479eb55741 Re-sync with internal repository (#645)
The internal and external repositories are out of sync. This Pull Request attempts to brings them back in sync by patching the GitHub repository. Please carefully review this patch. You must disable ShipIt for your project in order to merge this pull request. DO NOT IMPORT this pull request. Instead, merge it directly on GitHub using the MERGE BUTTON. Re-enable ShipIt after merging.

fbshipit-source-id: e24e32453662b79b80308343ceefcb628225c94c

Co-authored-by: Facebook GitHub Bot <facebook-github-bot@users.noreply.github.com>
2026-09-21 10:51:55 -07:00
Siva Muthusamy
0c172c5eec Change default SAI version to 1.19.0 for OSS
Summary:
Bump the OSS/getdeps default SAI version to 1.19.0 (libsai manifest, CMakeLists, run-getdeps.py, build-helper.py, fboss_oss_build.bzl, container docs).

Sites updated:
  - opensource/fbcode_builder/manifests/libsai: url, sha256, subdir
  - fboss/github/CMakeLists.txt: default SAI_VERSION + status message
  - fboss/oss/scripts/run-getdeps.py: new SAI_VERSION_SHAS entry
  - fboss/oss/scripts/build-helper.py: url + sha tables, choices, const/default, help
  - fboss/facebook/oss_ci/fboss_oss_build.bzl: DEFAULT_SAI_VERSION + its docstring
  - fboss/github/docs/static/code_snips/build_helper.sh: default text + supported list

The v1.19.0 tarball sha256 (199d2cd32408b6470ce0c43beee660cc468e29e72921f1e93e64d4a8eb80246a)
was obtained by downloading the release tarball and hashing it; it is used
identically in all three places that record it.

Building_FBOSS_on_containers.md carries no SAI version reference, so it needed
no change despite being listed in the integration runbook.

Reviewed By: ashutoshgrewal, shri-khare

Differential Revision: D120953509

fbshipit-source-id: 01072090c5844062d31f4ec2ab4aff6ed421d9b9
2026-09-21 10:13:41 -07:00
Sujay Patel
df727477da HTTP2Codec: log parse-error context
Summary:
Same attribution for HTTP/2. `checkConnectionError` reported every framer
failure as the single literal `Connection error`, so roughly thirty distinct
rejection paths in `HTTP2Framer` were indistinguishable in `debug_data`.

Frame parsing now records a reason via `setParseErrorContext`:

  GOAWAY error: excessively large frame len=32768
  [File]=HTTP2Codec.cpp [Context]=frame-exceeds-max-size

Reviewed By: afrind

Differential Revision: D114943825

fbshipit-source-id: e2e0ae29fed562b96e8fabaeb38641eef558cc62
2026-09-21 10:02:08 -07:00
Open Source Bot
d1a1362316 Updating hashes
Summary:
GitHub commits:

b288e1d2b3
4db9ccba8f
4ce7d8a7b4
de5b6be521
a5af4bf685
3fc28d32f1
c54c04e4a5
ff45f296d2
679a7857dd
37f652ce85
c75e42928f

Reviewed By: bigfootjon

fbshipit-source-id: e24e32453662b79b80308343ceefcb628225c94c
2026-09-21 09:33:41 -07:00
Open Source Bot
3fc28d32f1 Updating hashes
Summary:
GitHub commits:

1228b018f2
fc45cc7de2
4a74ebee04
e2be5ec2f1
7737b3abdb
5a19c9e69e
6fe7207bff
712601ccf5
4f973a4f95
d1effb5221
a02b2258b7
4cd2dd8d69

Reviewed By: bigfootjon

fbshipit-source-id: 5988c3d19dc37f537436aa22fd10d49a8131670d
v2026.09.21.00
2026-09-20 09:32:51 -07:00
Open Source Bot
6fe7207bff Updating hashes
Summary:
GitHub commits:

105165334c
e9800eb0c9
fb4ad9ee85
e480eec7f3
839090a65e
e3371863ee
353ba5ed48
792b485b60
fb39d25785
5674a6a016
292ade5a2d
4ff6e5e7b8
1dbe77afa7

Reviewed By: bigfootjon

fbshipit-source-id: 292683cd7dd884a3e11070ed72322da4c9e3fb0b
2026-09-19 09:34:07 -07:00
Keivaun Waugh
792b485b60 Disable server push for upstream coro sessions
Summary: Change `HTTPCoroSession` so it only enables push if that was specified in the construction settings.

Reviewed By: lnicco, hanidamlaj

Differential Revision: D120591826

fbshipit-source-id: 911e12cce94640e14059f64d62599f4d3b4bd5da
2026-09-18 20:36:06 -07:00
Max Noormohammadpour
e5716d4fd1 Give the GitHub Actions job a timeout somebody chose
Summary:
## What

Adds a `[github.actions]` section to `opensource/fbcode_builder/manifests/packsim`
setting `timeout_minutes = 180`, and regenerates
`ai_simulation/.github/workflows/getdeps_linux.yml` from it.

## Why

The job had 60 minutes, which is the workflow generator's fallback
(`workflow_generator.py`: `timeout_minutes = gh("timeout_minutes") or "60"`) and
not a figure anyone picked for this project. One run has to build boost,
openssl, folly and fbthrift from source, then compile 187 test executables, then
run them -- and each test process defaults to 4 PDES worker threads in the
open-source build while ctest is already running jobs in parallel, so the test
phase oversubscribes a standard two-core runner several times over.

180 is a ceiling, not an estimate, and the manifest comment says so. Nothing is
known about the real wall clock because the workflow has never executed: nothing
has been pushed to the repository yet, and it only triggers on push and pull
request against `main`. Its first run will be its first measurement. A job that
is killed at 60 minutes reports as a red badge on the repository's front page
and tells you nothing about why; one that finishes in 70 tells you the number to
set. Lower it once a green run has reported one.

Deliberately not changed: the runner size. `--cpu-cores` would also help the
oversubscription, but that is a standing cost decision rather than a one-off
ceiling, and it belongs with whoever owns the project's CI budget.

## Why the manifest and not the workflow

The workflow file carries an `generated by getdeps.py` header and is rebuilt by
`opensource/fbcode_builder/getdeps/facebook/update-all-github-actions.sh`, which
already has an entry for packsim. Editing the YAML directly would be reverted by
the next sweep; `[github.actions]` keys in the manifest are the supported way to
change it, and they survive.

Differential Revision: D120642627

fbshipit-source-id: 4ea8d4a5bcc8533e6eec0cfb41dde63871c72f9b
2026-09-18 19:05:43 -07:00
Hani Damlaj
860259bf47 WtStreamManagerTest refactor recently added test
Summary:
a test was recently added, this simply refactors it to use the test fixture to simplify code

___

Differential Revision: D120731929

fbshipit-source-id: 5f0910f7ab6ee9d32168a3b3b9c371c7754f3caf
2026-09-18 12:11:14 -07:00
Sujay Patel
b675499f66 HTTP1xCodec: log parse-error context
Summary:
Revproxy codec errors reach the `proxygen_codec_errors` Scuba dataset via
`CodecErrorFilter`, whose `debug_data` column is `HTTPException::what()`.
For HTTP/1, the generic `http_parser` callback failure does not identify which
branch rejected the message.

Record a static reason for ingress parser callback failures and append it to
the parser error. Header-value failures also use
`CodecUtil::validateHeaderValueDetail` from the parent diff to include the
header name and rejected validation rule.

Reviewed By: hanidamlaj

Differential Revision: D120020224

fbshipit-source-id: 0664905ae48263552cde1ed33ddadc29463287d2
2026-09-18 11:46:47 -07:00
Open Source Bot
8b5f6e9235 Updating hashes
Summary:
GitHub commits:

cb0a0efc50
6ff25fd583
48e82a8722
a8ed87c07c
1e32c44f13
8326af13eb
19f33073dc
2f2a3c50dc
ee04a94ae0
1023c7ae31
52fbcdc365
0487fbf087

Reviewed By: bigfootjon

fbshipit-source-id: 2c8899aa419ca977632da5b784b2c49cb4fafe38
2026-09-18 09:34:21 -07:00
Michel Lind
19f33073dc getdeps: select EL-specific manifest sections by distro_family
Summary:
Enable getdeps-based builds on every Enterprise Linux distro (RHEL, AlmaLinux, Rocky Linux, CentOS Stream) by selecting EL-specific manifest sections with distro_family instead of individual distro names.

The manifests that mean "any Enterprise Linux 9" (or 8) spell it as distro=centos_stream, because CentOS Stream is what CI runs. That never matched AlmaLinux or Rocky, and after the previous change gave RHEL its own distro name it would not match RHEL either. The per-distro enumeration is the bug class itself: each file was incomplete in a different way (libaio hand-listed alma+rocky but missed RHEL; everything else listed only centos_stream), so the fix has to apply everywhere the pattern occurs -- splitting it per project would just re-create the drift. Every project touched here builds against the same Folly-stack toolchain (gcc toolsets via the shared gcc12/gcc14 manifests, clang19, python3.12 for sapling), so distro coverage has to move together. The most consequential case is cachelib's gcc-toolset-14: without it an EL 9 build uses the default GCC 11 and fails to compile C++20 code although the toolset is right there in the repositories.

Rewrite those sections with the distro_family variable introduced in the previous change, preserving each selector's meaning while extending it to the whole family:

```
- all(distro=centos_stream,distro_vers=9)  -> all(distro_family=rhel,distro_vers=9)
  cachelib, gcc12, gcc14, openr, python, python-setuptools,
  rebalancer, rebalancer-explorer
- all(distro=centos_stream,distro_vers=8)  -> all(distro_family=rhel,distro_vers=8)
  boost, boost-python
- not(all(any(distro=centos_stream,distro=centos),distro_vers=8))
                                            -> not(all(distro_family=rhel,distro_vers=8))
  libmnl
- not(any(all(distro=centos,distro_vers=8),all(distro=centos_stream,distro_vers=9)))
                                            -> not(all(distro_family=rhel,any(distro_vers=8,distro_vers=9)))
  lz4, lz4-python
- rpms.any(distro=centos_stream,...,distro=fedora) -> rpms
  libaio, numa (every rpm distro ships libaio-devel and numactl-devel)
- rpms.distro=centos_stream                -> rpms.distro_family=rhel
  libaio-python
```

"centos" was the old CentOS Linux 8 name and folds into the family. The wider exclusions this produces (e.g. lz4-static now also excluded on centos_stream 8 and centos 9) only touch EOL or practically unused combos. No manifest still selects on an individual EL distro name. libaio-devel and numactl-devel are confirmed present on RHEL, CentOS and Fedora, the full rpm universe getdeps targets.

This must land after the distro_family change: the expression parser rejects unknown selector variables, so on a getdeps without it these manifests fail to load.

Tested with both changes applied: every manifest passes validate-manifest, and `install-system-deps --recursive --dry-run --os-type linux --distro rhel --distro-version 9 cachelib` now yields the same package set as --distro centos_stream, including gcc-toolset-14, libaio-devel and numactl-devel, where before it lacked all three. The openr, rebalancer and rebalancer-explorer hunks are the same mechanical rewrite but those projects were not built here.

**Depends on https://github.com/facebook/CacheLib/issues/495** (`distro_family`): must land after it, since the expression parser rejects unknown selector variables. Submitted separately so each can be reviewed on its own; the two are otherwise independent of https://github.com/facebook/CacheLib/issues/494.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

X-link: https://github.com/facebook/CacheLib/pull/496

Reviewed By: likewhatevs

Differential Revision: D120501944

Pulled By: michel-slm

fbshipit-source-id: fdfc8b65770736ed190223df5e4dc2d0b2b417ba
2026-09-18 07:35:56 -07:00
Chen Li (Efficiency)
f5d54ce2dd Add plain-ASCII fast path to CodecUtil::validateHeaderValue on HPACK decode path
Reviewed By: yfeldblum

Differential Revision: D111136730

fbshipit-source-id: 30da0bc5fea87a52cdfc6e8e77080f135688fecb
2026-09-18 06:47:04 -07:00
Joseph Beshay
d1bad34f59 Handle partial SSL writes
Summary:
# Context
`CoroSSLTransport::writeImpl` assumes a successful `SSL_write` consumes the entire input buffer. `SSL_MODE_ENABLE_PARTIAL_WRITE` permits positive partial returns, so writes larger than one TLS record can hit a fatal `XCHECK`.

# Mitigation
Advance the input range after each successful write and continue until all bytes are consumed. Preserve the original size for `WriteInfo` and add a regression covering a 64 KiB write with partial-write mode enabled.

Reviewed By: hanidamlaj, sandarsh

Differential Revision: D120634805

fbshipit-source-id: 3d0daf65f924c26d3c388d68503471c5105c67fe
2026-09-18 05:02:13 -07:00
Hani Damlaj
125d6f33c1 erase WritableStream on ::finish
Summary:
The goal here is just safety, when the WriteHandle is done we should unconditionally erase the handle from WritableStreams in ::finish

This is similar to what we currently do with connFcBlockedStreams & finOnlyStreams

Reviewed By: SUJP123

Differential Revision: D120439884

fbshipit-source-id: b29723ff99446789152037b93ec1cb3cbea3fcc5
2026-09-17 20:28:51 -07:00
Nikhil Dixit Limaye
7a5b35b8b9 Use conventional OSS repository layout
Summary: Export public build scaffolding at the repository root and place the implementation under `socket-lb/`, matching Katran and other Meta OSS projects. Keep the top-level CMake and build scripts usable from both the internal and exported layouts, and update public build instructions accordingly.

Reviewed By: p-shah256

Differential Revision: D118875318

fbshipit-source-id: 996c0735d98fa093aa01bf08fce590e9e072d8f5
2026-09-17 20:05:17 -07:00
Jorge Lopez Silva
5b759887cb Accept PUSH_PROMISE before response headers
Summary:
During TGC CONNECT canary validation, Cloudflare-hosted domains consistently failed over HTTP/2 with `Invalid ingress state transition, state=0, event=3`, while HTTP/1.1 worked. We reproduced this on `fwdproxy.devtest.ftw` through Fastly, Cloudflare, and direct CONNECT; a libcurl control succeeded. Representative URLs included:

- `https://rohitai.com/blog/atria-dawn-preview-open-weight-agentic-model`
- `https://www.thescore.com/nfl/news/3600712/browns-place-rb-sampson-on-ir-with-knee-injury`
- `https://app.warehouserunner.com/costco/1748800-casper-cooling-select-12-memory-foam-queen-mattress`
- `https://www.reflector.com/news/national/kaplan-fox-notifies-equipmentshare-com-inc-nasdaq-eqpt-investors-of-a-pending-securities/article_3f5265d9-de9a-508d-8928-72edfad09e0a.html`

TGC instrumentation showed Cloudflare sending a legal `PUSH_PROMISE` before the parent response headers. `HTTPStreamSource` classified push promises as body events, so the ingress state machine rejected this ordering while still in `Start`. Add an explicit `onPushPromise` ingress event that preserves the current response state, and queue early pushes without waking a coroutine waiting for response headers.

Reviewed By: mjoras

Differential Revision: D120570583

fbshipit-source-id: 1952c0f30f724560ef7d6baeeaa9faf14e5b4259
2026-09-17 18:25:16 -07:00
Michel Lind
6bd0ee43ad getdeps: stop mapping liboqs to Fedora's liboqs-devel
Summary:
Fedora retired liboqs in Fedora 45 ("Obsoleted by openssl 3.5": OpenSSL 3.5 ships ML-KEM natively), so the `[rpms.distro=fedora]` mapping added in facebook/CacheLib#488 only resolves on Fedora 44 and older. On Rawhide a build with --allow-system-packages that generates its BuildRequires from the manifests fails at dependency resolution with "No match for argument: liboqs-devel". fizz still hard-depends on liboqs, so let getdeps build it from source (or the vendor tree) on Fedora as it does everywhere else.

Found while building the Fedora cachelib package on Rawhide with BuildRequires generated from the manifests; the mapping was added in https://github.com/facebook/CacheLib/issues/488 and only checked against Fedora 44 at the time. CentOS Stream 10 does ship liboqs-devel, so a `distro_family=rhel` mapping for EL 10 could be considered separately once https://github.com/facebook/CacheLib/issues/495 lands.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

X-link: https://github.com/facebook/CacheLib/pull/497

Reviewed By: likewhatevs

Differential Revision: D120517415

Pulled By: michel-slm

fbshipit-source-id: 1386a4418536d59a36feffb24f85f48cf19f11f3
2026-09-17 09:46:23 -07:00
Michel Lind
ccf888f9fb getdeps: add distro_family and recognise Red Hat Enterprise Linux
Summary:
get_linux_type() derives the distro name from NAME in /etc/os-release, which on Red Hat Enterprise Linux yields "red_hat_enterprise". Nothing knows that name: HostType.get_package_manager() returns None for it, so --allow-system-packages silently satisfies nothing and every dependency is built from source, and the manifests with distro=centos_stream selectors do not apply either. RHEL's VERSION_ID also carries a minor ("9.8"), as do AlmaLinux's and Rocky's, so even a matching distro would miss the distro_vers=9 selectors written for CentOS Stream.

This matters for EPEL: Fedora's Koji builds EPEL 9 packages in a buildroot with redhat-release (real RHEL), while EPEL 10 buildroots and the local mock configs use centos-stream-release. A getdeps-based EPEL 9 build therefore behaves differently in Koji than in local mock. Nobody noticed because getdeps has not been used for distro packaging before and RHEL is rare among people building from source.

Rather than pretend RHEL is CentOS Stream, model what the manifests actually mean. Following Chef's platform_family, introduce a distro_family alongside distro: "rhel" for rhel, centos, centos_stream, alma and rocky; "fedora"; "debian" for debian, ubuntu, pop!_os and mint; "arch". Fedora is deliberately its own family, unlike Ansible's os_family which folds it into RedHat: its base repositories carry many dependencies that the EL family only has in EPEL or not at all (glog, gflags, fmt, fast_float, googletest, benchmark, liboqs, jq), zlib is zlib-ng-compat there, and CentOS Stream 9 needs gcc-toolset; nineteen manifest sections already select on exactly that difference.

Concretely: - RHEL reports distro "rhel", the same short name as its os-release ID; - within the rhel family distro_vers is the major version only, so RHEL 9.8, Alma 9.6 and Rocky 9.6 all match distro_vers=9 as CentOS Stream 9 does; Fedora and Ubuntu keep their full versions; - distro_family is available to manifest selectors and drives get_package_manager(), which now returns rpm for the whole rhel family; - `install-system-deps --distro` accepts rhel; - os-release parsing moves into parse_os_release() so it can be unit tested.

Existing selectors keep their meaning: distro=centos_stream still matches only CentOS Stream. A follow-up will switch the sections that mean "any EL 9" to distro_family=rhel so that RHEL, Alma and Rocky pick up gcc-toolset, libaio and numactl too. Until then a RHEL host already gains every plain [rpms] mapping and the not(distro=fedora) ones.

Tested: `install-system-deps --recursive --dry-run --os-type linux --distro rhel --distro-version 9 cachelib` now produces a dnf command (previously "I don't know how to install any packages on this system"), and unit tests cover the os-release parsing for Fedora, CentOS Stream, RHEL, Alma, Rocky and Ubuntu plus the family and package-manager mapping. Verified against synthetic os-release contents, not a live RHEL host.

A follow-up PR will switch the manifest selectors that mean "any EL 9" (gcc-toolset, libaio, numactl and friends) to `distro_family=rhel`; it must land after this one because the expression parser rejects unknown selector variables.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

X-link: https://github.com/facebook/CacheLib/pull/495

Reviewed By: likewhatevs

Differential Revision: D120501703

Pulled By: michel-slm

fbshipit-source-id: f24b01e46207a08ca09b9f09500ba0fb78a502fa
2026-09-17 09:44:23 -07:00
Michel Lind
21d076fe8b getdeps: satisfy sparsemap from tsl-sparse-map-devel where packaged
Summary:
Fedora and EPEL package sparse-map as tsl-sparse-map-devel: 0.7.0 on F45 and Rawhide (stable since 2026-09-17), 0.6.2 on F44 and EPEL 9, and an EPEL 10 build is under way. With --allow-system-packages this takes sparsemap out of the set of projects built from source, leaving only the Meta stack (folly, fizz, wangle, mvfst, fbthrift) for a vendored distro build. A plain `[rpms]` section is used, as for libsodium, xxhash and snappy: where the package is not installed (CentOS Stream without EPEL, say) getdeps simply falls back to building sparsemap itself.

The F44 version is older than the 0.7.0 the manifest pins, so the difference was checked rather than assumed: the public API of sparse_map and sparse_set is identical between 0.6.2 and 0.7.0 down to template defaults, the tsl::detail_sparse_hash::sparse_array template cachelib reaches into has the same parameters, and the serialization format is unchanged. 0.7.0's only compatibility change is requiring C++17, irrelevant to cachelib. cachelib locates the headers by path (cmake/FindSparsemap.cmake: find_path tsl/sparse_map.h), which the package satisfies at /usr/include/tsl.

Tested on Fedora 44 with tsl-sparse-map-devel 0.6.2 installed: `getdeps.py --allow-system-packages build --no-tests --src-dir=. cachelib` no longer fetches or builds sparsemap (no Assessing/Building step for it in the log), cachelib configures with SPARSEMAP_INCLUDE_DIRS=/usr/include, SparseMapIndex.cpp compiles against the system header with -Werror on, cachebench links, and the build exits 0 after 58 minutes at two jobs.

Manifest-only follow-up to https://github.com/facebook/CacheLib/issues/488 and https://github.com/facebook/CacheLib/issues/493. RHEL hosts only benefit once https://github.com/facebook/CacheLib/issues/495 (distro_family) lands, since getdeps does not currently recognise RHEL as an rpm distro; the two are independent otherwise.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

X-link: https://github.com/facebook/CacheLib/pull/494

Reviewed By: likewhatevs

Differential Revision: D120501594

Pulled By: michel-slm

fbshipit-source-id: db5b7ad6514b56984aa3d92a24dbde1614ff1ed4
2026-09-17 09:37:07 -07:00
Open Source Bot
9dbfea9f5b Updating hashes
Summary:
GitHub commits:

7fcd92de6b
63387fdb00
7720c4a477
c888234a81
d8d3f3f6b5
bbf9a02d02
37cf29eba0
ec6128418c
6197e38ba2
f01b74d102
74270475a1
f9ad64c823
9d159f2d3d

Reviewed By: bigfootjon

fbshipit-source-id: a11233a32ab016dbc85f48d839215f9453315057
2026-09-17 09:33:02 -07:00
Michel Lind
4c3e3954ce pathlib slice 4: Path-ify test helpers, keep str contracts
Summary: Convert os.path joins, basenames, dirnames, and exists/isfile/isdir/islink checks in the getdeps test suite to pathlib with os.fspath at the str boundaries, matching slices 1-3b. Deliberately kept: os.path.abspath (no exact Path equivalent; still used inside Path() for the fixtures/manifests dirs), os.path.realpath replaced only where resolve() is exactly equivalent, os.unlink/symlink/chmod/listdir (not os.path), and vendor_test.py (owned by unlanded D120204081). Verified: arc lint clean, pyre clean, buck test 113/113 pass.

Reviewed By: vitaut

Differential Revision: D120383078

fbshipit-source-id: 94b41927b849bd1667793648f5351476fa49fa98
2026-09-17 09:31:09 -07:00
Michel Lind
47d14111bf pathlib slice 3b: Path-ify dyndeps, wheel builder, workflows, facebook helpers
Summary: Convert remaining os.path joins, basenames, dirnames, and exists/isfile checks to pathlib with os.fspath at the str-contract boundaries, matching slices 1-3a. Deliberately kept: os.path.normcase/relpath (no Path equivalent), os.fsdecode, os.path.sep, listdir/lstat traversal, os.walk in include_rewriter (rglob would change prune semantics), the abspath site in workflow_generator, and all test files (no mock seams affected; vendor_test stays owned by D120204081). Verified: arc lint clean, pyre clean, buck test 113/113 pass.

Reviewed By: bigfootjon

Differential Revision: D120383077

fbshipit-source-id: 37741cd8a8a042e40589b2925b08885f5bca8e7c
2026-09-17 09:31:09 -07:00
Michel Lind
f9d31b6e13 pathlib slice 3a: Path-ify core path operations, keep str contracts
Summary: builder, buildopts, manifest, load, cli (non-vendor), cmd_base, cargo: os.path joins/exists/isdir/isfile/listdir/dirname/basename become pathlib operations. All field, getter, Env-value, argv, hash, and return types stay str (os.fspath at those boundaries); subprocess/Env/hash inputs are unchanged. Deliberately untouched: ShipitPathMap (posix-matching semantics), ntpath drive-subst code, os.path.abspath (no exact Path equivalent), cli vendor hunks + builder free_up_disk guard + vendor_test (owned by the pending vendor diff/cleanup), get_src_dir()/path_search() returns.

Reviewed By: likewhatevs

Differential Revision: D120383076

fbshipit-source-id: 3b79f49924eaff16471ab4e997107a4adca18026
2026-09-17 09:31:09 -07:00
Michel Lind
5621052e14 pathlib slice 2: Path-ify fetcher internals
Summary: fetcher.py path manipulation now uses pathlib (joins, exists, makedirs, archive validation via resolve()+relative_to instead of a raw startswith prefix check). get_src_dir() stays -> str and constructor path fields stay str (builders/loaders consume them as str; retyped in the core slice). ShipitPathMap is deliberately untouched: its posix-matching semantics are load-bearing per the comment on add_mapping. retry_test now neutralizes Path.mkdir instead of os.makedirs (the seam _download_dir uses). New LocalDirFetcher/copy_if_different Path-input tests.

Reviewed By: likewhatevs

Differential Revision: D120383075

fbshipit-source-id: 8908611c0f79d853b09dcc86f9da09e4782e389b
2026-09-17 09:31:09 -07:00
Michel Lind
649510929f Add lint enforcing the cmake_minimum_required floor
Summary: Adds lint_cmake_floors.py, an arc lint wrapper holding the single cmake_minimum_required floor (3.14, from folly) for the folly-family OSS CMake projects, registered in fbsource-lint-engine.toml as OSSCMAKEFLOOR. It checks 13 effective roots (both sides of fbcode<->xplat mirrors, so skew is caught too) with at-or-above semantics so fbthrift 3.24 and mcrouter 3.16 stay legal, and offers the bump as an arc lint -a autofix. Any future dip below the floor fails lint on the offending diff instead of shipping a deprecation warning (or worse) to OSS consumers. Related: facebook/folly#2703.

Reviewed By: likewhatevs

Differential Revision: D120432856

fbshipit-source-id: 74895b760e4e73238ae0321f6e7eb5f966e39215
2026-09-17 09:23:29 -07:00
Michel Lind
789e227e3f Align cmake_minimum_required floor on 3.14
Summary: CMake 4.x removed compatibility with minimums below 3.5 and deprecates minimums below 3.10 ahead of removing that too. folly already requires 3.14, which is the effective floor for every folly-dependent OSS project: declaring lower no longer excludes any supported consumer (lowest CMake in any supported config is 3.22) and only buys deprecation warnings today plus hard configure failures once the next removal lands. Aligned here: fizz 3.5, wangle 3.5, mvfst 3.10, proxygen 3.10, cachelib 3.12, fb303 3.8. Left alone above the floor: fbthrift 3.24, mcrouter 3.16; folly itself already 3.14. Related: facebook/folly#2703.

Reviewed By: likewhatevs

Differential Revision: D120432855

fbshipit-source-id: 0734e2b4e4e0c8866de52bc8657d4bf0d81e7c57
2026-09-17 09:23:29 -07:00
Michel Lind
37cf29eba0 getdeps: raise cachelib and fbthrift job weight to 3072 MiB
Summary:
job_weight_mib is the per-compiler memory estimate getdeps divides available RAM by to pick the build concurrency, and the base of the RLIMIT_AS safety net it puts on each build process. cachelib and fbthrift declared 2048 MiB, which two measured builds show is low.

Peak resident memory of every cc1plus process was sampled every two seconds during full builds on Fedora 44 (aarch64, gcc 15), once at four jobs and once at two jobs with tests disabled; 1182 compiler processes were observed across the fbthrift and cachelib phases of the second run:

| percentile | peak RSS |
|------------|----------|
| p50        | 489 MiB  |
| p90        | 1321 MiB |
| p95        | 1626 MiB |
| p99        | 2580 MiB |
| max        | 4027 MiB |

24 translation units exceeded 2048 MiB and 4 exceeded 3072 MiB. The heaviest were cachebench's Stressor.cpp (4.0 GiB) and fbthrift's ThriftServer.cpp (3.8 GiB), ThriftQuicServer.cpp (3.1 GiB), ThriftRocketServerHandler.cpp and Cpp2Connection.cpp (2.8 GiB each).

3072 MiB matches what proxygen, fboss, openr, bgp and moxygen already declare and keeps a builder sized for N jobs from over-committing when several of the heavy units land together, which on a machine whose scratch dir sits on a tmpfs was enough to push it into swap. The weight is a typical-case budget rather than a ceiling, so the remaining 4 GiB outliers are left to the 10x RLIMIT_AS margin. fbthrift-python builds the same sources and moves with fbthrift.

Follow-up to https://github.com/facebook/CacheLib/issues/488/#490/https://github.com/facebook/CacheLib/issues/491, measured on the same host; manifest-only change.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

X-link: https://github.com/facebook/CacheLib/pull/492

Reviewed By: likewhatevs

Differential Revision: D120414253

Pulled By: michel-slm

fbshipit-source-id: f93eab02ecb3d3aa6a5b4e1a45a31cd7b376c366
2026-09-17 00:42:35 -07:00
Michel Lind
ac9207ff19 getdeps: bump sparsemap to 0.7.0 for CMake 4
Summary:
sparse-map 0.6.2 declares cmake_minimum_required(VERSION 3.1). CMake 4 removed compatibility with anything below 3.5, so on hosts whose system CMake is 4.x (Fedora 44, Homebrew, the GitHub macOS runners, and soon Ubuntu 26.04 and Debian 14) the sparsemap step fails to configure:

```
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 3.5 has been removed from CMake.
```

Upstream fixed this in 0.7.0 (released 2025-11-02), which requires CMake 3.10, so take the release rather than carry a patch. 0.7.0 also moves to C++17, fixes iterator invalidation on a non-inserting insert and the serialization of small hashes, and adds a no-exceptions mode; the headers install to the same include/tsl layout. cachelib is the only manifest that depends on sparsemap, and the one internal type it reaches into, tsl::detail_sparse_hash::sparse_array, keeps the same template parameters.

Tested on Fedora 44 with system CMake 4.3.0 and gcc 15, no CMAKE_POLICY_VERSION_MINIMUM anywhere on the command line: `getdeps.py --allow-system-packages build --no-tests --src-dir=. cachelib` configured and installed sparsemap 0.7.0 with no CMake error (the only CMake output of note being the < 3.10 deprecation warnings from fizz and wangle, tracked in facebook/folly#2703), compiled SparseMapIndex.cpp against the new headers with -Werror on, and linked cachebench; 51 minutes at two jobs.

Manifest-only change; follow-up to https://github.com/facebook/CacheLib/issues/488/#490/https://github.com/facebook/CacheLib/issues/491. The CMake version matrix behind the platform list is in facebook/folly#2703.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

X-link: https://github.com/facebook/CacheLib/pull/493

Reviewed By: bigfootjon

Differential Revision: D120425085

Pulled By: michel-slm

fbshipit-source-id: 9802415458f4d6ba20fab21630ec9047d7ba45d5
2026-09-16 18:55:03 -07:00
Haixia Shi
20278bfe62 Fix duplicate Content-Length in ResponseBuilder
Summary:
https://fb.workplace.com/groups/proxygendevelopers/posts/3993434290963932

A handler that sets its own Content-Length and then sends a complete response silently loses compression due to duplicate Content-Length.

Full chain of events:

(1) The handler sets Content-Length on the response.

(2) On the non-chunked path ResponseBuilder::send() appends a second one instead of replacing it, so the message now carries two values.

https://www.internalfb.com/code/fbsource/fbcode/proxygen/httpserver/ResponseBuilder.h?lines=161

(3) HTTPHeaders::getSingleOrEmpty returns an empty string for a multi-valued header, so isMinimumCompressibleSize reads the length as 0.

https://www.internalfb.com/code/fbsource/fbcode/proxygen/lib/utils/CompressionFilterUtils.h?lines=96-106

(4) The size test therefore fails and shouldCompress returns false, whatever the real body size.

https://www.internalfb.com/code/fbsource/fbcode/proxygen/lib/utils/CompressionFilterUtils.h?lines=91-92

(5) The response goes out uncompressed. The codec collapses the duplicate to a single value on the wire, so the response looks correct to the client and nothing is logged.

The chunked path never hits this, because ResponseBuilder sets no Content-Length there and the getIsChunked() arm short-circuits the size test. That is why the parent diff is still required: disabling it makes the chunked case regress immediately.

Fix is to treat the field as a singleton.

Reviewed By: hanidamlaj

Differential Revision: D120387888

fbshipit-source-id: 0c7e89df5deb02f9a4346c7bf1e01a8d45f478b4
2026-09-16 18:53:32 -07:00
Pranchal Shah
1f3cc7411d wire CLI11 into the open source build
Summary: katran_tester is moving to a CLI11 command interface, so the getdeps build needs CLI11 installed and KatranTesterCli.cpp compiled. Nothing calls it yet; the next diff adds the dispatch. Split out because edits under fbcode/opensource trigger every open source build.

Reviewed By: tagrawal03

Differential Revision: D119598499

fbshipit-source-id: 9db46020fc36e3e00f828a4b35ba725fd1a149eb
2026-09-16 18:25:31 -07:00