1. 14 Sep, 2021 6 commits
    • Filipe Brandenburger's avatar
      Detect and enable C++ couroutine support on CMake build with GCC · 4d5b7ad4
      Filipe Brandenburger authored
      Summary:
      This change updates the CMake config to detect whether GCC's `-fcoroutines` flag is supported and enable it for the build. This is required to enable support for Folly coroutines.
      
      Followed the instructions in GCC page about C++ coroutines to get them enabled.
      https://gcc.gnu.org/wiki/cxx-coroutines
      
      NOTE: This Wiki page used to indicate that exceptions had to be disabled to enable subroutines, but this only applied to experimental support for coroutines and it's no longer the case.
      
      This was uncovered by the fbthrift build, which needs Folly coroutines to implement streaming. A new fbthrift test using a stream type uncovered this missing feature in our build on Fedora.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D30026779
      
      fbshipit-source-id: 3324c2fc52fe5db793bdaba9c81f41bfe6ef2242
      4d5b7ad4
    • Jolene Tan's avatar
      Deprecate folly::vformat · fb5c25d9
      Jolene Tan authored
      Reviewed By: vitaut
      
      Differential Revision: D30676171
      
      fbshipit-source-id: f820b1c08750c4d844925a82d5fd710bc8a1ca5c
      fb5c25d9
    • Maged Michael's avatar
      hazard pointers: Rearrange invoking asynchronous reclamation in executor · 94f01f8f
      Maged Michael authored
      Summary:
      Rearrange invoking asynchronous reclamation in executor.
      
      Eliminate the LOG message about skipping asynchronous reclamation.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D30908286
      
      fbshipit-source-id: ee79714bf8e6253a01d04c6d2ffa81895c4133c8
      94f01f8f
    • Pranjal Raihan's avatar
      Fix typo in macro: FOLLY_HAVE_SDT · 9258f5e9
      Pranjal Raihan authored
      Summary:
      `FOLLY_HAS_STD` and `FOLLY_HAVE_STD` are now `FOLLY_HAVE_SDT`.
      
      This typo reveals that the tests aren't run on platforms that don't have this feature enabled :/
      
      Reviewed By: yfeldblum
      
      Differential Revision: D30780817
      
      fbshipit-source-id: 338fdd5e5b08f3b5347609dd783f0a75506f9e30
      9258f5e9
    • Misha Shneerson's avatar
      print tid of the stalling thread. · 61e00b11
      Misha Shneerson authored
      Reviewed By: yfeldblum
      
      Differential Revision: D30914679
      
      fbshipit-source-id: 79a609ed1eda97a97e6eeeb47038a1e746b75e2d
      61e00b11
    • Huapeng Zhou's avatar
      folly: add freebind to async udp socket · a082c773
      Huapeng Zhou authored
      Summary:
      This is useful if we want to bind to a nonlocal address or an address that doesn't exist yet.
      
             IP_FREEBIND (since Linux 2.4)
                    If enabled, this boolean option allows binding to an IP
                    address that is nonlocal or does not (yet) exist.  This
                    permits listening on a socket, without requiring the
                    underlying network interface or the specified dynamic IP
                    address to be up at the time that the application is
                    trying to bind to it.  This option is the per-socket
                    equivalent of the ip_nonlocal_bind /proc interface
                    described below.
      
      Reviewed By: yfeldblum, mjoras
      
      Differential Revision: D30903919
      
      fbshipit-source-id: 09058cac1c14a4003525b0a7c5381ea301ca28da
      a082c773
  2. 11 Sep, 2021 1 commit
    • Srivatsan Ramesh's avatar
      Add co_schedule() method to AsyncScope · 83a6ce73
      Srivatsan Ramesh authored
      Summary: Adds a new method `co_schedule()` that takes a task, schedules it on the current executor and adds it to the AsyncScope.
      
      Reviewed By: andriigrynenko
      
      Differential Revision: D30005811
      
      fbshipit-source-id: 48c7aa240dc73c0b4dd54e539e620cf69c68c4fd
      83a6ce73
  3. 10 Sep, 2021 2 commits
  4. 09 Sep, 2021 5 commits
    • Aaryaman Sagar's avatar
      Handle std::vector<bool> in FanoutChannel · c0b40097
      Aaryaman Sagar authored
      Summary:
      std::vector<bool>::iterator::operator* returns a temporary proxy bool accessor
      in many implementations.  So range-based for loops over it don't work if we
      assume non-const lvalue-ref binding, eg.
      ```
      for (auto& ref : vectorBools) { ... }
      ```
      Won't compile.  Silly std::vector<bool>.
      
      Reviewed By: SmithAndr
      
      Differential Revision: D30833990
      
      fbshipit-source-id: cb8d53a48eb2a40587911ad2f0c50b99a472a59c
      c0b40097
    • Maged Michael's avatar
      hazard pointers: Shard the domain's list of untagged retired objects · 7d8dfb91
      Maged Michael authored
      Summary: Shard the domain's list of untagged retired objects.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D30806913
      
      fbshipit-source-id: 93061ebcd3f62c49eb0f96193e5961c4eeb6f061
      7d8dfb91
    • Maged Michael's avatar
      hazard pointers: Consolidate non-cohort and untagged cohort retired objects · 82f9889c
      Maged Michael authored
      Summary:
      Consolidate retired_, the list of non-cohort retired objects, with untagged_, the list of cohort untagged objects, in the domain.
      
      Eliminate redundant functions.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D30806882
      
      fbshipit-source-id: bdcbc4990a3d114f7f6bea294df498c5743bed43
      82f9889c
    • Maged Michael's avatar
      hazard pointers: Eliminate thread local lists of retired objects · b3833ef1
      Maged Michael authored
      Summary:
      Remove hazptr_priv, the thread-local list of retired objects.
      
      Non-cohort retired objects are pushed directly into the domain.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D30806863
      
      fbshipit-source-id: 526c90f5a198b4e42a55062cb7344e5286bf28fd
      b3833ef1
    • Adam Simpkins's avatar
      reflect the wangle github branch rename from master to main · 4f4c0ff8
      Adam Simpkins authored
      Summary:
      The primary branch in the GitHub wangle repository has been renamed from
      `master` to `main`.  Update the getdeps manifest to reflect this, so that
      getdeps builds correctly clone the repository.
      
      Reviewed By: xavierd
      
      Differential Revision: D30822418
      
      fbshipit-source-id: 9670fff1e85e77adf84485ff8f2236f8826630ef
      4f4c0ff8
  5. 08 Sep, 2021 5 commits
    • Lucian Grijincu's avatar
      fbcode: symbolizer: clang-12 DWARF5 emits Split DWARF inlining as... · eca99293
      Lucian Grijincu authored
      fbcode: symbolizer: clang-12 DWARF5 emits Split DWARF inlining as DW_TAG_skeleton_unit instead of DW_TAG_compile_unit
      
      Summary:
      ```name=clang-9
      $ llvm-dwarfdump --show-form buck-out/gen/aab7ed39/folly/experimental/symbolizer/test/symbolizer_test_utils_dwarf5_split_dwarf_inlining#compile-SymbolizerTestUtils.cpp.o1ef1b890\,platform009-clang/SymbolizerTestUtils.cpp.o
      .debug_info contents:
      0x00000000: Compile Unit: length = 0x00000127, format = DWARF32, version = 0x0005, unit_type = DW_UT_skeleton, abbr_offset = 0x0000, addr_size = 0x08, DWO_id = 0x7d3c88943756aebb (next unit at 0x0000012b)
      
      0x00000014: DW_TAG_compile_unit
                    DW_AT_stmt_list   (0x00000000)
                    DW_AT_str_offsets_base    (0x00000008)
                    DW_AT_comp_dir    (".")
                    DW_AT_GNU_pubnames        (true)
                    DW_AT_GNU_dwo_name        ("buck-out/dbg/gen/aab7ed39/folly/experimental/symbolizer/test/symbolizer_test_utils_dwarf5_split_dwarf_inlining#compile-SymbolizerTestUtils.cpp.o1ef1b890,platform009-clang/SymbolizerTestUtils.cpp.o")
                    DW_AT_low_pc      (0x0000000000000000)
                    DW_AT_ranges      (indexed (0x0) rangelist = 0x00000010
                       [0x0000000000000000, 0x000000000000005b)
                       [0x0000000000000000, 0x0000000000000065)
                       [0x0000000000000000, 0x000000000000005a)
                       [0x0000000000000000, 0x0000000000000065)
                       [0x0000000000000000, 0x000000000000000b)
                       [0x0000000000000000, 0x0000000000000076)
                       [0x0000000000000000, 0x0000000000000014)
                       [0x0000000000000000, 0x0000000000000065)
                       [0x0000000000000000, 0x0000000000000076)
                       [0x0000000000000000, 0x0000000000000014)
                       [0x0000000000000000, 0x0000000000000065)
                       [0x0000000000000000, 0x0000000000000085)
                       [0x0000000000000000, 0x000000000000000b))
                    DW_AT_addr_base   (0x00000008)
                    DW_AT_rnglists_base       (0x0000000c)
      
      ```
      ```name=clang-12
      $ llvm-dwarfdump --show-form buck-out/gen/aab7ed39/folly/experimental/symbolizer/test/symbolizer_test_utils_dwarf5_split_dwarf_inlining#compile-SymbolizerTestUtils.cpp.o1ef1b890\,platform009-clang-12/SymbolizerTestUtils.cpp.o
      .debug_info contents:
      0x00000000: Compile Unit: length = 0x00000127, format = DWARF32, version = 0x0005, unit_type = DW_UT_skeleton, abbr_offset = 0x0000, addr_size = 0x08, DWO_id = 0xb881aa098abf71b5 (next unit at 0x0000012b)
      
      0x00000014: DW_TAG_skeleton_unit
                    DW_AT_stmt_list [DW_FORM_sec_offset]	(0x00000000)
                    DW_AT_str_offsets_base [DW_FORM_sec_offset]	(0x00000008)
                    DW_AT_comp_dir [DW_FORM_strx1]	(".")
                    DW_AT_GNU_pubnames [DW_FORM_flag_present]	(true)
                    DW_AT_dwo_name [DW_FORM_strx1]	("buck-out/dbg/gen/aab7ed39/folly/experimental/symbolizer/test/symbolizer_test_utils_dwarf5_split_dwarf_inlining#compile-SymbolizerTestUtils.cpp.o1ef1b890,platform009-clang-12/SymbolizerTestUtils.cpp.o")
                    DW_AT_low_pc [DW_FORM_addr]	(0x0000000000000000)
                    DW_AT_ranges [DW_FORM_rnglistx]	(indexed (0x0) rangelist = 0x00000010
                       [0x0000000000000000, 0x000000000000004c)
                       [0x0000000000000000, 0x000000000000005f)
                       [0x0000000000000000, 0x0000000000000054)
                       [0x0000000000000000, 0x000000000000005f)
                       [0x0000000000000000, 0x000000000000000b)
                       [0x0000000000000000, 0x0000000000000070)
                       [0x0000000000000000, 0x0000000000000014)
                       [0x0000000000000000, 0x000000000000005f)
                       [0x0000000000000000, 0x0000000000000070)
                       [0x0000000000000000, 0x0000000000000014)
                       [0x0000000000000000, 0x000000000000005f)
                       [0x0000000000000000, 0x0000000000000086)
                       [0x0000000000000000, 0x000000000000000b))
                    DW_AT_addr_base [DW_FORM_sec_offset]	(0x00000008)
                    DW_AT_rnglists_base [DW_FORM_sec_offset]	(0x0000000c)
      ```
      
      Differential Revision: D30755400
      
      fbshipit-source-id: 6e7fd8bc9d3bef90a5195dc30dff60c489c4df35
      eca99293
    • Maged Michael's avatar
      SharedMutex: Add build-time flags for setting default spin and yield counts · 91b962e3
      Maged Michael authored
      Summary: Add build-time flags for setting default spin and yield counts.
      
      Reviewed By: fadimounir
      
      Differential Revision: D30761279
      
      fbshipit-source-id: 3b74bae438b1f87b1ca8b955bb244eb907b22891
      91b962e3
    • Nick Meyer's avatar
      Deprecate folly::svformat · 8ee373cf
      Nick Meyer authored
      Summary: Deprecate folly::svformat in favor of fmt::format
      
      Reviewed By: vitaut
      
      Differential Revision: D30521196
      
      fbshipit-source-id: 944054191bbfd296d1f666eb6ace6c4308f6d1ea
      8ee373cf
    • Maged Michael's avatar
      hazard pointers: Extend cleanup to cover cohort objects · 8ecee58a
      Maged Michael authored
      Summary:
      Extend cleanup to cover retired cohort objects.
      
      The change includes incrementing num_bulk_reclaims_ before invoking do_reclamation either directly or in an executor. The corresponding decrement is done at the completion of do_reclamation, which may happen on a different thread if reclamation is done in an executor.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D30513628
      
      fbshipit-source-id: 80227e85301274c66cc200ee5228654f1ca07d08
      8ecee58a
    • Adam Simpkins's avatar
      update the branch name for the fb303-source manifest · 58f83287
      Adam Simpkins authored
      Summary:
      The primary branch in the fb303 github repository was renamed from `master` to
      `main`.  Update the `fb303-source` manifest to reflect this.
      
      The main `fb303` manifest was already updated in D30700180 (https://github.com/facebook/folly/commit/60d9f5d791d7c6afb5f044538ae45fbe91a043e5).  The
      `fb303-source` manifest is a separate manifest that only fetches the fb303
      source code without building it.  This is only used by the `eden_scm`
      manifest.
      
      Reviewed By: fanzeyi
      
      Differential Revision: D30794650
      
      fbshipit-source-id: 0e7790f8ceb737ce2f26ab213e1f0f94c5b3f045
      58f83287
  6. 07 Sep, 2021 1 commit
    • Logan Evans's avatar
      Add a coinflip library. · d2643855
      Logan Evans authored
      Summary:
      The naive coinflip algorithm generates a random variable each time the function
      is called. We can avoid many of these calls to a random number generator by
      doing some tricky business with math stuff.
      
      See https://fb.workplace.com/groups/135724786501553/permalink/5767297086677600/
      for some discussion on the topic.
      
      The intention behind this code is that we will use it in HHVM. That's why it provides the static methods that allow the caller to supply their own storage space for the counter and their own random number generator.
      
      Reviewed By: bmaurer
      
      Differential Revision: D30440295
      
      fbshipit-source-id: ee0c3e49da3ec82a9fd6c8854b15ef107755ff39
      d2643855
  7. 05 Sep, 2021 1 commit
  8. 04 Sep, 2021 2 commits
    • Lucian Grijincu's avatar
      folly: symbolizer: tests: switch from qsort to lfind -- ASAN in LLVM12 adds an... · 69100695
      Lucian Grijincu authored
      folly: symbolizer: tests: switch from qsort to lfind -- ASAN in LLVM12 adds an __interceptor_qsort.part.0 which makes stacks differ between ASAN and non-ASAN
      
      Summary:
      LLVM 12's ASAN intercepts qsort and adds a new stack frame for the intercetor `__interceptor_qsort.part.0`.
      
      That can be solved by switching offsets between mode/dev & mode/opt, but it only makes tests harder to read.
      
      So switch to `lfind` which also lives in a separate `.so` (feature used in tests), but is simple enough that ASAN doesn't need to intercept it.
      
      Differential Revision: D30665575
      
      fbshipit-source-id: ba540aede33c37bea8e1f4777bd7325699f9a8d2
      69100695
    • Lucian Grijincu's avatar
      folly::symbolizer: add support for DWARF5 · 490b287c
      Lucian Grijincu authored
      Summary:
      folly::symbolizer now supports both DWARF4 and DWARF5 debug info
      - http://www.dwarfstd.org/doc/DWARF4.pdf
      - http://www.dwarfstd.org/doc/DWARF5.pdf
      
      Split DWARF (Debug Fission)
      - with `-fsplit-dwarf-inlining`: folly::symbolizer will use the debug info from the skeleton CU.
      - without `-fsplit-dwarf-inlining`: folly::symbolizer won't read .dwo sections and can't symbolize it (yet).
      
      Major things that changed between the standards that affect folly::symbolizer:
      - new forms DW_FORM_addrx*, DW_FORM_loclistx, DW_FORM_rnglistx, DW_FORM_strx*, whose values are interpreted against new CU attributes DW_AT_addr_base, DW_AT_loclists_base, DW_AT_rnglists_base, DW_AT_str_offsets_base
      - The .debug_line line header format is completely re-written and the constraint that the file register must be >= 1 was lifted.
      - DWARF5 `.debug_loclists` replaces DWARF4 `.debug_ranges`
      
      Differential Revision: D25521092
      
      fbshipit-source-id: 5b48e8abed495f379d8b119177913f55ae11bd2b
      490b287c
  9. 02 Sep, 2021 2 commits
    • Zeyi (Rice) Fan's avatar
      add support to custom main branch name · 0c8f7e29
      Zeyi (Rice) Fan authored
      Summary: This diff adds support to customize main branch name when generating GitHub Actions.
      
      Differential Revision: D30679305
      
      fbshipit-source-id: 0fc7eb1c97c27e2b42e60cc1ab69a48ab93b93fa
      0c8f7e29
    • Anuradha Weeraman's avatar
      Changes for building in Debian (#943) · 60d9f5d7
      Anuradha Weeraman authored
      Summary:
      Some changes that had to be done in Debian for the build to work:
      
      * Installation of system deps failed as it was not detecting the OS correctly
      * Updated the CMake manifest to uncomment the deb dependency as the CMake versions are newer
      * fb303 was not getting cloned as it was looking for a non-existent master branch
      
      Pull Request resolved: https://github.com/facebook/watchman/pull/943
      
      Differential Revision: D30700180
      
      Pulled By: fanzeyi
      
      fbshipit-source-id: 62eb9f8ba57510eb98d6bd56e40384bf38a74d8c
      60d9f5d7
  10. 01 Sep, 2021 1 commit
  11. 31 Aug, 2021 2 commits
    • Jolene Tan's avatar
      Remove vformat and svformat from folly/Format.md · a782676b
      Jolene Tan authored
      Summary: Part of folly vformat and svformat deprecation
      
      Reviewed By: vitaut
      
      Differential Revision: D30656958
      
      fbshipit-source-id: 0cccb7b2294fada3c61e36cd527af2ef05bb5a0a
      a782676b
    • Maged Michael's avatar
      ConcurrentHashMap: Fix cloning of non-copyable items · b765365d
      Maged Michael authored
      Summary:
      Fix an algorithm bug that occurs when the Key or Value types are not nothrow copy constructible.
      - Nodes (the entities protectable by iterators) may be cloned as a result of rehashing.
      - Key-value item objects are unique (because they are not copyable).
      - Multiple nodes may point to the same key-value item.
      - In the incorrect algorithm, each node has a bool member that indicates if it owns the key-value item or not (i.e., if it is responsible for deleting it).
      - When a node is cloned, its bool member is cleared.
      - The problem is that if the key is erased and the clone (or  descendant clone) may be reclaimed (because it is unprotected by iterators) then the key value item will be reclaimed, even if a cloned-from node is still protected by iterators.
      - The failure happens when an iterator holder to a cloned-from node tries to access the already-reclaimed key-value, expecting it (correctly) to be still protected.
      
      The fix:
      - Eliminate the bool owned member in the node structure.
      - Add a link counter to the key-value item structure.
      - Increment (atomically) the link counter when the (latest) node to the key-value item is cloned.
      - Decrement (atomically) the link counter when a node pointing to the item is reclaimed.
      - Reclaim the item only when its last link is released.
      - Note that atomic increments  and decrements are used only if the node pointing to an item is cloned.
      
      Added a test to detect the incorrect behavior.
      This change fixes only the regular (non-SIMD) version.
      Currently, the SIMD version fails the added test, therefore (for now) the test is enabled only for the regular version.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D30371519
      
      fbshipit-source-id: 29e143712afb3ef794f9f6f4d99919d5b4688416
      b765365d
  12. 26 Aug, 2021 2 commits
  13. 25 Aug, 2021 1 commit
    • Erich Graham's avatar
      Fix Folly issues with -Wcovered-switch-default compiler flag · 02a4b200
      Erich Graham authored
      Summary:
      When compiled with `-Wcovered-switch-default`, Folly fails to build because it adds `default` to switches which are already exhaustive. For C++ safety, these switches are intentionally including a default, so wrap them in a pragma block to indicate that and locally disable the warning.
      
      Causes -fmodules import issues for upstream library in D30379442.
      
      Still remaining issues with C++ definition: P445339268
      
      Reviewed By: ispeters
      
      Differential Revision: D30397871
      
      fbshipit-source-id: adead9e01d0ba3b21c2e1446150cc6fed0f58602
      02a4b200
  14. 24 Aug, 2021 1 commit
  15. 20 Aug, 2021 1 commit
    • Maged Michael's avatar
      ConcurrentHashMapSIMD: Return iterator to new inserted item · 2c7411fe
      Maged Michael authored
      Summary:
      Fix SIMD version to return iterator to new item in insertion operations.
      
      Added a test to detect the incorrect behavior.
      
      Changed existing tests that di not test the SIMD version to do so. Three of these tests fail without the fix.
      
      Reviewed By: davidtgoldblatt
      
      Differential Revision: D30435627
      
      fbshipit-source-id: 20ba400be9213fa138fda06e0e7bd84cf9d8cf12
      2c7411fe
  16. 19 Aug, 2021 3 commits
    • Brett Chik's avatar
      Fix a typo. · dc843dad
      Brett Chik authored
      Summary: I noticed two mispellings while reading through the code.  This fixes them.
      
      Reviewed By: Orvid
      
      Differential Revision: D30429734
      
      fbshipit-source-id: b976cc4ae4534a9f065b8a7e6fee5a39d7241a28
      dc843dad
    • Jason Fried's avatar
      expose make_optional to cython · 2906e83c
      Jason Fried authored
      Summary: This definition is the same cython uses for make_shared and make_unique
      
      Reviewed By: yfeldblum
      
      Differential Revision: D30232407
      
      fbshipit-source-id: 6a0cf4637721bc9d5e5f7f87f3c0f2b031810a5f
      2906e83c
    • Felix Handte's avatar
      Back out "Change Context Pool Stripes from 4 to 128" · 23133cdb
      Felix Handte authored
      Summary:
      Original commit changeset: 7b10cb9dd2c4
      
      `configerator_proxy2` reports a big memory regression. Reverting until we understand what's going on and have a plan to address it.
      
      (Note: this ignores all push blocking failures!)
      
      Differential Revision: D30401909
      
      fbshipit-source-id: 28443ba08b75c634021965319fead2f8a36b7235
      23133cdb
  17. 18 Aug, 2021 1 commit
  18. 16 Aug, 2021 2 commits
    • Cristian Lumezanu's avatar
      Add a AsyncSocket::LifecycleObserver->connectError() callback · e460690d
      Cristian Lumezanu authored
      Summary:
      The LifecycleObserver already tracks connect() but does not notify on
      connectError().  Follow the same pattern.
      
      Note that we intentionally added this to AsyncSocket's LifecycleObserver
      rather than AsyncTransport b/c AsyncTransport is not supposed to have
      a concept of a 'connection'.  This is counter to the 'connect()' callback
      that already exists in AsyncTransport::LifecycleObserver so marked a quick
      TODO to remember to move that.
      
      Reviewed By: bschlinker
      
      Differential Revision: D28612132
      
      fbshipit-source-id: cefa650bd007d48e38f9cb67bc9a82d322036d4c
      e460690d
    • Mahesh Balakrishnan's avatar
      Setting up basic build for delos_core · 0d7f79c2
      Mahesh Balakrishnan authored
      Summary: This diff adds the manifest file for delos_core so we can build using getdeps.
      
      Reviewed By: hanm
      
      Differential Revision: D26011286
      
      fbshipit-source-id: becb1a665a95f0d593072885c3ddfcf5c4403f51
      0d7f79c2
  19. 14 Aug, 2021 1 commit
    • Nikita Lutsenko's avatar
      folly | CppAttributes | Add portable version of FOLLY_ATTR_MAY_ALIAS, to allow... · 6ce98b52
      Nikita Lutsenko authored
      folly | CppAttributes | Add portable version of FOLLY_ATTR_MAY_ALIAS, to allow for usage across compilers.
      
      Summary: This attribute is GCC/Clang specific, allow portable usage, well, via portability header and custom define.
      
      Reviewed By: yfeldblum
      
      Differential Revision: D30296807
      
      fbshipit-source-id: bf496574139f42b07a11d582dedf6bac733318ec
      6ce98b52