Summary: removes `HQSession` logic to handle push priorities, continued efforts to remove all things http push related in proxygen/lib
Reviewed By: Carl-Elkhoury, jbeshay
Differential Revision: D124184174
fbshipit-source-id: 69b156dff3203d1190fcd9856fc6c53b9c3a7ac9
Summary: removes `HQSession` logic to send push priorities, continued efforts to remove all things http push related in proxygen/lib
Reviewed By: jbeshay, Carl-Elkhoury
Differential Revision: D124186600
fbshipit-source-id: fdeb6adf10332ea2ff408291d7c2e50b974e8ab3
Summary: removes HQSession's logic to send push promises, continued efforts to remove all things http push related in proxygen/lib
Reviewed By: jbeshay, Carl-Elkhoury
Differential Revision: D124180502
fbshipit-source-id: 01cb5ecb731a81cbdd27fb5ac9cec799241f7f27
Summary:
`TestShutdownWithIdleConns` flakes under TSAN: proxygend exits with status 66 after reporting a data race. All 36 of its failures in the last two weeks have the same report:
- Main thread: at the hard shutdown timeout, `Proxygen::forceStop()` calls `RequestWorkerThread::forceStop()`, which calls `EventBase::terminateLoopSoon()` on the worker's `EventBase`. That reads the plain `strictLoopThread_` field.
- Worker thread: observes `stop_`, exits its loop, and `IOThreadPoolExecutor::threadRun()` immediately destroys the `EventBase`. The first statement of `~EventBase()` writes `strictLoopThread_`.
`stop_` is a relaxed atomic, so nothing makes a cross-thread `terminateLoopSoon()` happen-before the destruction it triggers. It only shows up when the worker is busy and sees `stop_` before it consumes the wakeup message, hence the flakiness. `~EventBase()` requires every method call to happen before destruction starts, and `IOThreadPoolExecutor` serializes its own `terminateLoopSoon()` against destruction with `eventBaseShutdownMutex_`. `RequestWorkerThread::forceStop()` bypasses that.
Fix: post `terminateLoopSoon()` to the worker's own loop with `runInEventBaseThread()`. The loop thread then sets `stop_` itself, so the call is sequenced before the loop exit and the destructor on the same thread.
Why this is safe:
- The cross-thread part is now just `runInEventBaseThread()`: an atomic `loopTid_` load and a notification queue push (atomic CAS plus an eventfd write on fds set at construction). `~EventBase()` touches none of that state until all keepalives are released. `runImmediatelyOrRunInEventBaseThread()` would not work, since its `isInEventBaseThread()` check reads `strictLoopThread_`.
- The `EventBase` is alive while the message is posted. `Proxygen::forceStop()` holds `workersLock_`, and a worker only leaves `workers_` from its `VirtualEventBase` destruction callback, which runs inside `~EventBase()` before the `VirtualEventBase` releases its keepalive on the `EventBase`. `Proxygen` also holds `workerKeepAlives_` until after its main loop stops.
- The posted callback always runs. Normally it runs in the loop: proxygen's post-stop drain `loop()` is pinned by those keepalives and only exits through this stop. If the loop has already exited, `~EventBase()` runs it from its keepalive loop or `queue_->drain()`, which drains until empty, including messages enqueued while draining. `terminateLoopSoon()` is harmless there.
- The only behavior change is ordering: the stop now queues behind any work already posted to the worker, so that work runs in the loop instead of possibly being deferred to the destructor. The stop is delayed by at most a loop iteration.
The same race causes 9 of the 25 recent failures of `TestShutdownSendingrequestsDuringAfterShutdown`.
Differential Revision: D125544299
fbshipit-source-id: 1b2aae0a56c7b034dd7c1aa4bd51180a3430531d
Summary: if the application invokes ::setHandler(nullptr) return early after invoking ::closeSession rather than falling thru to next instruction
Reviewed By: Carl-Elkhoury, gaurav-karna
Differential Revision: D125035603
fbshipit-source-id: 058366ea3954c4d03cd1c665828257c64253aa54
Summary: Add getdeps CI for `metaroce`: a build manifest, a GitHub Actions workflow with sccache and a 180-minute timeout (cold builds take ~90 min), and a `BUILD_TESTS` CMake option for the leaf test suite. Folly, fmt, and glog are built shared for the preload interposer.
Reviewed By: bsorrells
Differential Revision: D125028728
fbshipit-source-id: 5d9416863c991727fd353e7cc272e0673ff86c01
Summary:
The fbthrift macOS GitHub workflow (`getdeps_mac.yml`) builds with Homebrew LLVM, now Clang 23.1.0, and has failed on every run since mid-September because Google Benchmark 1.8.0 doesn't compile with it:
```
benchmark.h:1408: error: '__COUNTER__' is a C2y extension [-Werror,-Wc2y-extensions]
```
Benchmark always builds itself with `-pedantic-errors`, so `BENCHMARK_ENABLE_WERROR=OFF` wouldn't help. Upstream fixed this in v1.9.5 (https://github.com/google/benchmark/pull/2108) by suppressing `-Wc2y-extensions` around the `__COUNTER__` check, so update the manifest to that release. The rest of the manifest is unchanged, and `.lfs-pointers` gains the entry for the new archive.
Fixing it here in `fbcode_builder` fixes every getdeps project, since `build/fbcode_builder` is synced from it. In fbthrift, benchmark is used only by `thrift/lib/cpp2/test/ProtocolBench.cpp`, which uses just the basic API.
Reviewed By: genevievehelsel
Differential Revision: D125518574
fbshipit-source-id: ca2d74ecf1902329db8e19ffabf223186e0a3acf
Summary: removes all derived classes of HTTPPushTransactionHandler, as http push is no longer enabled / support in proxygen/lib
Reviewed By: Carl-Elkhoury, SUJP123
Differential Revision: D124177933
fbshipit-source-id: 27b25418085d95c04283cf3a995ef0cbc928eb7a
Summary:
isPushed is always false now that we've removed push support in proxygen/lib
this simplifies all the gated conditions on isPushed
Reviewed By: jbeshay, Carl-Elkhoury
Differential Revision: D124175915
fbshipit-source-id: f8bb91d143da3051066e1c1bf585be0f8695471f
Summary:
Fixes the two getdeps regressions that break the BGP++ OSS builds (`fboss-oss-build-bgp`, `fboss-oss-build-bgp-bb`) and FBOSS OSS builds that build dependencies from HEAD. They ship together because either fix alone still leaves `fboss-oss-build-ondiff` red on the other.
libiberty: getdeps-built libiberty installs its headers but no `libiberty.a`, so `fbthrift-python` configure fails with `Could NOT find Libiberty (missing: LIBIBERTY_LIBRARY)`. `AutoconfBuilder` adds `--disable-shared` when a manifest passes neither shared flag, and libiberty's configure then empties `PICFLAG`, so `pic/libiberty.a` is never built and `libiberty_install_pic_lib.patch` copies nothing while the install still exits 0. The miss was silent until D125047475 renamed the package in `FindLibiberty.cmake` to `Libiberty`, which made `find_package(Libiberty REQUIRED)` in fbthrift enforce REQUIRED. Passing `--enable-shared` keeps `PICFLAG`; libiberty builds no shared library either way.
glog: since D124075105 made glog static by default, the `-python` shared libraries built on `folly-python` each embed a copy of glog, and every copy registers its flags with the one shared gflags, so test binaries abort with `linked both statically and dynamically`. glog's `[cmake.defines.feature_shared_libs=on]` could never turn on because glog declared no features. This declares `shared_libs` in glog and requests it from `folly-python`; getdeps unions features per project, so graphs that contain `folly-python` (`bgp`, `fboss`) get one shared glog, and graphs without it (`cachelib`, `mcrouter`, `folly`, `fbthrift`) keep static glog.
Reviewed By: yfeldblum, shitanshu-shah
Differential Revision: D125332467
fbshipit-source-id: 4ff0cb077de91afc86f79f09e1ab6b15fac2c7f0
Summary: As per the previous diff, no one invokes newPushedTransaction on the underlying transport (http/2 or http/3). This removes all derived implementations as we continue work to deprecate http PUSH in proxygen/lib
Reviewed By: rohilverma, Carl-Elkhoury
Differential Revision: D124150150
fbshipit-source-id: 16f1d167a1c287cbec95aa798a4c2ca829f69cb4
Summary:
* continued efforts to remove all things http push related from proxygen/lib
* this changeset removes the HttpTxn::newPushedTransaction & co
Reviewed By: Carl-Elkhoury
Differential Revision: D124150143
fbshipit-source-id: 23c017cc2f4c728fb3201a7903c3e68b156eab5f
Summary:
Follow-up to the `FindZstd.cmake` fix. CMake emits an author warning when the package name passed to `find_package_handle_standard_args()` does not exactly (case-sensitively) match the name used in `find_package()`. Fix the remaining modules:
- folly: `FindSnappy`, `FindLibDwarf`, `FindLibAIO`, `FindLibUring`, `FindLibsodium`, `FindLibiberty`, `FindFmt`
- fbcode_builder: `FindGflags`, `FindRe2`, `FindLibiberty`
`find_package_handle_standard_args` also sets the upper-case `<NAME>_FOUND`, so `SNAPPY_FOUND`, `LIBDWARF_FOUND`, `LIBAIO_FOUND`, etc. are unchanged. The exception is `FindFmt`, which used `LIBFMT_FOUND`; it now checks `FMT_FOUND` (`LIBFMT_FOUND` had no other users). In `FindGflags` all exported `_FOUND` variables are derived from `GFLAGS_FOUND`, which is still set.
Reviewed By: genevievehelsel
Differential Revision: D125047475
fbshipit-source-id: 38b4eff058091525e249fc3cf39331582d396ba0
Summary:
# Context
A joining FETCH can arrive while its SUBSCRIBE is still being established. With draft 18 request streams, it can also arrive before the SUBSCRIBE itself. Dispatching it immediately can lose the subscription's track and joining location.
# This Diff
Hold dependent FETCH requests until the subscription is established, fail them when it fails, and release them on cancellation. Bound the dependency queue and time out unseen draft 18 IDs; binding the SUBSCRIBE disarms that timeout. Enforce the older drafts' Largest Object subscription requirement. A FETCH held for a PUBLISH resumes only after the publisher's PUBLISH reply, so a relay has recorded the subscription before it is asked to serve the join.
Before the FETCH data stream exists, a write that cannot open the stream is accepted and reports BLOCKED, matching how MoQCache treats BLOCKED; master dropped that write. Readiness before the first write is immediate, and only held writes wait for credit, because proxygen's HTTP/3 WebTransport cannot wait for stream credit; a write held on that transport still needs it. The held data goes out once uni stream credit arrives, whether or not the producer waits for readiness again, and a FETCH that is cancelled or reset gives up its credit wait. `MoQConsumers.h` now states that BLOCKED means the call was accepted and that accepted data is delivered. Forwarding a FETCH between sessions still ends it when the downstream consumer reports BLOCKED, as on master. Every credit wait on the session, including a track publisher's, shares one transport waiter, because a raw QUIC transport accepts only one at a time.
Use master's request cancellation machinery and retain its OperationCancelled contract. Extend the fake transport to test reordered request streams and blocked readiness.
# This Stack
1. Forwarding range and subgroup lifetime fixes.
2. **Session joining dependencies and FETCH readiness.**
3. Bounded group cache and paced replay.
4. MoQProxy integration and end-to-end joining tests.
5. MoQProxy server and end-to-end conformance runs.
Reviewed By: sharmafb
Differential Revision: D123890447
fbshipit-source-id: 4a9f70c10b825e529fdf0a3372b08bbac9774aec
Summary:
Once libc++ stops restoring the C++20-removed `std::allocator` members
(the next diff), short `std::string` globals become constant-initializable.
Together with `-fc++-static-destructors=thread-local`, which every
Android build uses, these globals then need no dynamic initialization at
all. `[[clang::lazy_init]]` on them did nothing useful, and for `const`
ones it was the cause of the runtime crashes in T292366087: clang
emitted the object into `.rodata` while its `.lazyinit` function still
constructed into it. The previous diff makes the lazy_init attribute a
compile error in these cases, and this diff removes all problematic
annotations in preparation for relanding the libc++ change.
Note that a few of these (e.g. `BaseState::EMPTY`, a `const std::shared_ptr`
initialized to `nullptr`) are constant-initialized even without the
libc++ change, so they were already emitted read-only with a `.lazyinit`
that writes to them.
Reviewed By: thevinster
Differential Revision: D124853598
fbshipit-source-id: 3a68867481bb09002cc0d86e406ec013e7d42c1c
Summary:
Like `FindXxhash.cmake` in the parent diff, `thrift/cmake/FindZstd.cmake` duplicated `build/fbcode_builder/CMake/FindZstd.cmake` but defined a `zstd::zstd` imported target. Move the target into the fbcode_builder module and remove thrift's copy. fbthrift now installs the fbcode_builder module next to `FBThriftConfig.cmake`.
The target takes its locations from `ZSTD_LIBRARY_RELEASE` and `ZSTD_LIBRARY_DEBUG`, not `ZSTD_LIBRARY`, because when both are found `ZSTD_LIBRARY` is an `optimized;...;debug;...` list, which isn't a valid `IMPORTED_LOCATION`.
The fbcode_builder module sets `ZSTD_INCLUDE_DIR` rather than `ZSTD_INCLUDE_DIRS`, so `thrift/lib/python` now reads that. It also has no `ZSTD_ROOT` hints; CMake's `<PackageName>_ROOT` handling covers that use (`Zstd_ROOT`, and `ZSTD_ROOT` from CMake 3.27).
folly, fizz and cachelib, the other users of the module, use the `ZSTD_*` variables and don't define `zstd::zstd`, so the guarded target doesn't affect them.
Reviewed By: iahs
Differential Revision: D123973126
fbshipit-source-id: 4621c354feef03db1af707bd33eef056ac96a43d
Summary:
Order of arguments are unspecified and can be evaluated in any order. This fixes (and simplifies) ::makeHTTPRequestSource
reported by mavam on github in https://github.com/facebook/proxygen/issues/642
___
landed-with-radar-review
Differential Revision: D124836672
fbshipit-source-id: 1e92616c49480f3eecb15e746974cca616a4edda
Summary:
CentOS Stream 10 and EPEL 10 carry nearly everything `cachelib`
needs, but the manifests only map most of these libraries for
`distro=fedora`, so `getdeps` builds `fmt`, `gflags`, `googletest`,
`benchmark` and `Boost` from source there for no reason. Two mappings
are also wrong for EL 10 rather than merely missing: it ships
`zlib-ng` under the compat names like Fedora, not the plain
`zlib-devel`/`zlib-static` the "not fedora" section assumes, and it has
no `lz4-static` at all, which the selector only excluded for EL 8
and 9.
This diff selects on the `rhel` family rather than naming CentOS
Stream, spelling the mappings as "Fedora, or the `rhel` family other
than 8 and 9", so Alma, Rocky and RHEL itself get them and EL 11 needs
no further edit.
Two libraries stay unmapped outside Fedora because EPEL's versions are
too old for the revisions pinned here: `glog`, where EPEL 9 and 10 both
have 0.3.5 against a post-0.6.0 commit, and `fast_float`, where
EPEL 10's 6.1.6 lacks the `parse_options_t` constructor folly's
`Conv.cpp` uses (found by building:
https://koji.fedoraproject.org/koji/taskinfo?taskID=151005880).
`install-system-deps --dry-run --recursive cachelib` now asks for 35
packages on `centos_stream` 10, the Fedora list minus `glog-devel`,
`fast_float-devel` and `lz4-static`, and all of them exist in CentOS
Stream 10 or EPEL 10. The `centos_stream` 9 and 8 lists are unchanged:
9 still takes `zlib-devel` and `zlib-static` and builds the rest, 8
still takes the `boost169` compat packages.
The `glog` manifest also set `BUILD_SHARED_LIBS=ON` unconditionally,
while `folly` and `fbthrift` set it only under
`feature_shared_libs=on`. A static build therefore still linked a
shared `libglog`, and the manifest's own patchfile comment already
assumes the opposite ("default-visibility symbols in a static archive
are harmless for consumers that don't need the shared_libs feature").
It shows up downstream: the Fedora and EPEL packages of `cachelib` and
`mcrouter` ship executables with the whole stack linked statically and
no libraries at all, yet came out requiring `libglog.so.1`, which
nothing installs. On EPEL 10 that is not even satisfiable, since its
`glog` is 0.3.5 and provides `libglog.so.0`.
This diff moves the define under `feature_shared_libs=on`, as the
other two do, so `--shared-lib` still gets a shared `glog` and everyone
else gets a static one.
Origin: verified on fork branch `michel-slm/CacheLib`
`getdeps-el10-rpm-mappings`, commits `1aef1670` (EL 10 mappings) and
`6ad39916` (`glog` shared default); imported here for ShipIt export.
Reviewed By: yfeldblum
Differential Revision: D124075105
fbshipit-source-id: 4279b1bf9fe58165fcca44333ef3ac3250d16bcc
Summary:
# If this diff is causing a binary size regression, use D124217395 to exclude the additional dependency.
Previously,
- the `CertVerifyLogFn` was set through [ConnectionParams](https://www.internalfb.com/code/fbsource/[46fc8abb7ed7755e15fdfe51a4be37085bbde2ce]/fbcode/proxygen/lib/http/coro/client/HTTPCoroConnector.h?lines=181) exposed to the client. The top level API [HttpService.cpp](https://www.internalfb.com/code/fbsource/[bb37dfa277d43b4f3b5957f6f8d7e5bba8379b0b]/fbcode/proxygen/facebook/lib/http/client/HttpService.cpp?lines=354-355) sets this field, because that's where this library on all internal the facebook dependencies.
This diff
- Makes use of the `CertVerificationHooks`, which has different content for
- `coro/facebook/CertVerificationHooks.cpp` and
- `coro/client/CertVerificationHooks.cpp`
- so `HTTPCoroConnector.cpp` can directly use facebook scuba logger for fbcode builds. This way all fbcode builds of this library will have scuba logging, not just the clients directly using `HttpService.cpp`, to prevent things like S713385 from happening.
This diff might cause some clients to have increase binary size because off added binary dependency. D124217395 allows clients to opt out from this dependency.
- This change is necessary for us to have comprehensive logging coverage.
- The usual trick of "weak symbol that is set in //common/init or pulled in through configerator" _may_ miss some things.
Reviewed By: mingtaoy
Differential Revision: D123730004
fbshipit-source-id: dc71bc8001a4c4f2480b267efda6d0b94c5f8738
Summary:
Clean Ubuntu builds fail because `bpftool` needs `llvm-strip`, socket-lb retains an unused `<numa.h>` include and libnuma link dependency, and `FileLock.h` uses `nanosleep` without declaring it.
Install `llvm` through socket-lb's Debian package list, remove the unused libnuma dependency from its CMake/getdeps build, and include `<time.h>`. Regenerate the GitHub workflow to remove the obsolete NUMA fetch step and correct the dependency documentation. NUMA routing continues to use caller-supplied CPU-to-NUMA mappings; the internal BUCK dependency remains unchanged.
Failing GitHub job: https://github.com/facebookincubator/socket-lb/actions/runs/37864986872/job/113609474538
Reviewed By: dzhdhr
Differential Revision: D124231954
fbshipit-source-id: 59d39ab9bc3b351dfa5f4bfd30f27676d2fbc661
Summary:
`thrift/cmake/FindXxhash.cmake` duplicated `build/fbcode_builder/CMake/FindXxhash.cmake`, differing only in the `Xxhash::xxhash` imported target it defines. Move that target into the fbcode_builder module and remove thrift's copy. fbthrift now installs the fbcode_builder module next to `FBThriftConfig.cmake`, as it already does for `FindGflags`, `FindGlog` and `FindLibUnwind`.
The only other user of the fbcode_builder module, cachelib, reads `Xxhash_LIBRARY` and doesn't define `Xxhash::xxhash` itself, so the new target can't collide with it.
Reviewed By: createdbysk
Differential Revision: D123971195
fbshipit-source-id: 18474a61011d23d7374c04208b18febaee0ed1af
Summary:
## What
- `opensource/fbcode_builder/manifests/packsim`: `[github.actions] timeout_minutes` goes from 180 to 300, and the comment above it gives the reason and drops the claim that openssl is built from source (its manifest uses the system package on Linux).
- `ai_simulation/.github/workflows/getdeps_linux.yml`: regenerated from the manifest with packsim's usual generator flags; the only change is `timeout-minutes: 300`.
## Why
A cold run builds boost, folly and fbthrift from source, then compiles every packsim unit test and runs all but the heavy ones. Scaled from local build times, that is estimated at 2 to 3 hours on a 2-core runner with an empty cache, too close to the old 180-minute limit. 300 stays under GitHub's 360-minute job limit and can be lowered once green runs report real figures.
Differential Revision: D124256112
fbshipit-source-id: edbee764fe837f5b4f8cd5356e2866813788f5b3
Summary: Adds in-memory PEM alternatives to the file-path client cert/key fields in `HTTPCoroConnector::TLSParams`, so callers can supply client cert material that is already in memory (e.g. a per-connection client cert) without staging it on disk.
Reviewed By: jalopezsilva
Differential Revision: D112883930
fbshipit-source-id: 4675d0fd83df4e329a286aa983fc5d130e82be76
Summary:
A fresh socket-lb GitHub runner fails in `Fetch bpftool`: getdeps clones the default branch with `--depth=1`, then runs `git rev-parse v7.4.0` before fetching that tag. Set the manifest's `branch` to the existing `v7.4.0` pin so the initial shallow clone contains the requested release.
The dependency version and build configuration are unchanged.
Failing run: https://github.com/facebookincubator/socket-lb/actions/runs/37854893377/job/113576600015
Reviewed By: dzhdhr
Differential Revision: D124210806
fbshipit-source-id: a6822082eb5620b2eb27837e0289ded74a03c2da
Summary: all HttpTxnHandler::onPushedTransaction overrides have been removed from the codebase, so deleting the default no-op implementation in HttpTxnHandler base class
Differential Revision: D124145825
fbshipit-source-id: 2c9bdf1bc93b371bd28713958891faa641832b19
Summary:
> Note: FBThriftPython is only used by FBOSS builds, so this diff does not affect any other existing getdeps projects.
# Context
`add_fb_thrift_python_executable()` discovers the FBThrift wheel through `thrift.__file__`, but `thrift` is a namespace package and has no concrete file. The helper also packages `thrift/python` without auditwheel's `thrift.libs`, so native extensions can fail to load their Folly dependencies.
# Mitigation
Locate site-packages through the concrete `thrift.python.types` module with `PYTHONPATH` unset. Validate and package both `thrift/python` and `thrift.libs`, and remove existing runtime links before recreating them so rebuilds remain safe.
Reviewed By: AarjunC
Differential Revision: D123128835
fbshipit-source-id: 66a371f4689b3a432e1d8c25a9bc97d51ccba248
Summary:
Some vendor SAI SDKs generate Python wrappers as part of their build and require SWIG 3, while distributions only package SWIG 4. This pins upstream SWIG 3.0.12 and backports the Python 3 fixes upstream only shipped in SWIG 4, so an SDK build can take it from getdeps rather than a hand-built copy.
Nothing depends on it; FBOSS itself does not need SWIG.
Reviewed By: srikrishnagopu
Differential Revision: D123481792
fbshipit-source-id: c72667ef03c8c1918e65810e7aaea3d6f8b394da
Summary:
Continuing the http/2 and http/3 PUSH deprecation in proxygen/lib --
This diff removes all overrides of ::newPushedResponse & adds a default implementation in ResponseHandler that returns a kUnknownError
Reviewed By: Jason-M-Fugate
Differential Revision: D121245124
fbshipit-source-id: 917b1434e5b3d390a2a8f6b5ffd7f7ed6d199db4
Summary:
Pull Request resolved: https://github.com/facebook/proxygen/pull/650
c-ares 1.34.7 made `ares_callback`'s buffer const; 1.34.8 reverted it (c-ares #1245). Only 1.34.7 has the const signature, so gate on it exactly rather than >=.
Fixes https://github.com/facebook/proxygen/issues/649
#proxygen
Reviewed By: sandarsh
Differential Revision: D123498859
fbshipit-source-id: 4debc027416932343df5e1178fba7e6c6833859e
Summary:
The result is the same for every input. This is effectively a refactor.
`proxygen::validateURL` (`lib/utils/UtilInl.h`) checked a URL one byte at a time and returned at the first control byte, space, DEL or, in `STRICT` mode, byte above 0x7f.
Thjs early return keeps clang from vectorizing the loop. Each mode now has its own loop that combines the per-byte test over the whole URL with `&` and returns once at the end, so both loops vectorize.
The only difference is that an invalid URL is scanned to its end, which is rare and still fast.
**Benchmark.** Temporary harness, not committed: `mode/opt` without a profile, 4,096 printable URL-like strings per length band, warm and interleaved, median of 7 runs.
| URL length | `STRICT`, old → new | `STRICT_COMPAT`, old → new |
|---|---|---|
| 20-40 B | 27.8 → 8.0 ns | 28.5 → 8.6 ns |
| 60-120 B | 70.8 → 9.6 ns | 71.3 → 10.6 ns |
| 120-300 B | 155.0 → 10.9 ns | 155.1 → 12.2 ns |
| 300-1000 B | 467.5 → 17.5 ns | 465.2 → 21.4 ns |
Reviewed By: bemasc
Differential Revision: D122863955
fbshipit-source-id: 4553ffe97210c9909fbc5a60735366bc561e6496