Commit Graph

59 Commits

Author SHA1 Message Date
Robert Schulze
5a4f21c50f
Support for Clang Thread Safety Analysis (TSA)
- TSA is a static analyzer build by Google which finds race conditions
  and deadlocks at compile time.

- It works by associating a shared member variable with a
  synchronization primitive that protects it. The compiler can then
  check at each access if proper locking happened before. A good
  introduction are [0] and [1].

- TSA requires some help by the programmer via annotations. Luckily,
  LLVM's libcxx already has annotations for std::mutex, std::lock_guard,
  std::shared_mutex and std::scoped_lock. This commit enables them
  (--> contrib/libcxx-cmake/CMakeLists.txt).

- Further, this commit adds convenience macros for the low-level
  annotations for use in ClickHouse (--> base/defines.h). For
  demonstration, they are leveraged in a few places.

- As we compile with "-Wall -Wextra -Weverything", the required compiler
  flag "-Wthread-safety-analysis" was already enabled. Negative checks
  are an experimental feature of TSA and disabled
  (--> cmake/warnings.cmake). Compile times did not increase noticeably.

- TSA is used in a few places with simple locking. I tried TSA also
  where locking is more complex. The problem was usually that it is
  unclear which data is protected by which lock :-(. But there was
  definitely some weird code where locking looked broken. So there is
  some potential to find bugs.

*** Limitations of TSA besides the ones listed in [1]:

- The programmer needs to know which lock protects which piece of shared
  data. This is not always easy for large classes.

- Two synchronization primitives used in ClickHouse are not annotated in
  libcxx:
  (1) std::unique_lock: A releaseable lock handle often together with
      std::condition_variable, e.g. in solve producer-consumer problems.
  (2) std::recursive_mutex: A re-entrant mutex variant. Its usage can be
      considered a design flaw + typically it is slower than a standard
      mutex. In this commit, one std::recursive_mutex was converted to
      std::mutex and annotated with TSA.

- For free-standing functions (e.g. helper functions) which are passed
  shared data members, it can be tricky to specify the associated lock.
  This is because the annotations use the normal C++ rules for symbol
  resolution.

[0] https://clang.llvm.org/docs/ThreadSafetyAnalysis.html
[1] https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/42958.pdf
2022-06-20 16:13:25 +02:00
Amos Bird
4a5e4274f0
base should not depend on Common 2022-04-29 10:26:35 +08:00
Robert Schulze
118e94523c
Activate clang-tidy warning "readability-container-contains"
This check suggests replacing <Container>.count() by
<Container>.contains() which is more speaking and in case of
multimaps/multisets also faster.
2022-04-18 23:53:11 +02:00
alesapin
e790a73081 Simplify strip for new packages 2022-03-23 15:14:30 +01:00
Mikhail f. Shiryaev
1d362796df
Fix strip bug 2022-03-22 11:10:02 +01:00
Mikhail f. Shiryaev
fa2a9bb9aa
Separate BUILD_STRIPPED_BINARIES_PREFIX to option and parameter 2022-03-22 11:10:02 +01:00
alesapin
e53578910b Add ability to strip binaries in cmake 2022-03-10 22:23:28 +01:00
Azat Khuzhin
3b3635c6d5 Fix formatting error in logging messages
Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
2022-02-01 14:30:04 +03:00
Azat Khuzhin
bedf208cbd Use fmt::runtime() for LOG_* for non constexpr
Here is oneliner:

    $ gg 'LOG_\(DEBUG\|TRACE\|INFO\|TEST\|WARNING\|ERROR\|FATAL\)([^,]*, [a-zA-Z]' -- :*.cpp :*.h | cut -d: -f1 | sort -u | xargs -r sed -E -i 's#(LOG_[A-Z]*)\(([^,]*), ([A-Za-z][^,)]*)#\1(\2, fmt::runtime(\3)#'

Note, that I tried to do this with coccinelle (tool for semantic
patchin), but it cannot parse C++:

    $ cat fmt.cocci
    @@
    expression log;
    expression var;
    @@

    -LOG_DEBUG(log, var)
    +LOG_DEBUG(log, fmt::runtime(var))

I've also tried to use some macros/templates magic to do this implicitly
in logger_useful.h, but I failed to do so, and apparently it is not
possible for now.

Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>

v2: manual fixes
Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
2022-02-01 14:30:03 +03:00
Nikolai Kochetov
a08c98d760 Move some files. 2021-10-16 17:03:50 +03:00
Nikolai Kochetov
ab28c6c855 Remove BlockInputStream interfaces. 2021-10-14 13:25:43 +03:00
Nikolai Kochetov
ec18340351 Remove streams from formats. 2021-10-11 19:11:50 +03:00
Alexey Milovidov
fe6b7c77c7 Rename "common" to "base" 2021-10-02 10:13:14 +03:00
kssenii
294695bb7d Review fixes 2021-08-02 13:40:58 +00:00
kssenii
9c6a8b0059 Restore previous ids passing 2021-08-01 08:59:19 +00:00
kssenii
130253e3b9 Fix bridge-server interaction in case of metadata inconsistency 2021-08-01 08:59:16 +00:00
Raúl Marín
2442216472 Fix style too 2021-07-28 11:39:53 +02:00
kssenii
3fe5e8d1ce Fix 2021-07-28 08:30:58 +00:00
kssenii
6c220c8b35 Fix ids parsing 2021-07-27 20:54:21 +00:00
Nikolai Kochetov
d03bcebc8e Remove debug logging. 2021-07-23 12:05:42 +03:00
Nikolai Kochetov
f38de35b14 Rename some constants. 2021-07-21 19:13:17 +03:00
alexey-milovidov
04be5437d9
Merge pull request #25296 from abyss7/http-issues
Add settings for HTTP header limitations
2021-06-17 01:50:48 +03:00
Maksim Kita
67e9b85951 Merge ext into common 2021-06-16 23:28:41 +03:00
Ivan Lezhankin
ba08a580f8 Add test 2021-06-16 17:33:14 +03:00
Ivan Lezhankin
b182d87d9c Add settings for HTTP header limitations 2021-06-15 17:33:46 +03:00
Alexey Milovidov
e905883c75 More fixes for PVS-Studio 2021-05-08 19:12:31 +03:00
Maksim Kita
dcf41db1ae
Merge pull request #23048 from kitaisreal/library-dictionary-bridge-library-interface
LibraryDictionary bridge library interface
2021-04-14 11:23:29 +03:00
Maksim Kita
616d7d19f8 LibraryDictionary bridge library interface 2021-04-13 22:53:36 +03:00
kssenii
7a287e6fe9 Merge branch 'master' of https://github.com/ClickHouse/ClickHouse into nanodbc 2021-04-11 21:36:08 +00:00
Ivan
495c6e03aa
Replace all Context references with std::weak_ptr (#22297)
* Replace all Context references with std::weak_ptr

* Fix shared context captured by value

* Fix build

* Fix Context with named sessions

* Fix copy context

* Fix gcc build

* Merge with master and fix build

* Fix gcc-9 build
2021-04-11 02:33:54 +03:00
kssenii
7a89948801 Fix 2021-04-07 07:16:50 +00:00
kssenii
4419a430cb Less dependencies 2021-04-06 20:15:32 +00:00
kssenii
b629f5c64d Add const 2021-04-05 14:15:10 +00:00
kssenii
89a2e94364 Fixes 2021-04-05 14:08:49 +00:00
kssenii
02c6332e86 Pass null values properly 2021-04-02 18:45:42 +03:00
kssenii
ab3caf7b3c Add exception message 2021-03-26 16:16:31 +00:00
kssenii
6d41f7356b Better way to pass attributes 2021-03-24 19:32:31 +00:00
kssenii
7da36be9b6 Better 2021-03-24 09:23:29 +00:00
kssenii
c008f054ae Pass sample_block only once 2021-03-24 08:41:42 +00:00
kssenii
1ef3c1f780 Use binary format for params 2021-03-24 07:55:21 +00:00
kssenii
b8d9b97903 Better 2021-03-23 15:43:14 +00:00
kssenii
e877402406 Better 2021-03-22 15:58:20 +00:00
kssenii
472ce89b75 Small fixes 2021-03-22 14:39:17 +00:00
kssenii
4ba83aa87a Small improvement 2021-03-17 08:20:14 +00:00
kssenii
323fb54a8e Fix split build finally 2021-03-12 21:12:34 +00:00
kssenii
02ed33936a Fix split build 2021-03-12 12:54:49 +00:00
kssenii
4d29241d5a Try fix build 2021-03-10 21:14:09 +00:00
kssenii
e77ff68582 Better 2021-03-10 18:26:15 +00:00
kssenii
38f7f37468 Add loadKeys method 2021-03-10 13:23:07 +00:00
kssenii
8a9fa561c7 Fix style check, build, ya check 2021-03-07 20:07:42 +00:00