1. 18 Dec, 2020 4 commits
    • Alfred Fuller's avatar
      Fix include order and grouping in folly - 10/13 · 376557bb
      Alfred Fuller authored
      Summary: All changes were automated
      
      Reviewed By: Orvid
      
      Differential Revision: D25507575
      
      fbshipit-source-id: cbddef5a79008d9bf8b6e0234e6433084e5d8df9
      376557bb
    • Orvid King's avatar
      Remove vim edit modes from the 4 files that have them · 5a51004b
      Orvid King authored
      Summary: These are the only files out of hundreds in folly that have them, so just remove them entirely.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D25612198
      
      fbshipit-source-id: 88d4f5c2ffa08d45d0a901c9ef874cddc2730291
      5a51004b
    • Maged Michael's avatar
      hazptr: Reduce noisy logging · f8dbfec6
      Maged Michael authored
      Summary: Eliminate noisy log message and provide the intended deadlock clue in a function name.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D25627130
      
      fbshipit-source-id: 8d92007d4fa7eff1efb5857f7f49bebde2d59b70
      f8dbfec6
    • Orvid King's avatar
      Rename a couple of tests for consistency · 8b6ee86f
      Orvid King authored
      Summary: Specifically, ending in Test, singular, and reflecting the file being tested in full.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D25612187
      
      fbshipit-source-id: 514477e08b9e231d8574cae19640717b689b7d56
      8b6ee86f
  2. 17 Dec, 2020 5 commits
  3. 16 Dec, 2020 3 commits
    • Misha Shneerson's avatar
      metered scheduling executor adapter · 2b32e9c1
      Misha Shneerson authored
      Summary:
      Motivation: we sometimes need to add concept of lower priorities on top of executors which provide custom scheduling via custom APIs such `EDFThreadPoolExecutor`.
      
      This adapter wraps an arbitrary executor, and adds an additional queue. Tasks from this queue will be fetched and placed on the wrapped executor's queue in a metered fashion - in particular we only allow up to "maxReadAtOnce" tasks to be placed onto the main executors queue.
      
      Once work is added to metered queue, the adapter schedules callback into the wrapped executor. When callback is executed it:
      1) fetches head task from the queue
      2) fetches up to maxReadAtOnce - 1, and reschedules those onto the main executor.
      3) reschedules itself onto the main executor
      4) executes the task fetched at stage 1.
      
      While in theory this algorithm does not provide strong priority guarantees, in practice lower priority tasks are almost always yielding to the higher priority tasks.
      
      This primitive also allows interesting compositions to be built:
      1. multiple priorities scheduling can be achieved by chaining metered adapters.
      2. Fair queue scheduling (e.g. round robin consumption from N queues) can be achieved by creating N metered adapters wrapping the same executor.
      
      (Note: this ignores all push blocking failures!)
      
      Reviewed By: prshreshtha
      
      Differential Revision: D24983861
      
      fbshipit-source-id: 1a4ce61fc7cc706889da9724de71822bfaab440b
      2b32e9c1
    • Nanshu Chen's avatar
      make IOBuf.__iter__ yield Python builtin memoryview · 90f04fa1
      Nanshu Chen authored
      Summary:
      So it may be easier to use in Python code.
      
      A lot of Python code will check the type with this:
      ```
      if isinstance(obj, (bytes, memoryview)):
        ...
      ```
      
      Currently, the `IOBuf.__iter__` returns a `cython.view.memoryview` c-type (which can be only "cimport" in cython but not able to "import), and to make it useable in scenarios like above, we have to explicitly cast it to builtin `memoryview`.
      
      With this change, the use of the iterator is more natural.
      
      Reviewed By: fried
      
      Differential Revision: D25577842
      
      fbshipit-source-id: 6b22028d06bba639fca32f7de3a063e1fb1baa15
      90f04fa1
    • Nikita Lutsenko's avatar
      folly | benchmark | Add support to run benchmarks and get a list of results for custom printing. · b1433701
      Nikita Lutsenko authored
      Summary:
      Benchmarks are great, but are missing parts that allows them to be run outside of raw binary, like in mobile context, where we generally want to showcase the list of results, instead of pretty printing them to stdout.
      To allow for that - adding a new public API, and restructuring few things, to code dedupe and still maintain the same functionality.
      
      Reviewed By: Orvid
      
      Differential Revision: D25552087
      
      fbshipit-source-id: 946a9fbcac3faff0a69f3d86d20f3621649c7e5a
      b1433701
  4. 15 Dec, 2020 4 commits
    • Andrew Huang's avatar
      Replace old AsyncSSLSocket session API with V2 · ffc3227f
      Andrew Huang authored
      Summary:
      This new API has a few benefits:
      1. It allows `getSSLSession` to support TLS 1.3 session resumption by returning a mutable session wrapper as opposed to the immutable `SSL_SESSION*` object.
      2. OpenSSL `SSL_SESSION*` objects require the caller to keep accurate reference counts. Failure to do so can result in memory leaks or use-after-free errors.
      3. This design abstracts away OpenSSL internals, which are unnecessary for the caller to perform session resumption.
      
      Reviewed By: mingtaoy
      
      Differential Revision: D24239802
      
      fbshipit-source-id: cd3e90217717394f32dc6a2281e7a40c805990b2
      ffc3227f
    • Pranjal Raihan's avatar
      Expose folly::observer::waitForAllUpdates as public API · 0cb5aa0f
      Pranjal Raihan authored
      Summary:
      In most cases, `folly::observer::waitForAllUpdates` should not be needed. However, the asynchronous nature of observers break some basic assumptions that most users expect. Such as:
      ```
      thing.set(value);
      EXPECT_EQ(thing.get(), value);
      ```
      If `thing` is using `folly::observer` underneath the hood, the asynchrony is passed on to the user which is very easy to overlook, leading to bugs. The API of `thing` might want to enforce that when `thing.set` returns, all observed values will have been updated.
      Blocking is a perfectly okay solution in cases we don't expect an observer to be updated frequently.
      
      Differential Revision: D25542376
      
      fbshipit-source-id: c83909807fbf36e0311a45b667da94c43751a1da
      0cb5aa0f
    • Shai Szulanski's avatar
      Add co_result support to AsyncGenerator · e8aa07ff
      Shai Szulanski authored
      Summary: Mirrors Task. One behavioral difference is that yielding an empty Try from a Task converts into a UsingUninitializedTry exception, while for AsyncGenerator it converts into a return. This is for consistency with Thrift's ClientBufferedStream to avoid confusing users, but there is also an argument for converting to UsingUninitializedTry instead.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D25379361
      
      fbshipit-source-id: 2a2878185696566b29345c99fee7ba74bef4ae8a
      e8aa07ff
    • Pranav Thulasiram Bhat's avatar
      Python error handling · 41f4344c
      Pranav Thulasiram Bhat authored
      Summary:
      This diff introduces a generic abstraction to convert a python error (set by a C-API call) into an informative C++ exception.
      
      The main motivation for this is to improve the error handling behavior when dealing with failed cython api module imports.
      
      This diff adds one callsite to the new abstraction in fiber.cpp  to demonstrate its usage.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D25469594
      
      fbshipit-source-id: e9f83c06460f35fa76030ceae9726297276db850
      41f4344c
  5. 14 Dec, 2020 1 commit
    • Daan De Meyer's avatar
      Extend AsyncPipe with SingleProducer template parameter. · ab42eb8f
      Daan De Meyer authored
      Summary:
      When SingleProducer is disabled, AsyncPipe's method becomes thread-safe
      and can be called by multiple threads simultaneously. This is useful
      in a use case where a long running operation is being executed by
      multiple threads that all want to post status updates to the same
      AsyncPipe instance.
      
      Reviewed By: iahs
      
      Differential Revision: D25494695
      
      fbshipit-source-id: 1d0a74ec69dc8f64c171e21be612d211919cda4b
      ab42eb8f
  6. 12 Dec, 2020 1 commit
  7. 11 Dec, 2020 7 commits
    • Yu Zhao's avatar
      Fix mutex lock issue at the end of tsan test · f0bada9d
      Yu Zhao authored
      Summary:
      During tsan test, sometimes annotationGuard() is called after kAnnotationMutexes is already destroyed which throws exception.
      This change fix the issue by uses Indestructible for kAnnotationMutexes, so that it is not destroyed.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D25443571
      
      fbshipit-source-id: 69411a7edc4f96ba8c7d08bd29f87ab7b2ff78ae
      f0bada9d
    • Zino Benaissa's avatar
      Make folly::small_vector friendly to compiler optimizations · 66d50da2
      Zino Benaissa authored
      Summary:
      This includes several enhancements to folly::small_vector:
      
      Eliminate overhead accessing vector elements by making heap_ points to element 0 of the vector.  To get start address only dispatch is required as shown below:
      
           value_type* data () {
             // Dispatch between heap_ or internalStorage,
             return isExtern() ? heap_ : &internalStorage_;
           }
      
      Reorganize the implementation by recording if capacity is stored internally or on the heap in "size". As a result the maximum vector size is half smaller. This is the only visible behavior change of this PR. Assuming size is 64 bits then
        - bit63 determines if vector elements are stored in internalStorage_ or externally in the heap
        - bit62 determines if vector capacity is stored internally or on the heap
        - bit61..bit0 contain the size of the vector.
      
      Reduce the overhead of updating size buy adding incrementSize functions.
      
      Tune emplace_back function and vector initialization.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D24413105
      
      fbshipit-source-id: b447704832af9c734be51aa6d23b8cb4be69a8bf
      66d50da2
    • Pranjal Raihan's avatar
      Use SharedMutex instead of MicroLock in AtomicObserver · f1c0c3c1
      Pranjal Raihan authored
      Summary:
      The initialization of `folly::MicroLock` *looks* correct. MSAN instrumentation probably needs to be disabled in its implementation.
      
      Regardless, the main point of using `folly::MicroLock` was its low memory usage (1 byte). I'm now changing it to `folly::SharedMutex` (4 bytes) which will be the same size due to alignment. Although `folly::SharedMutex` is not ideal for write-only locks, we don't care too much about write performance here.
      
      Differential Revision: D25487925
      
      fbshipit-source-id: 4c30650cf22dafbdaa9fea0c2252d29caf477d54
      f1c0c3c1
    • Eric Niebler's avatar
      use folly::void_t instead of std::void_t · 5e2a41e9
      Eric Niebler authored
      Summary: folly/Traits.h defines a `void_t` alias in the `folly::` namespace. Just use that instead of specifying the one in `std::`.
      
      Reviewed By: ispeters
      
      Differential Revision: D25483712
      
      fbshipit-source-id: 6be0435dfec600690cc90bc15fd3d2af17826173
      5e2a41e9
    • Misha Shneerson's avatar
      Allow Consumer of AtomicNotificationQueue to manage folly::RequestContext · c5d7abd5
      Misha Shneerson authored
      Reviewed By: prshreshtha
      
      Differential Revision: D25387330
      
      fbshipit-source-id: 027e04024e01d1eab938d67a2d1dfc93c9322b15
      c5d7abd5
    • Pranav Thulasiram Bhat's avatar
      Simplify getFiberManager · ebb18e1e
      Pranav Thulasiram Bhat authored
      Summary: The call-once logic in getFiberManager was unnecessarily complex. getFiberManager should only be called on main context, so use a static var initialization to implement the call-once logic (using executor.cpp as an example).
      
      Reviewed By: yfeldblum
      
      Differential Revision: D25467655
      
      fbshipit-source-id: c880b1740edf28944e772c9310f3e45f5612396d
      ebb18e1e
    • Pranav Thulasiram Bhat's avatar
      Support multiple inputs to ShallowCopyScopeGuard · 33a42353
      Pranav Thulasiram Bhat authored
      Summary:
      With the current constructor setup, overwriting multiple request datas involves chaining together multiple ShallowCopyScopeGuard. This is quite inefficient as it involves copying the requests-data/callbacks maps multiple times.
      
      This diff introduces a new variadic constructor that accepts RequestDataItems (named pair of token and data)
      
      Reviewed By: A5he
      
      Differential Revision: D25317291
      
      fbshipit-source-id: 8a9cb00a615ecf802f22727189e4dc5a0c056c73
      33a42353
  8. 10 Dec, 2020 14 commits
    • Claire (Yue) Zhang's avatar
      Change AsyncSocket::UniquePtr destructor to ReleasableDestuctor · 7d9dbc59
      Claire (Yue) Zhang authored
      Summary: Adding a new ReleasableDestructor and use it in `folly::AsyncSocket::UniquePtr`.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D25352913
      
      fbshipit-source-id: b85204688706cb82a323e37063c9a6a390ec2ee8
      7d9dbc59
    • Pranjal Raihan's avatar
      Make SimpleObservable<T> default-constructible if T is default-constructible · a484d190
      Pranjal Raihan authored
      Summary: This simplifies generic code.
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D25164246
      
      fbshipit-source-id: 4f42a2360f7ce32978360ddad63d1ca9512e6135
      a484d190
    • Pranjal Raihan's avatar
      Make SimpleObservable::getObserver const · 2e214867
      Pranjal Raihan authored
      Summary: Even though `SimpleObservable<T>::getObserver` lazily creates the observer, it has no side-effects and so it can be `const`.
      
      Differential Revision: D25146628
      
      fbshipit-source-id: f7d850aed5748a81c7cf083d489ca0d2c58be72c
      2e214867
    • Pranjal Raihan's avatar
      Allow AsyncServerSocket::setQueueTimeout to accept an Observer · ccc65a2e
      Pranjal Raihan authored
      Summary: `AsyncServerSocket::getQueueTimeout` also returns an `Observer` now.
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D25146630
      
      fbshipit-source-id: 106ffc744eb6a3c09625897e72484054e0330247
      ccc65a2e
    • Pranjal Raihan's avatar
      Use thread_local instead of FOLLY_TLS in folly::observer · 2e32138d
      Pranjal Raihan authored
      Summary:
      `FOLLY_TLS` is explicitly disabled for 32-bit iOS. Perhaps because old iOS versions did not support `__thread`.
      
      `thread_local` is standard C++11, appears to be supported by the iOS 32-bit build, and is also used in multiple places around folly already.
      
      Differential Revision: D25287484
      
      fbshipit-source-id: 2e81e275e0f1cba7bcf5239fe34d4b5eb8add6d0
      2e32138d
    • Pranjal Raihan's avatar
      Add AtomicObserver<T> · 2ae32be7
      Pranjal Raihan authored
      Summary:
      An `AtomicObserver` is a read-optimized cache for an `Observer` value using `std::atomic`. This avoids creating a `shared_ptr` on every read (atomic increment/decrement on control block). The functionality is similar to that of `TLObserver` but uses significantly less memory if `std::atomic<T>` is valid.
      
      The read path involves 2 atomic loads and a cache staleness check. A lock is used when the cache needs to be updated.
      
      Reviewed By: zhxchen17
      
      Differential Revision: D25254487
      
      fbshipit-source-id: cfaf7c328c075f9f06c5c9d2d7bb2e1987285616
      2ae32be7
    • Andrew Huang's avatar
      Add the ability to turn on non-DHE resumption for clients in TLS 1.3 · 48380667
      Andrew Huang authored
      Summary:
      Add API to allow clients to advertise support for psk_ke (non-DHE) resumption. Unfortunately, OpenSSL has no option to allow servers to support psk_ke resumption.
      
      SSL_OP_ALLOW_NO_DHE_KEX option was added in OpenSSL 1.1.1, so add the appropriate guard.
      
      Reviewed By: mingtaoy
      
      Differential Revision: D24546720
      
      fbshipit-source-id: fd7c5b3a9f4c572876f9b421ee8f74ba7d5e252c
      48380667
    • Misha Shneerson's avatar
      split AtomicNotificationQueue into pure queue and event base driven queue · 3a1cb2bc
      Misha Shneerson authored
      Summary:
      EventBaseAtomicNotificationQueue is now what used to be just AtomicNotificationQueue.
      In the future, this allows reusing AtomicNotificationQueue with other types of executors.
      
      (Note: this ignores all push blocking failures!)
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D24878180
      
      fbshipit-source-id: d719e31c7194cb2dd6d57a103814581b802a9250
      3a1cb2bc
    • Shai Szulanski's avatar
      Add conversions between folly and std optional · f8c8b74f
      Shai Szulanski authored
      Summary: These are similar enough that implicit conversion to make the migration boundary easy to manage seems justified
      
      Reviewed By: WillerZ
      
      Differential Revision: D25384005
      
      fbshipit-source-id: 4602d9016919860ff0626de4fa4ae5442fca094a
      f8c8b74f
    • Andrew Huang's avatar
      Add ability to set TLS 1.3 ciphersuites in SSLContext · a247041e
      Andrew Huang authored
      Summary: Add support for Openssl's TLS 1.3 ciphersuites API. SSL_CTX_set_ciphersuites was added in OpenSSL 1.1.1, so guard it with a prereq.
      
      Reviewed By: yfeldblum, mingtaoy
      
      Differential Revision: D24542765
      
      fbshipit-source-id: d281bb2262cd456823da1896c0c77c3ba4ab78ce
      a247041e
    • Eric Niebler's avatar
      Avoid using std::enable_shared_from_this on older stdlibs that don't support weak_from_this() · 9a1bfc69
      Eric Niebler authored
      Summary:
      Older standard libraries provide a `std::enable_shared_from_this` that doesn't have a `weak_from_this()` member, even when compiling in C++17 mode. Change the preprocessor conditional to account for this, and select the custom Folly implementation when the `std::` one is non-conforming.
      
      This change makes special accommodation for older MSVC versions, which fails to define the `__cpp_lib_enable_shared_from_this` feature test macro, but that provides a conforming `std::enable_shared_from_this` when compiling as C++17.
      
      Reviewed By: yfeldblum, ispeters
      
      Differential Revision: D25402425
      
      fbshipit-source-id: c53b9fcebbf93c54342824dd56fd11eaa681abd1
      9a1bfc69
    • Lee Howes's avatar
      Make retrying always return a SemiFuture · 175f274c
      Lee Howes authored
      Summary: Make futures::retrying return a SemiFuture and safely constrain where the work runs to avoid accidental inline execution.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D24490957
      
      fbshipit-source-id: 9b8c0f369084f2d26bbb4764abde6866fb09b4d9
      175f274c
    • Zeyi (Rice) Fan's avatar
      GitHub Action: fix Windows build · 1e90876e
      Zeyi (Rice) Fan authored
      Summary:
      Watchman's GitHub Action has been failing because of the use of `set-env` is deprecated due to security issues. See https://github.blog/changelog/2020-10-01-github-actions-deprecating-set-env-and-add-path-commands/ for details.
      
      See https://github.com/facebook/watchman/runs/1520165260?check_suite_focus=true for example of failures.
      
      To fix it we just need to write to the special environment file.
      
      Reviewed By: chadaustin
      
      Differential Revision: D25412442
      
      fbshipit-source-id: d31ef025189c8aebfa08d434d9373f5da7d4690e
      1e90876e
    • Lewis Baker's avatar
      Change Task::semi() to capture callsite of semi() in detached_task stack-trace · 5db8c175
      Lewis Baker authored
      Summary:
      The async stack-trace for a coroutine call-stack that was launched
      by calling Task<T>::semi() to create a SemiFuture would have as its
      first few frames:
      - detached_task
      - folly::coro::Task::semi::{lambda#1}::operator()
      - <the coroutine being launched>
      
      This isn't particularly useful as it doesn't tell you where the coroutine was launched from. The more interesting information here
      is the callsite of .semi() rather than the internals of .semi().
      
      This reworks the implementation of .semi() to capture the return-address
      of the call to .semi() and then later inject this as the return-address
      of the async-frame when the coroutine is eventually launched.
      
      Note: This also now launches the coroutine inline inside the SemiFuture by calling .startInlineImpl(). This should avoid an
      extra executor reschedule.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D25415029
      
      fbshipit-source-id: ab24e86b871c78e2c3a9af843e24e2dab3254273
      5db8c175
  9. 09 Dec, 2020 1 commit
    • Dan Melnic's avatar
      IoUringBackend rework · cd39f451
      Dan Melnic authored
      Summary:
      IoUringBackend rework
      
      (Note: this ignores all push blocking failures!)
      
      Reviewed By: kevin-vigor
      
      Differential Revision: D25287276
      
      fbshipit-source-id: b69cc715e8bf5da2e493a742e71a62795a62f955
      cd39f451