1. 25 Mar, 2015 4 commits
    • Sean Cannella's avatar
      SocketAddress::anyAddress should be a method · 5333a914
      Sean Cannella authored
      Summary:
      Calling getaddrinfo from a static constructor is not the most
      reliable thing to do. Stop doing it.
      
      Test Plan: existing tests
      
      Reviewed By: davejwatson@fb.com
      
      Subscribers: dancol, mzlee, shikong, kmdent, fma, bmatheny, benyluo, ranjeeth, folly-diffs@, jsedgwick, yfeldblum
      
      FB internal diff: D1924578
      
      Tasks: 6534662
      
      Signature: t1:1924578:1426718586:d73bc2f001095e66fa77fde9c027af050cc26d2a
      5333a914
    • Hannes Roth's avatar
      (Wangle) Clean up move constructors · efecbe5f
      Hannes Roth authored
      Summary: I thought this might fix #6120972. But it doesn't. Still a bit of a cleanup in my opinion.
      
      Test Plan: Run all the tests?
      
      Reviewed By: hans@fb.com
      
      Subscribers: trunkagent, folly-diffs@, jsedgwick, yfeldblum
      
      FB internal diff: D1907259
      
      Signature: t1:1907259:1426613567:9e33fe7e9e8a36ba006d4aee604086a56f128893
      efecbe5f
    • Andrey Goder's avatar
      Support 'min ms to log' · f6da18f2
      Andrey Goder authored
      Summary:
      Sometimes we only want to log if enough time has passed, e.g. when logging
      inside of a loop doing work to detect if things are slow. Add an option for
      that.
      
      Test Plan:
      build and unit tests of folly/experimental
      
      Reviewed By: lesha@fb.com
      
      Subscribers: trunkagent, folly-diffs@, yfeldblum
      
      FB internal diff: D1909055
      
      Signature: t1:1909055:1426627731:6d3ad94fd71967ec89ffebc90cd2907dd1631d36
      f6da18f2
    • Alexey Spiridonov's avatar
      Fix logFormat · 816b97a7
      Alexey Spiridonov authored
      Summary: Ooops during port ;)
      
      Test Plan: unit test
      
      Reviewed By: agoder@fb.com
      
      Subscribers: trunkagent, folly-diffs@, yfeldblum
      
      FB internal diff: D1905639
      
      Signature: t1:1905639:1426171227:a6e415046a85f098ac090f069476204fb0367c42
      816b97a7
  2. 18 Mar, 2015 19 commits
    • Andre Azevedo's avatar
      Bump version to 31:0 · 6001c511
      Andre Azevedo authored
      6001c511
    • Nicholas Ormrod's avatar
      Fixed README download link to get the correct GTest version · ad384398
      Nicholas Ormrod authored
      Summary: Signed-off-by: Nicholas Ormrod <njormrod@fb.com>
      
      Test Plan: Clicked link, gtest started downloading
      
      Reviewed By: markisaa@fb.com
      
      Subscribers: sdwilsh, folly-diffs@, yfeldblum
      
      FB internal diff: D1901849
      
      Tasks: 6255850
      
      Signature: t1:1901849:1426097071:e887ed8749c70d5e15877082ac0175ce3b56647e
      ad384398
    • Praveen Kumar's avatar
      BackoffTimeout disallow copy, move, default ctor · e3d118ed
      Praveen Kumar authored
      Summary:
      BackoffTimeout disallow copy construction, copy assignment, move
      construction, move assignment, and default construction.
      
      Closes https://github.com/facebook/folly/pull/146
      
      Test Plan: runtests
      
      Reviewed By: ldbrandy@fb.com
      
      Subscribers: lins, anca, folly-diffs@, yfeldblum
      
      FB internal diff: D1912521
      
      Signature: t1:1912521:1426268413:6edb2d8203d1efd1e825816f03be115ac46e55ca
      e3d118ed
    • Praveen Kumar's avatar
      We might avoid some temporaries · 4cc84128
      Praveen Kumar authored
      Summary:
      It seems we might avoid temporaries.  To do so we pass arguments
      directly to constructors with the help of emplace_back member.
      
      Test Plan:
      all folly/tests, make check for 37 tests, passed.
      
      Closes https://github.com/facebook/folly/pull/150
      
      Reviewed By: ldbrandy@fb.com
      
      Subscribers: lins, anca, folly-diffs@, yfeldblum
      
      FB internal diff: D1912505
      
      Signature: t1:1912505:1426268158:086882bb53f3d79c3f3b7b2c362318f09b5ee3be
      4cc84128
    • Praveen Kumar's avatar
      AsyncServerSocket disallow copy, move, and default ctor · c2a60049
      Praveen Kumar authored
      Summary:
      AsyncServerSocket disallow copy construction, copy assignment,
      move construction, move assignment, and default
      construction.
      
      Closes https://github.com/facebook/folly/pull/148
      
      Test Plan: all folly/tests, make check for 37 tests, passed.
      
      Reviewed By: ldbrandy@fb.com
      
      Subscribers: lins, anca, folly-diffs@, yfeldblum
      
      FB internal diff: D1912488
      
      Signature: t1:1912488:1426267982:a9690ce9429016f89630f0ded64b7be9ff80c39d
      c2a60049
    • Alecs King's avatar
      fix typo: add backslash to Makefile.am · 72683c85
      Alecs King authored
      Summary: backslash
      
      Test Plan: tests
      
      Reviewed By: aap@fb.com
      
      Subscribers: folly-diffs@, yfeldblum
      
      FB internal diff: D1920872
      
      Signature: t1:1920872:1426624366:c984fecb5bd0c292d5a8309fb320a48872fff6db
      
      Blame Revision: D1890511
      72683c85
    • Alecs King's avatar
      Add StringKeyedUnorderedMap to Makefile · cf6ee69e
      Alecs King authored
      Test Plan:
      unit tests
      
      Reviewed By: bwatling@fb.com
      
      Subscribers: stepan, folly-diffs@, yfeldblum, trunkagent, vikas, alikhtarov
      
      FB internal diff: D1890511
      
      Tasks: 6311387
      
      Signature: t1:1890511:1425924980:71af7c12a09a86b280dc3c9a9ef0756bf56bf639
      cf6ee69e
    • Hans Fugal's avatar
      (folly osx) test for the zip, not the dir · a1119563
      Hans Fugal authored
      Summary: Apparently `configure` creates this subdirectory and then the curl and unzip commands don't run, and then `make check` fails. Instead, do it if the zip file doesn't exist.
      
      Test Plan:
      git clone https://github.com/facebook/folly.git
      cd folly/folly
      /path/to/this/bootstrap-osx-homebrew.sh
      make
      make check
      
      Reviewed By: andrei.alexandrescu@fb.com
      
      Subscribers: exa, folly-diffs@, yfeldblum, davejwatson
      
      FB internal diff: D1882472
      
      Signature: t1:1882472:1425920470:bdab25967d3b8e52c690d5627168077c65829b92
      a1119563
    • James Sedgwick's avatar
      exceptionStr(exception_wrapper) · ae823da9
      James Sedgwick authored
      Summary: for consistency with exception and exception_ptr functions provided in String.h
      
      Test Plan: unit
      
      Reviewed By: vloh@fb.com
      
      Subscribers: trunkagent, folly-diffs@, yfeldblum
      
      FB internal diff: D1905087
      
      Tasks: 5961362
      
      Signature: t1:1905087:1426101740:670ceab5140250bbecdd1247025d3d70b7774690
      ae823da9
    • Jeroen Vaelen's avatar
      extend future api with Future<T>::poll · 66047c6a
      Jeroen Vaelen authored
      Summary:
      Added folly::Future<T>::poll() function with the following semantics:
      poll() checks if the promise has been fulfilled, if so it will extract the value of the resulting Try<T> to construct a new Try<T> that is wrapped in an Optional<Try<T>>. If the promise has not been fulfilled an empty Optional is returned.
      
      Test Plan: Added two tests to SugarTest.cpp: one where the promise has been fulfilled and one where it hasn't.
      
      Reviewed By: hannesr@fb.com
      
      Subscribers: trunkagent, folly-diffs@, jsedgwick, arturg, yfeldblum
      
      FB internal diff: D1909480
      
      Tasks: 6166875
      
      Signature: t1:1909480:1426280247:6b239c0f1a15c25ce7664afb4bfb3899993c5775
      66047c6a
    • Matt Dordal's avatar
      Add ctor to CPUThreadPoolExecutor to enable custom queue sizes · aae7c5b3
      Matt Dordal authored
      Summary:
      Seems useful to do without passing in a totally custom queue. Makes
      the client code a bit simpler.
      
      Test Plan: used it, saw low memory usage and no crash
      
      Reviewed By: davejwatson@fb.com
      
      Subscribers: trunkagent, iaroslav, fugalh, folly-diffs@, jsedgwick, yfeldblum, slarsen
      
      FB internal diff: D1907874
      
      Signature: t1:1907874:1426268010:3159ae339b51f5dbc7fe034644bbc968b92b072c
      aae7c5b3
    • Naizhi Li's avatar
      Add support for iovec for UDP send in folly::AsyncUDPSocket · 383ffb34
      Naizhi Li authored
      Summary:
      I will be using multi-buf UDP send soon, so adding the
      support in folly::AsyncUDPSocket
      
      Test Plan: Unit tests and turn server
      
      Reviewed By: davejwatson@fb.com
      
      Subscribers: trunkagent, folly-diffs@, yfeldblum
      
      FB internal diff: D1907189
      
      Signature: t1:1907189:1426266951:046198e0a009fef085ac7eb44f054c67dfb16ba3
      383ffb34
    • Adam Simpkins's avatar
      add Cursor::isAtEnd() · efca08ae
      Adam Simpkins authored
      Summary:
      Add a helper method to efficiently check if the cursor is at the end of the
      IOBuf chain.  This is equivalent to (cursor.totalLength() > 0), but it doesn't
      need to walk the entire chain just to tell if it is at the end or not.
      
      Test Plan: Updated the unit tests to contain some checks for isAtEnd().
      
      Reviewed By: jasmeetbagga@fb.com
      
      Subscribers: trunkagent, doug, net-systems@, exa, folly-diffs@, yfeldblum
      
      FB internal diff: D1875345
      
      Signature: t1:1875345:1425006512:49ac246fd0ac7937fdcd6cf1359a841f048c444e
      efca08ae
    • Stepan Palamarchuk's avatar
      Protect unprotected · 5924c69c
      Stepan Palamarchuk authored
      Summary: This used to be protected before.
      
      Test Plan: folly/futures tests
      
      Reviewed By: andrii@fb.com
      
      Subscribers: trunkagent, folly-diffs@, jsedgwick, yfeldblum
      
      FB internal diff: D1907063
      
      Signature: t1:1907063:1426116657:d7430304d5f72a048396e83f8dc6b5a92198fb29
      5924c69c
    • Matt Dordal's avatar
      CPUThreadPoolExecutor's default queue is quite big · 905b5c10
      Matt Dordal authored
      Summary:
      By default, CPUThreadPoolExecutor uses 100 MB of rss for the CPU queue. This is
      substantially higher than expected.
      
      Reduce the default queue size so that it uses much less memory upfront, down
      to about 6 MB going by the heap profile.
      
      Reviewed By: davejwatson@fb.com
      
      Subscribers: mwa, ott, iaroslav, jrsherwood, aflock, slarsen, davejwatson, trunkagent, fugalh, folly-diffs@, jsedgwick, yfeldblum
      
      FB internal diff: D1900539
      
      Tasks: 6453427
      
      Signature: t1:1900539:1426103805:34fb7b081058fbde89370b5d9ec24ea572c4b0e2
      905b5c10
    • Nathan Bronson's avatar
      fix Makefile.am formatting · 10cd40f6
      Nathan Bronson authored
      Summary: D1798929 broke the automake folly build
      
      Test Plan:
      1. careful visual inspection
      2. build
      
      Reviewed By: alikhtarov@fb.com
      
      Subscribers: folly-diffs@, yfeldblum
      
      FB internal diff: D1906281
      
      Signature: t1:1906281:1426106340:621f1e7d2fb18ae2ec5dc604dea0d8ad4353486e
      10cd40f6
    • Nathan Bronson's avatar
      SharedMutex - a small fast scalable reader-writer lock · 349834b3
      Nathan Bronson authored
      Summary:
      SharedMutex is a reader-writer lock.  It is small, very fast, scalable
      on multi-core, and suitable for use when readers or writers may block.
      Unlike most other reader-writer locks, its throughput with concurrent
      readers scales linearly; it is able to acquire and release the lock
      in shared mode without cache line ping-ponging.  It is suitable for a
      wide range of lock hold times because it starts with spinning, proceeds
      to using sched_yield with a preemption heuristic, and then waits using
      futex and precise wakeups.
      
      SharedMutex provides all of the methods of folly::RWSpinLock,
      boost::shared_mutex, boost::upgrade_mutex, and C++14's
      std::shared_timed_mutex.  All operations that can block are available in
      try, try-for, and try-until (system_clock or steady_clock) versions.
      Both reader-priority and writer-priority versions are provided.
      Writer-priority is the default at the moment.
      
      In my tests SharedMutex is as good or better than the other reader-writer
      locks in use at Facebook for almost all use cases, sometimes by a wide
      margin.  (If it is rare that there are actually concurrent readers
      then RWSpinLock can be a few nanoseconds faster.)  I compared it to
      folly::RWSpinLock, folly::RWTicketSpinLock64, boost::shared_mutex,
      pthread_rwlock_t, and an internal RWLock that uses spinlocks to guard
      its state and pthread_mutex_t+pthread_cont_t to perform blocking.
      (The other ReadWriteMutex-s I found use pthread_rwlock_t underneath.)
      It is generally as good or better than the rest when evaluating size,
      speed, scalability, or latency outliers.  In the corner cases where
      it is not the fastest (such as single-threaded use or heavy write
      contention) it is never very much worse than the best.  See the bottom
      of SharedMutexTest.cpp for lots of microbenchmark results.
      
      Test Plan:
      1. new unit tests
      2. new microbenchmarks included here
      3. uncommitted microbenchmark from bmaurer's RWSleepLock
      4. replace admarket's RWSpinLock and RWLock with SharedMutex, observe
      neutral adindexer perf in canary
      5. replace multifeed's thrift ReadWriteLock with SharedMutex, observe
      neutral perf in canary
      
      Reviewed By: hans@fb.com
      
      Subscribers: fbcode-common-diffs@, tnovak, march, davejwatson, trunkagent, philipp, folly-diffs@, yfeldblum, bwatling, bmaurer, bol, marccelani, adri, strager, macsyz, dzhulgakov, zamsden
      
      FB internal diff: D1798929
      
      Signature: t1:1798929:1425575976:1c9221317eaa47628a2b8c374f90c7a2d4e3f0f9
      349834b3
    • Adrian Hamza's avatar
      Add null check to avoid crash in unit tests that use mock singletons. · 82bb8621
      Adrian Hamza authored
      Summary: Some unit tests owned by my team are failing due to segmentation fault in SingletonHolder<T>::registerSingletonMock -> SingletonHolder<T>::destroyInstance.
      
      Test Plan: Run folly unit tests and my unit tests.
      
      Reviewed By: henryf@fb.com
      
      Subscribers: trunkagent, folly-diffs@, yfeldblum
      
      FB internal diff: D1873889
      
      Signature: t1:1873889:1425925156:29d54092939d7e9debea3fd55f7105fd320e987e
      
      Blame Revision: 91f4942e
      82bb8621
    • Andrey Goder's avatar
      Add JSON Schema Validator · e87194b3
      Andrey Goder authored
      Summary:
      This is a validator for  JSON schema (http://json-schema.org/) that works on
      folly::dynamic. Apparently there are no good open source ones for C++,
      especially not if you want to use folly::dynamic. I am going to use this to
      validate JSON configs.
      
      It supports basically everything from the standard, except for fetching schemas
      via http, and using id refs. It supports enough to check schemas against the
      metaschema.
      
      Currently you can define a schema that will crash on validation, if it's
      infinitely self-recursive. See the unit test case that reproduces this.
      Fixing this seems hard though, so I didn't bother. It would also probably
      be slower for normal usage.
      
      Test Plan: unit test
      
      Reviewed By: lesha@fb.com
      
      Subscribers: trunkagent, folly-diffs@, yfeldblum
      
      FB internal diff: D1847657
      
      Signature: t1:1847657:1425605163:635dc523aeda1b588c3634d0dc1a48d50a53db79
      e87194b3
  3. 06 Mar, 2015 2 commits
    • Viswanath Sivakumar's avatar
      Bump version to 30:0 · 88fb213f
      Viswanath Sivakumar authored
      88fb213f
    • Mark Isaacson's avatar
      Remove unnecessary includes from FBVector · 77590b52
      Mark Isaacson authored
      Summary:
      Remove unnecessary includes from FBVector
      
      Gonna see just how cleaned-up sandcastle really is :P
      
      Test Plan: Fix errors shown in contbuild
      
      Reviewed By: njormrod@fb.com
      
      Subscribers: cold-storage-diffs@, jcoens, ldbrandy, trunkagent, oleksandr, netego-diffs@, mmandal, weiyan, ws_dev_diffs, jmkaldor, jhunt, fbcode-common-diffs@, njormrod, folly-diffs@, yfeldblum
      
      FB internal diff: D1873145
      
      Signature: t1:1873145:1425505591:9cb345053833afa70f543e2f7acd310ab80b8676
      77590b52
  4. 05 Mar, 2015 6 commits
    • Nicholas Ormrod's avatar
      Bump version to 29:0 · 01bd28a3
      Nicholas Ormrod authored
      01bd28a3
    • Dave Watson's avatar
      httpserver on serverbootstrap · 321807e1
      Dave Watson authored
      Summary:
      Cleans up the httpserver startup code nicely.  The only major change to ServerBootstrap was a check if bind failed to throw an exception.
      
      (depends on D1732895)
      
      Test Plan:
      fbconfig -r folly/wangle/bootstrap proxygen/httpserver; fbmake runtests
      
      fbconfig -r dfsrouter; fbmake runtests
      
      Reviewed By: hans@fb.com
      
      Subscribers: yfeldblum, cgheorghe, trunkagent, doug, fugalh, bmatheny, folly-diffs@, jsedgwick
      
      FB internal diff: D1800100
      
      Signature: t1:1800100:1424733970:67a61a22d2affadea16d2fd725003915326077b2
      321807e1
    • Sara Golemon's avatar
      Bump version to 28:0 · b252ef02
      Sara Golemon authored
      b252ef02
    • Ram Kumar Rengaswamy's avatar
      Bugfix uriEscapeTable generate. · 47e8b72f
      Ram Kumar Rengaswamy authored
      Summary:
      generate_escape_tables.py uses python range function which does not include the end of the range.
      
      Closes #131
      
      Test Plan: See attached test case.
      
      Reviewed By: njormrod@fb.com
      
      Subscribers: trunkagent, folly-diffs@, yfeldblum
      
      FB internal diff: D1871692
      
      Signature: t1:1871692:1425076132:2438ab7554fe87bdef17c82ff27713811a270d7c
      47e8b72f
    • Nicholas Ormrod's avatar
      Add FunctionScheduler to Makefile.am · 5c483dd4
      Nicholas Ormrod authored
      Summary: D1845525 was missing some makefile changes.
      
      Test Plan: Examine similar change in D1732895
      
      Reviewed By: markisaa@fb.com
      
      Subscribers: sdwilsh, folly-diffs@, yfeldblum
      
      FB internal diff: D1890197
      
      Signature: t1:1890197:1425526255:e9a23fd96a89d4463cbdfda1385d4fd5f5781e8e
      5c483dd4
    • Hans Fugal's avatar
      MoveWrapper::move() · d08270e6
      Hans Fugal authored
      Summary: sugar providing `foo.move()` instead of `std::move(*foo)`.
      
      Test Plan: Inspection. Using it in another diff.
      
      Reviewed By: yfeldblum@fb.com, hannesr@fb.com
      
      Subscribers: trunkagent, exa, folly-diffs@, yfeldblum
      
      FB internal diff: D1882208
      
      Signature: t1:1882208:1425331389:a9c09ad2739838c829e2afdad64e985810154226
      d08270e6
  5. 03 Mar, 2015 9 commits
    • Alecs King's avatar
      Bump version to 27:0 · 75278c63
      Alecs King authored
      75278c63
    • Subodh Iyengar's avatar
      Add test for running after terminate · 7bbdffca
      Subodh Iyengar authored
      Summary:
      Add a test to check what will happen if
      someone tries to run a job on evb after
      termination.
      
      Test Plan: Unit tests
      
      Reviewed By: seanc@fb.com
      
      Subscribers: seanc, folly-diffs@, yfeldblum
      
      FB internal diff: D1882308
      
      Signature: t1:1882308:1425333248:7ab6692eb0b866fcc9685048eb385bacd90023d1
      7bbdffca
    • Hans Fugal's avatar
      makeMoveWrapper(lvalue) · bc847809
      Hans Fugal authored
      Summary: Because why not?
      
      Test Plan: new unit tests
      
      Reviewed By: hannesr@fb.com
      
      Subscribers: trunkagent, exa, folly-diffs@, yfeldblum, marccelani
      
      FB internal diff: D1866123
      
      Signature: t1:1866123:1425331395:742369597757456e5925af55c5d4198b607126f1
      bc847809
    • Sara Golemon's avatar
      MacOS doesn't have malloc_usable_size() · 66a07640
      Sara Golemon authored
      Summary:
      Use malloc_size() instead
      
      Test Plan: HHVM build on MacOS
      
      Reviewed By: joelm@fb.com
      
      Subscribers: trunkagent, folly-diffs@, yfeldblum
      
      FB internal diff: D1875364
      
      Signature: t1:1875364:1425061479:7d8cec757c186fa8c30b6500fca6b2fe4c1ed137
      66a07640
    • Dor Gross's avatar
      Creating a flatten() method to get the inner Future<T> value out of a Future<Future<T>>. · 1f6e3142
      Dor Gross authored
      Summary: Method will only be applicable for types of the form Future<Future<T>>, calling flatten() on a Future<T> where <T> != Future<R> for any <R> will result with a compile time error.
      
      Test Plan: Added tests in FutureTest.cpp.
      
      Reviewed By: hans@fb.com
      
      Subscribers: ldbrandy, trunkagent, folly-diffs@, jsedgwick, yfeldblum, icanadi
      
      FB internal diff: D1843581
      
      Tasks: 6166903
      
      Signature: t1:1843581:1424399517:7146924db3c238b77dd309f1d5916e44a7e81968
      1f6e3142
    • zhaokai's avatar
      Add const to the variable: needle · 6b9d347f
      zhaokai authored
      Summary:
      Make it clear that the variable is const
      
      Closes #139
      
      Test Plan:
      authored tested, contbuild
      
      Reviewed By: markisaa@fb.com
      
      Subscribers: folly-diffs@, yfeldblum
      
      FB internal diff: D1878361
      
      Signature: t1:1878361:1425071448:6871577ddb34f4a8dc30ea37842f9950c3825dde
      6b9d347f
    • zhaokai's avatar
      Update UnitTest of MapUtilTest.cpp · 3f179169
      zhaokai authored
      Summary:
      1. Split the original simple test
      2. Add unit test of function: get_ref_default
      
      Closes #138
      
      Test Plan: authored tested, contbuild
      
      Reviewed By: markisaa@fb.com
      
      Subscribers: folly-diffs@, yfeldblum
      
      FB internal diff: D1878603
      
      Signature: t1:1878603:1425073330:914a2365fa648142d11b41b387423d78e52f2e08
      3f179169
    • zhaokai's avatar
      Fix comment of Benchmark.h · afe8b202
      zhaokai authored
      Summary:
      Remove one of the "one" in the comment of BENCHMARK
      
      Closes: #140
      
      Test Plan: Inspection.
      
      Reviewed By: markisaa@fb.com
      
      Subscribers: trunkagent, folly-diffs@, yfeldblum
      
      FB internal diff: D1877997
      
      Signature: t1:1877997:1425063475:c53c09d105809de9a9070f464fb0571a4dd1e5d1
      afe8b202
    • Dave Watson's avatar
      attempt at putting thrift2 on ChannelPipeline · 0f3fabf1
      Dave Watson authored
      Summary:
      Basically a ripoff of Dave's D1483148 but with ChannelPipeline instead of rx.
      There's going to be a long tail of unit tests here, this is still pretty broken...
      
      Not convinced that this is the way to go but I wanted to get a feel for what it would be like to plug it into an IRL system.
      I think the simplicity/clarity of the handler implementations and to some extent the pipeline spec is an improvement over the rx way
      but I'm less sure about everything else.
      
      Test Plan: compiles and kind of works some of the time but not really
      
      Reviewed By: alandau@fb.com
      
      Subscribers: wormhole-diffs@, mcduff, hitesh, doug, yfeldblum, folly-diffs@, jsedgwick, subodh, andrewcox, njormrod, trunkagent, fugalh, alandau, bmatheny, mshneer
      
      FB internal diff: D1618704
      
      Tasks: 5981284
      
      Signature: t1:1618704:1424980854:83c6193b1156be2ec65cf79f9f2ad1af670da7f8
      0f3fabf1