- 06 Dec, 2017 2 commits
-
-
Yedidya Feldblum authored
Summary: [Folly] Use `boost::filesystem::current_path` in `ChangeToTempDir`. It will report failures noisily. Reviewed By: pixelb Differential Revision: D6493243 fbshipit-source-id: 423dc0e3a46781e9af42fee69060d31085f1a7c6
-
Liang Zhu authored
Reviewed By: yfeldblum Differential Revision: D6482348 fbshipit-source-id: 5b2d3c984b761a54d5a9eba48953c556ed22cda6
-
- 05 Dec, 2017 6 commits
-
-
Pingjia Shan authored
Summary: Upon debugging for the attached task, it appears to me the problem are in two places: . After a callback has been run, context_ wasn't reset . After a callback has been canceled, context_ wasn't reset In this diff: . Fix these two places. . Updating unit tests to cover these two cases. Reviewed By: yfeldblum Differential Revision: D6465788 fbshipit-source-id: 85b3b29dc80c9f3971c85f302385d41ded44fa0e
-
Aaryaman Sagar authored
Split get_default() into two for deferred default construction and added forwarding to speed up default element construction with rvalues Summary: As it stood currently folly::get_default() would unnecessarily construct a value into the third parameter, which was unnecessary in the code path where the element was found in the map. Also the default value can be forwarded to the return type in the code path where the element is not found and an rvalue parameter is passed as the default value Reviewed By: yfeldblum Differential Revision: D6390315 fbshipit-source-id: ef692b827d5a36751b4eb1e12042869e8fbba2e5
-
Dave Watson authored
Summary: Adds a bitreverse function to Bits.h AFAIK there is no great way to do this on x86, takes ~4-5ns. arm has a single instruction we can drop in in the future. Reviewed By: yfeldblum Differential Revision: D6459283 fbshipit-source-id: 129db196b2fac95386f601ae57843aa87523b915
-
Liang Zhu authored
Summary: In the latest stable kernel 4.14.3 as of 2017-12-04, unix domain socket does not support MSG_ERRQUEUE. So recvmsg(MSG_ERRQUEUE) will read application data from unix doamin socket as error message, which breaks the message flow in application. This diff disable setErrMessageCB for Unix Domain Socket. Both [[ https://github.com/torvalds/linux/blob/master/net/ipv4/tcp.c#L1782 | tcp_recvmsg ]] and [[ https://github.com/torvalds/linux/blob/master/net/ipv4/udp.c#L1571 | udp_recvmsg ]] will check flag MSG_ERRQUEUE and read from error queue. However, there is nothing about MSG_ERRQUEUE in [[ https://github.com/torvalds/linux/blob/master/net/unix/af_unix.c#L2249 | af_unix ]]. Reviewed By: yfeldblum Differential Revision: D6479465 fbshipit-source-id: eba2c8650e96466f2b361a42ddf90053d65f19bd
-
Yedidya Feldblum authored
Summary: [Folly] Add missing check against `SemiFuture` in `FutureBase` ctor. Reviewed By: LeeHowes Differential Revision: D6469021 fbshipit-source-id: 0ca31461afee4bf64725e065a8cb4d5e933d2013
-
Nathan Bronson authored
Summary: /proc may be unavailable in restricted environments, which can cause pthread_getattr_np to fail. This diff adds checking to the return code from that function. Reviewed By: yfeldblum Differential Revision: D6473789 fbshipit-source-id: de016d32f29edf8410808dfb491987692f39e768
-
- 04 Dec, 2017 4 commits
-
-
Stepan Palamarchuk authored
Summary: Currently QueueAppender needs to follow a chain of 4 indirections (QueueAppender->IOBufQueue->IOBuf(head)->IOBuf(tail)->data). This diff adds a cache of writable tail range in IOBufQueue and allows it to be placed externally. Before this diff on hot path QueueAppender::write<signed char> was ~167 bytes of code (with majority being actually executed), after this diff it's down to ~30 bytes: 0x0000000000419d10 <+0>: mov (%rdi),%rax 0x0000000000419d13 <+3>: cmp %rax,0x8(%rdi) 0x0000000000419d17 <+7>: je 0x419d28 <folly::io::QueueAppender::write<signed char>(signed char)+24> 0x0000000000419d19 <+9>: mov %sil,(%rax) 0x0000000000419d1c <+12>: addq $0x1,(%rdi) 0x0000000000419d20 <+16>: retq 0x0000000000419d21 <+17>: nopl 0x0(%rax) 0x0000000000419d28 <+24>: movsbl %sil,%esi 0x0000000000419d2c <+28>: jmpq 0x419ca0 <folly::io::QueueAppender::writeSlow<signed char>(signed char)> With this diff, Thrift serialization performance is improved up to 2x with production workloads (2x for compact, 3x for binary). Thrift benchmark output: Before: ============================================================================ thrift/lib/cpp2/test/ProtocolBench.cpp relative time/iter iters/s ============================================================================ BinaryProtocol_write_Empty 58.05ns 17.23M BinaryProtocol_write_SmallInt 75.17ns 13.30M BinaryProtocol_write_BigInt 74.60ns 13.41M BinaryProtocol_write_SmallString 85.12ns 11.75M BinaryProtocol_write_BigString 802.96ns 1.25M BinaryProtocol_write_BigBinary 174.69ns 5.72M BinaryProtocol_write_LargeBinary 171.81ns 5.82M BinaryProtocol_write_Mixed 130.97ns 7.64M BinaryProtocol_write_SmallListInt 123.99ns 8.06M BinaryProtocol_write_BigListInt 40.72us 24.56K BinaryProtocol_write_BigListMixed 784.78us 1.27K BinaryProtocol_write_LargeListMixed 98.84ms 10.12 CompactProtocol_write_Empty 64.38ns 15.53M CompactProtocol_write_SmallInt 76.74ns 13.03M CompactProtocol_write_BigInt 83.62ns 11.96M CompactProtocol_write_SmallString 86.05ns 11.62M CompactProtocol_write_BigString 786.18ns 1.27M CompactProtocol_write_BigBinary 184.91ns 5.41M CompactProtocol_write_LargeBinary 182.12ns 5.49M CompactProtocol_write_Mixed 120.89ns 8.27M CompactProtocol_write_SmallListInt 119.74ns 8.35M CompactProtocol_write_BigListInt 43.76us 22.85K CompactProtocol_write_BigListMixed 595.90us 1.68K CompactProtocol_write_LargeListMixed 72.80ms 13.74 ============================================================================ After: ============================================================================ thrift/lib/cpp2/test/ProtocolBench.cpp relative time/iter iters/s ============================================================================ BinaryProtocol_write_Empty 65.97ns 15.16M BinaryProtocol_write_SmallInt 72.31ns 13.83M BinaryProtocol_write_BigInt 72.67ns 13.76M BinaryProtocol_write_SmallString 77.56ns 12.89M BinaryProtocol_write_BigString 782.07ns 1.28M BinaryProtocol_write_BigBinary 179.69ns 5.57M BinaryProtocol_write_LargeBinary 182.62ns 5.48M BinaryProtocol_write_Mixed 91.62ns 10.92M BinaryProtocol_write_SmallListInt 96.22ns 10.39M BinaryProtocol_write_BigListInt 19.65us 50.90K BinaryProtocol_write_BigListMixed 245.69us 4.07K BinaryProtocol_write_LargeListMixed 46.56ms 21.48 CompactProtocol_write_Empty 74.44ns 13.43M CompactProtocol_write_SmallInt 80.35ns 12.45M CompactProtocol_write_BigInt 85.30ns 11.72M CompactProtocol_write_SmallString 82.61ns 12.10M CompactProtocol_write_BigString 784.77ns 1.27M CompactProtocol_write_BigBinary 193.20ns 5.18M CompactProtocol_write_LargeBinary 192.53ns 5.19M CompactProtocol_write_Mixed 99.78ns 10.02M CompactProtocol_write_SmallListInt 104.77ns 9.54M CompactProtocol_write_BigListInt 25.62us 39.03K CompactProtocol_write_BigListMixed 272.42us 3.67K CompactProtocol_write_LargeListMixed 38.32ms 26.09 ============================================================================ QueueAppender Benchmark output (although not very representative due to a tight loop): Before: ============================================================================ folly/io/test/QueueAppenderBenchmark.cpp relative time/iter iters/s ============================================================================ write_uint8 10.50us 95.20K write_uint16 5.48us 182.49K write_uint32 2.73us 366.22K push_64b 9.77us 102.36K push_1024b 112.87us 8.86K append 64.21us 15.57K preallocate_postallocate_1b 16.34us 61.19K preallocate_postallocate_4b 15.56us 64.26K preallocate_postallocate_32b 22.17us 45.11K preallocate_postallocate_256b 149.55us 6.69K ============================================================================ After: ============================================================================ folly/io/test/QueueAppenderBenchmark.cpp relative time/iter iters/s ============================================================================ write_uint8 8.86us 112.81K write_uint16 3.91us 255.68K write_uint32 2.08us 481.78K push_64b 8.24us 121.39K push_1024b 115.50us 8.66K append 67.52us 14.81K preallocate_postallocate_1b 13.86us 72.17K preallocate_postallocate_4b 11.67us 85.71K preallocate_postallocate_32b 20.35us 49.14K preallocate_postallocate_256b 148.57us 6.73K ============================================================================ Reviewed By: yfeldblum Differential Revision: D6427749 fbshipit-source-id: 8495cc74b6106b15d201e37533ae4c0a1abc9d74
-
Dave Watson authored
Summary: Adds an AdFork::unregisterHandler command, such that we can register and unregister fork handlers. Reviewed By: yfeldblum Differential Revision: D6439796 fbshipit-source-id: b710152f8cf98371c330b484cd5fe42de44e74ac
-
Maged Michael authored
Summary: UnboundedQueue supports: - SPSC, MPSC, SCMP, MPMC - Non-waiting, waiting, and timed consumer operations. - Producers never wait or fail (unless out-of-memory). - Memory usage grows and shrinks dynamically ``` /// UnboundedQueue supports a variety of options for unbounded /// dynamically expanding an shrinking queues, including variations of: /// - Single vs. multiple producers /// - Single vs. multiple consumers /// - Blocking vs. spin-waiting /// - Non-waiting, timed, and waiting consumer operations. /// Producer operations never wait or fail (unless out-of-memory). /// /// Template parameters: /// - T: element type /// - SingleProducer: true if there can be only one producer at a /// time. /// - SingleConsumer: true if there can be only one consumer at a /// time. /// - MayBlock: true if consumers may block, false if they only /// spins. A performance tuning parameter. /// - LgSegmentSize (default 8): Log base 2 of number of elements per /// segment. A performance tuning parameter. See below. /// /// When to use UnboundedQueue: /// - If a small bound may lead to deadlock or performance degradation /// under bursty patterns. /// - If there is no risk of the queue growing too much. /// /// When not to use UnboundedQueue: /// - If there is risk of the queue growing too much and a large bound /// is acceptable, then use DynamicBoundedQueue. /// - If the queue must not allocate on enqueue or it must have a /// small bound, then use fixed-size MPMCQueue or (if non-blocking /// SPSC) ProducerConsumerQueue. /// /// Template Aliases: /// USPSCQueue<T, MayBlock, LgSegmentSize> /// UMPSCQueue<T, MayBlock, LgSegmentSize> /// USPMCQueue<T, MayBlock, LgSegmentSize> /// UMPMCQueue<T, MayBlock, LgSegmentSize> /// /// Functions: /// Producer operations never wait or fail (unless OOM) /// void enqueue(const T&); /// void enqueue(T&&); /// Adds an element to the end of the queue. /// /// Consumer operations: /// void dequeue(T&); /// Extracts an element from the front of the queue. Waits /// until an element is available if needed. /// bool try_dequeue(T&); /// Tries to extracts an element from the front of the queue /// if available. Returns true if successful, false otherwise. /// bool try_dequeue_until(T&, time_point& deadline); /// Tries to extracts an element from the front of the queue /// if available until the specified deadline. Returns true /// if successful, false otherwise. /// bool try_dequeue_for(T&, duration&); /// Tries to extracts an element from the front of the queue /// if available for for the specified duration. Returns true /// if successful, false otherwise. /// /// Secondary functions: /// size_t size(); /// Returns an estimate of the size of the queue. /// bool empty(); /// Returns true only if the queue was empty during the call. /// Note: size() and empty() are guaranteed to be accurate only if ``` Reviewed By: djwatson Differential Revision: D6157613 fbshipit-source-id: db423f86d1d0604d22f6b9c71ea0ed08be32e2a1
-
Anirudh Ramachandran authored
Summary: X509_digest, or the "fingerprint" of the cert, is useful to identify certificates with the same CN/SANs. This adds an API to get the SHA1 or SHA256 digest of a cert. Reviewed By: yfeldblum Differential Revision: D6457917 fbshipit-source-id: 148a5a2270e938b39065e00d7947c2fc57cd7f75
-
- 03 Dec, 2017 1 commit
-
-
Alastair Daivis authored
Summary: AFAICT this is currently the only thing preventing the non-dynamic version of Folly's MPMCQueue from being allocation-free on enqueue and dequeue operations. Allocating this with a constant expression should move the allocation from runtime to link (possibly compile?) time, which will let us use it in allocation sensitive contexts. Feel free to suggest other reviewers, I couldn't find an existing folly reviewer group. Reviewed By: yfeldblum, agola11, nbronson Differential Revision: D6447848 fbshipit-source-id: 86b84b19d62f1e1bcecdb9e757a6dfa90597b084
-
- 02 Dec, 2017 4 commits
-
-
David Goode authored
Summary: As in title, for eg larger stack size Reviewed By: yfeldblum Differential Revision: D6466762 fbshipit-source-id: 303e8732c8bfb64fbd8619163779942fe5f8b5a8
-
Adam Simpkins authored
Summary: Add makeSystemError() helper functions that are similar to the existing throwSystemError() functions but just return the exception rather than throwing it. This is helpful for callers using folly::Expected or folly::Future, where they need to return an exception type rather than throwing it. This also includes comments about the fact that this code is using the wrong error category. The C++ standard indicates that std::generic_category() for POSIX errno values. I am not fixing this as part of this diff, since this change has the potential to break existing users, and would need a fair amount of testing first. Reviewed By: yfeldblum Differential Revision: D6456771 fbshipit-source-id: 4724b51b8d4a7f513ae70ea1b0c4f0516cfc205f
-
Adam Simpkins authored
Summary: Add an explicit `std::move()` around the return value of `logConfigToDynamic()`. This explicit move is required pre-C++14, but is not required after DR 1579: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1579 Newer versions of g++ and clang no longer require the move. However gcc versions earlier than 5.0 do require it. Reviewed By: yfeldblum Differential Revision: D6466447 fbshipit-source-id: 1b15934490d4966e9b3e5612e0e2ecbb43c979ca
-
Adam Simpkins authored
Summary: Replace the initLoggingGlogStyle() function with a more generic initLogging() function that accepts a log config string to be parsed with parseLogConfig(). Reviewed By: bolinfest, yfeldblum Differential Revision: D6342086 fbshipit-source-id: fb1bffd11f190b70e03e2ccbf2b30be08d655242
-
- 01 Dec, 2017 4 commits
-
-
Igor Sugak authored
Reviewed By: yfeldblum Differential Revision: D6453972 fbshipit-source-id: fa083c0b782188f5f45a2a354045aee03e528829
-
Adam Simpkins authored
Summary: Implement conversions between std::chrono::duration and POSIX-style time structures even when neither the numerator nor the denominator of the duration ratio are 1. Both of these are done by first converting to an intermediate type where the numerator is 1, and then using the conversion routines for that case. Reviewed By: yfeldblum Differential Revision: D6366647 fbshipit-source-id: 8f9495fb4101cac6d8b4cf0353a679107007b298
-
Dave Watson authored
Summary: As title Reviewed By: yfeldblum Differential Revision: D6440723 fbshipit-source-id: 3168d7bb616ae0ff3fe42f7584c5a255c4953875
-
Bin Liu authored
Summary: Fix bug in non-jemalloc build. (Note: this ignores all push blocking failures!) Reviewed By: igorsugak Differential Revision: D6451342 fbshipit-source-id: 44725d4e0c685a59325fa3d08877d0f62120c5c2
-
- 30 Nov, 2017 13 commits
-
-
Yedidya Feldblum authored
Summary: [Folly] Let `SaturatingSemaphore::try_wait` be non-`const` and add `ready`. For internal API consistency. Reviewed By: magedm Differential Revision: D6450089 fbshipit-source-id: 65b9b723672521710a69719b192eb2922a27b778
-
Igor Sugak authored
Summary: Add preprocessor checks to guard jemalloc headers if any sanitizer is enabled. Reviewed By: yfeldblum Differential Revision: D6441578 fbshipit-source-id: 85364fca5af33c95cd05f232d1e3f9cbac9a4120
-
Yedidya Feldblum authored
Summary: [Folly] Some fixes for custom conversions of enums. Of note, `to` was defined for enum -> all conversions, including enum -> string conversions, but we actually want enum -> string conversions to be done via ADL-discovered toAppend. Reviewed By: ot Differential Revision: D6411250 fbshipit-source-id: 852b64309e6adf1c68e5153635cb29632e2d86d4
-
Maged Michael authored
Summary: SaturatingSemaphore is a flag that allows: - multiple concurrent posters - multiple concurrent waiters - idempotent posting - non-destructive waiting - blocking and spinning - pre-block spin time control ``` /// SaturatingSemaphore is a flag that allows concurrent posting by /// multiple posters and concurrent non-destructive waiting by /// multiple waiters. /// /// A SaturatingSemaphore allows one or more waiter threads to check, /// spin, or block, indefinitely or with timeout, for a flag to be set /// by one or more poster threads. By setting the flag, posters /// announce to waiters (that may be already waiting or will check /// the flag in the future) that some condition is true. Posts to an /// already set flag are idempotent. ``` Reviewed By: djwatson Differential Revision: D6379704 fbshipit-source-id: 59aed76caa2d159639e75425a778a9c63f18f375
-
Igor Sugak authored
Summary: Most of the time we want to guard some code when any of the sanitizers are enabled not just one. Reviewed By: yfeldblum Differential Revision: D6429720 fbshipit-source-id: 7157a0a13f2b2acabd36a19c61b9fdbf38ba96b8
-
Adam Simpkins authored
Summary: Add a method for merging the settings from two LogConfig objects. This allows LogConfig objects to be merged before applying them to the LoggerDB. The effects are the same as two sequential LoggerDB::updateConfig() calls, but without having to apply the intermediate state to the LoggerDB. Reviewed By: bolinfest Differential Revision: D6342085 fbshipit-source-id: 0f8a1b7d8d195a80bc74342444dd3152d331fcb6
-
Adam Simpkins authored
Summary: Add a static_assert() to check that the FLAG_INHERIT bit does not conflict with valid LogLevel values. Reviewed By: bolinfest Differential Revision: D6341242 fbshipit-source-id: cec284623c8a612a3c54f1b593d169310790616e
-
Adam Simpkins authored
Summary: The logging code used to support a LogLevel::ERROR value on non-Windows platforms. I removed it in D5288600 to make all platforms consistent, but I forgot to remove this comment describing it. Reviewed By: bolinfest Differential Revision: D6341244 fbshipit-source-id: 054427d342066f354c859b12611b907dc2d4fa35
-
Adam Simpkins authored
Summary: Add methods for applying config changes from a LogConfig object to the LoggerDB. Reviewed By: bolinfest Differential Revision: D6200564 fbshipit-source-id: a25eb99e84b2885bf6853e2222db0d7432a6c37b
-
Adam Simpkins authored
Summary: Add a method to get the current LogConfig state from the LoggerDB. Reviewed By: bolinfest Differential Revision: D6200596 fbshipit-source-id: 3bc57d498a5d25d19099d861376d71ea9f7e4039
-
Adam Simpkins authored
Summary: Remove the logic that clamps the log level to DFATAL in debug builds. This behavior logically makes some sense, but results in subtle and potentially confusing behavior changes. It seems confusing that after calling `setLevel(LogLevel::MAX_LEVEL)` on a log category, calling `getLevel()` on that object would return `DFATAL` rather than `MAX_LEVEL`. We also weren't clamping the level to DFATAL consistently: `setLevel()` would clamp the value, but on construction the initial level was still set to MAX_LEVEL rather than DFATAL. This resulted in some issues when implementing `LoggerDB::getConfig()` since we could not consistently detect if a log category was using the default level settings. Rather than fix this inconsistency it seems better to simply remove this clamping behavior. This means that it is possible for users to disable DFATAL log messages even in debug builds if they really want to. Previously this was only allowed in release builds. This protection doesn't really seem all that valuable--presumably most developers won't really want to do this, and if they really do request this configuration it doesn't seem all that bad to honor it. Reviewed By: bolinfest, yfeldblum Differential Revision: D6200569 fbshipit-source-id: 83ef8e2e4d3b61bc5b105038cbe3132979e9ac67
-
Adam Simpkins authored
Summary: Add a method to LogHandler to return its current configuration. This will make it possible to query the LoggerDB for its current configuration state. Reviewed By: bolinfest Differential Revision: D6200563 fbshipit-source-id: 2b8b9752bbeb26c8aac28d1a73b7e2312fd198c8
-
Adam Simpkins authored
Summary: Update the LoggerDB to track a list of LogHandlers by name, and LogHandlerFactories by handler type. This will be needed to support updating the LoggerDB configuration from a LogConfig object. Reviewed By: bolinfest Differential Revision: D6200562 fbshipit-source-id: e365b4e0df65aa5aaa34e118eb3cee9c9c45cb05
-
- 29 Nov, 2017 4 commits
-
-
Yedidya Feldblum authored
Summary: [Folly] Synchronize coupled caches in `folly::threadlocal_detail::StaticMeta`. The caches should be set together, and only together, because they are coupled. This prevents bugs where one function that sets one cache but not the other cache is inlined into the caller in one module, and another function that reads both caches is inlined into the caller in another module. Reviewed By: djwatson Differential Revision: D6435175 fbshipit-source-id: 846c4972b40e525f2c04da6e6609c2ad54f674c0
-
Adam Simpkins authored
Summary: Add a new LogHandlerFactory interface for creating LogHandler objects from a LogHandlerConfig. Also add an initial FileHandlerFactory implementation capable of creating LogHandler objects that write to a file descriptor. Reviewed By: bolinfest Differential Revision: D6200567 fbshipit-source-id: 14b86fc14ad475223aa4b57d45c40638b48c7594
-
Andrii Nakryiko authored
Summary: Just testing that ElfFile returns expected error code and message for non-ELF files. Depends on D6410210 Reviewed By: yfeldblum Differential Revision: D6418365 fbshipit-source-id: aaab3b9f3ca1a12d384ae98a1772b7f640115192
-
Sarang Masti authored
Summary: We need to keep LockedPtr returned by rlock/wlock alive for the entire duration of the loop. Else we are working on a snapshot of the data structure, which might not be what we want. Reviewed By: aary, ot, luciang Differential Revision: D6426613 fbshipit-source-id: 294c0a7b9d756f3116d5cdb3a7b3678f693e0754
-
- 28 Nov, 2017 2 commits
-
-
Adam Simpkins authored
Summary: Replace all assert() checks in the folly logging code with FOLLY_SAFE_DCHECK(). Reviewed By: yfeldblum Differential Revision: D6422885 fbshipit-source-id: 5cb12dd59f2fe5d346f15b9d317abede8654a879
-
Alexander Kabaev authored
Summary: _mm_cvtsi64_si128 and _mm_cvtsi128_si64 intrinsics are available on x86_64 only, so do not enable SSE instructions when compiling for 32 bits. Reviewed By: yfeldblum Differential Revision: D6422271 fbshipit-source-id: a3c5cf3f2ee4b47d5a1edcf93cfff3d1f3fe907e
-