sapling/eden/scm/lib/http_client
Arun Kulshreshtha 0b05d4aefe http_client: add pool for Multi handles
Summary:
Add a pool of `Multi` handles that the client can reuse across requests.

Previously, `HttpClient`'s async functions had to consume the client in order to have a `'static` lifetime (since `Future`s generally cannot hold references to things outside of themselves). This meant that the each async operation would use its own `Multi` handle, preventing connection reuse across operations since the `Multi` handle maintains a connection cache internally.

With this change, the client can reuse the `Multi` session after an async operation, thereby benefitting from libcurl's caching. Note that the same `Multi` handle still cannot be used by concurrently running `Future`s (as this [would not be thread safe](https://curl.haxx.se/libcurl/c/threadsafe.html)), but once a `Future` has completed its `Multi` handle will return to the pool for use by subsequent requests.

 ---
(Somewhat tangential)

As is noted in the code comments, `libcurl`'s C API provides a way to share caches across multiple multi sessions: [the "share" interface](https://curl.haxx.se/libcurl/c/libcurl-share.html).

While using this would seems preferable to an ad-hoc solution like this diff, it turns out that the `curl` crate does not provide safe bindings to the share interface. This means that in order to use the share interface, we'd need to directly use the unsafe bindings from `curl-sys`.

In addition to the difficulty of working with unsafe FFI code, the API expects the application to handle synchronization by passing it function pointers to handle locking/unlocking shared resources.

Ultimately, I came to the conclusion that managing lifetimes and synchronization in unsafe code across an FFI boundary would be nontrivial, and ensuring correctness would require a lot of effort that could be avoided by implementing an ad-hoc solution on top of the safe API instead. However, it might make sense to change this to use the share interface in the future.

Reviewed By: quark-zju

Differential Revision: D22396026

fbshipit-source-id: 06eea2ffacdc791527eac9ce4becc457af5c0480
2020-07-09 13:08:27 -07:00
..
src http_client: add pool for Multi handles 2020-07-09 13:08:27 -07:00
Cargo.toml http_client: add pool for Multi handles 2020-07-09 13:08:27 -07:00