Summary: Add debug-gated QUIC lifecycle snapshots to distinguish stale-connection recovery from general request slowness. Requests now record connection age, last RX/TX age, signed idle-deadline distance, and timer counts at request start and completion. mvfst reports separate idle and keepalive callbacks plus overdue-deadline observations; ngtcp2 reports its unified transport timer. Recreated requests preserve the prior connection UUID so the request can be joined to the close reason and replacement connection.
Reviewed By: jbeshay
Differential Revision: D125287129
fbshipit-source-id: 921046a7ed2a6273fde59be0125dcbd8904ccaf4
Summary: New `absl` manifest fetching pinned abseil-cpp via `[git]` (dodging `[download]`'s tarball sha256), or using distro packages where new enough for `absl::log`.
Reviewed By: KevinYakar
Differential Revision: D125537549
fbshipit-source-id: 58e881f68fcc55653ca83ef3e8acad6b54eec653
Summary:
Return `PROTOCOL_VIOLATION` when an enabled DATAGRAM payload length is at or above `maxReadFrameSize`, before receive-buffer or callback changes. Propagate the error immediately through client, server and test transport callers. The disabled soft drop and ordinary delivery behavior remain intact.
Bounded preparation for AVDP issue `1758308635898503`, finding `1552320146140481`. A supported normal production trigger, harmful consumer, and exact DATAGRAM_LEN total encoded-frame overhead enforcement remain unproved. Normal production enablement advertises 65535 and no surveyed production setter lowers it; the proof directly lowers test state.
Reviewed By: jbeshay
Differential Revision: D120114221
fbshipit-source-id: fd48fb81b8aaa84f18759b5531f5fb64cded3727
Summary:
# Context
Fife authorizes connections for vDPUs, and callers punt the opening TCP SYN with `authorize` so Fife can forward it (D125621587). We need a simple client to inject that traffic by hand, and the vDPU-side client has to be open source, so this tool is too.
# Product decisions
1. `askBarney --fife_ip X --fife_port Y --cert_path C [--key_path K] --ca_path A <host> <port>` works like netcat over TCP, except it first punts the connection's SYN to Fife.
2. The punt is `authorize(local_ip, dst_ip, syn)` over mTLS. askBarney prints Fife's `decision` and `forward` to stderr. Anything other than `ALLOWED` exits 1. If allowed, it relays stdin and stdout over the connection until the server closes it.
# Code decisions
- **The kernel owns the connection.** If askBarney made up its own SYN and only Fife sent it, the server's SYN-ACK would reach a kernel with no matching socket and be reset. So askBarney starts a normal non-blocking `connect()`, captures the SYN the kernel sends with an `AF_PACKET` socket, and punts those exact bytes. Because the punted SYN has the kernel's ports and sequence number, the server's SYN-ACK completes the kernel's connection whichever copy of the SYN reached the server. The kernel's own SYN also goes out directly.
- Capturing needs `CAP_NET_RAW`, so run it as root.
- **Open source only.** It uses folly, fbthrift, fmt, gflags and `folly::Init`, has Apache-2.0 headers, and doesn't depend on Fife's internal server code. That's why the SYN matcher (`TcpSyn`) is its own small parser rather than reusing `fife/server/IpPacket`. There are no Meta-specific default paths; the certificate, key and CA are required flags. Its only internal dependency is the generated client for `fife/if/fife.thrift`, which has to be published alongside it before it can ship.
# Test listener
`fife/askbarney/listen.py` (also `buck2 run fbcode//fife/askbarney:listen`) is a standard-library-only destination for askBarney tests. It listens on `--port` (default 17172, IPv6 and IPv4), replies to each connection with `--reply`, prints everything the peer sends, and keeps serving until Ctrl-C, or one connection with `--once`. It ships with askBarney in the open-source repo.
# Open-source build
- BUCK stays for the fbcode build. The open-source build is CMake plus getdeps, the standard pattern for Meta's open-source C++. All the dependencies (folly, fbthrift, fizz, wangle, fb303) are built and consumed that way, and a Makefile would mean hand-maintaining their include and link flags plus a Thrift code-generation rule.
- `fife/askbarney/public_tld/CMakeLists.txt` becomes the open-source repo's top level. It finds the dependencies and generates the `Fife` client from `fife/if/fife.thrift` with `add_fbthrift_cpp_library`, depending on `fb303::fb303_thrift_cpp` for the `fb303_core.thrift` include. `fife/askbarney/CMakeLists.txt` builds `askBarney`, `askbarney_tcp_syn` and the test.
- `opensource/fbcode_builder/manifests/askbarney` is the getdeps manifest. It maps `public_tld` to the repo root, ships `fife/askbarney/` and only `fife.thrift` from `fife/if`, and strips BUCK files. The open-source repo mirrors the fbcode layout so generated `#include` paths (`fife/if/gen-cpp2/...`) are the same in both builds.
- Before publishing: there's no GitHub repo yet, so the manifest has no `[git]` section and only works inside fbsource. `fife.thrift` still has the internal "Confidential and proprietary" header and needs an open-source license header through the open-source review.
Reviewed By: IvanTopolcic
Differential Revision: D125707320
fbshipit-source-id: 74c83cf24f46c5b9028d662847f473afa2b3b053
Summary: `QuicServerWorker` logs an error whenever a per-connection override changes `dataPathType`. Falling back to ChainedMemory per connection is fine, since transports only use the worker's buffer with ContinuousMemory, so only log for the reverse.
Reviewed By: kvtsoy
Differential Revision: D125713045
fbshipit-source-id: fbcfc59630b23411a3498df960a7f3ef28d22362
Summary: Update the shared getdeps `libnl` source archive from 3.2.25 (July 16, 2014) to 3.11.0, including the verified SHA256 and extraction directory.
Reviewed By: gnikol
Differential Revision: D125878884
fbshipit-source-id: 765631166046d75c0f4552fe8b4b42e47c838da5
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 server built every Retry with version `MVFST_INVALID` (0xfaceb00f), computed its integrity tag with the draft-29 key, and reused the client's destination connection id as the Retry source connection id. It also never sent `retry_source_connection_id`. RFC 9000 clients drop that Retry (wrong version, or a source connection id equal to their destination connection id), and clients that verify the tag with the v1 key reject it.
Changes:
- The Retry carries the version of the client's Initial, and the integrity tag uses that version's key. `FizzRetryIntegrityTagGenerator` maps `QUIC_V1` to the RFC 9001 key and every other version to the draft-29 key, which is the same lookup mvfst clients do on the Retry's version.
- The Retry source connection id is encoded by `connIdAlgo` with the worker's params, so `QuicServer` routes the client's next Initial back to the worker that sent the Retry. The token carries the original destination connection id after the timestamp, and its AAD binds the Retry source connection id instead of the original one.
- When the client's Initial carries a valid retry token, the transport parameters carry `original_destination_connection_id` from the token and `retry_source_connection_id`. Like the other connection id parameters, these are only sent for QUIC v1 and its aliases.
- Tokens from servers that reused the client's destination connection id still validate, so Retries sent by the old process right before a takeover keep working.
Existing mvfst clients already handle this. Since 2020 they verify the tag against the original destination connection id, send their next Initial to the Retry source connection id, and check `original_destination_connection_id` against the original one, and they ignore `retry_source_connection_id`.
Reviewed By: hanidamlaj
Differential Revision: D124003057
fbshipit-source-id: b4a2a086f5587c583729254479b193a94ca6a791
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:
Validate unauthenticated Version Negotiation packets before treating them as fatal. Require exact echoed client/original-destination CIDs, no accepted Retry, absence of the original version from the full advertised list, and the current peer or an initialized unfinished Happy Eyeballs alternate. Drop invalid VN datagrams before resetting SCONE scratch state or consuming their tail. Preserve the existing `NEW_VERSION_NEGOTIATED` error for valid unsupported-version VN.
AVDP issue `1415917573830042`; findings `917912340983241` and `2957379424616478`. The production client callback path and one-connection fatal consequence are demonstrated. Public Internet reachability, TLS bypass, completed downgrade, process crash and fleet impact remain unproven. Connected UDP retains address/port, NAT/firewall and timing constraints. This unit receives no credit for separate SCONE or Retry findings.
Reviewed By: jbeshay
Differential Revision: D120092148
fbshipit-source-id: ad61e1ef3405312f39622485bf79440340c65161
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:
SCONE packets are unauthenticated, and `tryParseSconePacket` runs on any long-header datagram keyed only on the version field, so even clients with SCONE disabled parse them. A decoded SCONE packet whose destination connection ID matches none of the client's own IDs then reaches the shared DCID check and returns `PROTOCOL_VIOLATION`, closing the connection. Any unknown DCID triggers this, so a blind off-path spoofer who knows only the 4-tuple can terminate an established client connection with a single datagram.
Classify the decoded packet as SCONE before the DCID check and drop it on mismatch instead of erroring. Ordinary decoded packets keep `PROTOCOL_VIOLATION`, and the existing source-ID soft drop, rate-signal handling and qlog output are unchanged. A dropped SCONE packet still counts toward the subsequent-packet check that gates a pending rate signal; that pre-existing behavior is left alone here.
Adds socket-callback regressions for both SCONE versions, both feature states, both orders in a coalesced datagram, a valid stream tail following an unknown-DCID SCONE, and the retained ordinary-packet error.
AVDP issue: 1562333978403071
AVDP finding: 1077144131719904
AVDP issue: 1819642329045263
AVDP finding: 1630873122031582
Reviewed By: jbeshay
Differential Revision: D120087703
fbshipit-source-id: a9d8c879f4823b4078b648faf23c6b8ffd569887
Summary:
This value is used to validate new paths - using insecure rand makes the validation value predictable.
Note this is still less entropy than recommended by https://www.rfc-editor.org/info/rfc9000/#section-19.17, but the impact is limited.
Created from CodeHub with https://fburl.com/edit-in-codehub
Reviewed By: JunqiWang
Differential Revision: D125002005
fbshipit-source-id: 6c72d89b71a49dacfe0b2412c1f2c2aa81f42bda
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:
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:
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:
Reject zero-length `NEW_CONNECTION_ID` frames before adding a peer connection ID. Consume each leading `PADDING` run in one scan and retain its frame count when coalescing, avoiding repeated scans before the next frame.
The regressions exercise server packet reception, decoder cursor progress, and real encrypted QUIC v1 and MVFST Initial packets. General and long-header zero-length connection IDs remain supported.
AVDP: issue `1610034730515004` / finding `1785278742621479`; issue `1753504145979612` / finding `3168016446726929`.
Reviewed By: jbeshay
Differential Revision: D120079368
fbshipit-source-id: 3598297059d59b5bd55bad24d0f25286f101097a
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:
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:
> 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:
A token-bearing long header could exceed its packet budget after the shared encoder had already written its first byte. The encoder then continued writing with zero remaining space, so an accepted Retry with a large token aborted the next Initial on the continuous-memory path.
Check fixed fields, the token length prefix, the token itself, and deferred packet length/number before the first write. Use a subtraction-based capacity check and return `CODEC_ERROR` through the existing regular/inplace builder error paths. Add boundary and untouched-buffer tests plus a client regression with a computed valid Retry integrity tag and a successful normal Retry control.
Capping the accepted Retry and `NEW_TOKEN` token size in `QuicClientTransportLite` is out of scope here; this diff downgrades the outcome from a process abort to a connection close.
AVDP issue: 2053213891975966
AVDP finding: 1413413147587016
Reviewed By: jbeshay
Differential Revision: D120043576
fbshipit-source-id: 3da07c92683f6152e5879e052e7086e194b4ab6d
Summary: An endpoint that advertises reliable stream reset support still closes the connection with a protocol violation when the peer sends RESET_STREAM_AT. Now the frame is rejected only when the endpoint did not advertise support. The default for `advertisedReliableResetStreamSupport` stays off.
Reviewed By: jbeshay
Differential Revision: D85708325
fbshipit-source-id: 935aa856390ce335e55972b4a0b9ab89bcc479f3
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: Adds happy eyeballs tests for a version negotiation on the first socket, both before the second socket starts and after it has sent an Initial. In both cases the VN fails connection setup with `NEW_VERSION_NEGOTIATED` and neither socket writes again.
Differential Revision: D123669462
fbshipit-source-id: d29b29a4d8f3a972e701f54aa46e1c020d044c2d