Skip to content

Commit 2e13941

Browse files
MCOL-5464: Fixes of bugs from ASAN warnings, part one (mariadb-corporation#2792)
* Fixes of bugs from ASAN warnings, part one * MQC as static library, with nifty counter for global map and mutex * Switch clang to 16 * link messageqcpp to execplan
1 parent ac88810 commit 2e13941

File tree

76 files changed

+630
-2050
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+630
-2050
lines changed

.drone.jsonnet

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ local cmakeflags = '-DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_CONFIG=mysql_relea
3131
'-DPLUGIN_GSSAPI=NO -DPLUGIN_SPIDER=NO -DPLUGIN_OQGRAPH=NO -DPLUGIN_SPHINX=NO ' +
3232
'-DWITH_EMBEDDED_SERVER=NO -DWITH_WSREP=NO -DWITH_COREDUMPS=ON';
3333

34-
local clang_version = '14';
34+
local clang_version = '16';
3535
local gcc_version = '11';
3636

3737
local clang_update_alternatives = 'update-alternatives --install /usr/bin/clang clang /usr/bin/clang-' + clang_version + ' 100 --slave /usr/bin/clang++ clang++ /usr/bin/clang++-' + clang_version + ' && update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100 && update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++ 100 ';

CMakeLists.txt

+7-2
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ IF (NOT INSTALL_LAYOUT)
205205
ENDIF()
206206
OPTION(SECURITY_HARDENED "Use security-enhancing compiler features (stack protector, relro, etc)" ${security_default})
207207
OPTION(SECURITY_HARDENED_NEW "Use new security-enhancing compilier features" OFF)
208-
IF(SECURITY_HARDENED)
208+
IF(SECURITY_HARDENED AND NOT WITH_ASAN AND NOT WITH_UBSAN AND NOT WITH_TSAN AND NOT WITH_GPROF)
209209
# security-enhancing flags
210210
MY_CHECK_AND_SET_COMPILER_FLAG("-pie -fPIC")
211211
MY_CHECK_AND_SET_COMPILER_FLAG("-Wl,-z,relro,-z,now")
@@ -237,10 +237,15 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
237237
MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-register")
238238
endif()
239239

240+
IF (WITH_COLUMNSTORE_ASAN)
241+
MY_CHECK_AND_SET_COMPILER_FLAG("-U_FORTIFY_SOURCE" DEBUG RELWITHDEBINFO)
242+
MY_CHECK_AND_SET_COMPILER_FLAG("-fsanitize=address -fsanitize-address-use-after-scope -fPIC")
243+
ENDIF()
244+
240245
MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-deprecated-copy" DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
241246
MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-deprecated-declarations" DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
242247

243-
MY_CHECK_AND_SET_COMPILER_FLAG("-Werror -Wall")
248+
MY_CHECK_AND_SET_COMPILER_FLAG("-Werror -Wall -Wextra")
244249
SET (ENGINE_LDFLAGS "-Wl,--no-as-needed -Wl,--add-needed")
245250
SET (ENGINE_DT_LIB datatypes)
246251
SET (ENGINE_COMMON_LIBS messageqcpp loggingcpp configcpp idbboot boost_thread xml2 pthread rt ${ENGINE_DT_LIB})

build/bootstrap_mcs.sh

+112-20
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,25 @@ message "Building Mariadb Server from $color_yellow$MDB_SOURCE_PATH$color_normal
1818

1919
BUILD_TYPE_OPTIONS=("Debug" "RelWithDebInfo")
2020
DISTRO_OPTIONS=("Ubuntu" "CentOS" "Debian" "Rocky")
21+
22+
cd $SCRIPT_LOCATION
23+
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
2124
BRANCHES=($(git branch --list --no-color| grep "[^* ]+" -Eo))
25+
cd -
26+
2227

2328
optparse.define short=t long=build-type desc="Build Type: ${BUILD_TYPE_OPTIONS[*]}" variable=MCS_BUILD_TYPE
2429
optparse.define short=d long=distro desc="Choouse your OS: ${DISTRO_OPTIONS[*]}" variable=OS
25-
optparse.define short=s long=skip-deps desc="Skip install dependences" variable=SKIP_DEPS default=false value=true
30+
optparse.define short=D long=install-deps desc="Install dependences" variable=INSTALL_DEPS default=false value=true
2631
optparse.define short=C long=force-cmake-reconfig desc="Force cmake reconfigure" variable=FORCE_CMAKE_CONFIG default=false value=true
2732
optparse.define short=S long=skip-columnstore-submodules desc="Skip columnstore submodules initialization" variable=SKIP_SUBMODULES default=false value=true
2833
optparse.define short=u long=skip-unit-tests desc="Skip UnitTests" variable=SKIP_UNIT_TESTS default=false value=true
2934
optparse.define short=B long=run-microbench="Compile and run microbenchmarks " variable=RUN_BENCHMARKS default=false value=true
30-
optparse.define short=b long=branch desc="Choouse git branch ('none' for menu)" variable=BRANCH
35+
optparse.define short=b long=branch desc="Choose git branch. For menu use -b \"\"" variable=BRANCH default=$CURRENT_BRANCH
3136
optparse.define short=D long=without-core-dumps desc="Do not produce core dumps" variable=WITHOUT_COREDUMPS default=false value=true
37+
optparse.define short=A long=asan desc="Build with ASAN" variable=ASAN default=false value=true
38+
optparse.define short=v long=verbose desc="Verbose makefile commands" variable=MAKEFILE_VERBOSE default=false value=true
39+
optparse.define short=P long=report-path desc="Path for storing reports and profiles" variable=REPORT_PATH default="/core"
3240

3341
source $( optparse.build )
3442

@@ -45,27 +53,34 @@ INSTALL_PREFIX="/usr/"
4553
DATA_DIR="/var/lib/mysql/data"
4654
CMAKE_BIN_NAME=cmake
4755
CTEST_BIN_NAME=ctest
56+
CONFIG_DIR="/etc/my.cnf.d"
57+
58+
if [[ $OS = 'Ubuntu' || $OS = 'Debian' ]]; then
59+
CONFIG_DIR="/etc/mysql/mariadb.conf.d"
60+
fi
61+
4862

4963
select_branch()
5064
{
65+
cd $SCRIPT_LOCATION
66+
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
67+
5168
if [[ ! " ${BRANCHES[*]} " =~ " ${BRANCH} " ]]; then
52-
if [[ $BRANCH = 'none' ]]; then
69+
if [[ $BRANCH = "" ]]; then
5370
getChoice -q "Select your branch" -o BRANCHES
5471
BRANCH=$selectedChoice
5572
fi
56-
cd $SCRIPT_LOCATION
57-
message "Selecting $BRANCH branch for Columnstore"
58-
git checkout $BRANCH
59-
cd -
73+
if [[ $BRANCH != $CURRENT_BRANCH ]]; then
74+
message "Selecting $BRANCH branch for Columnstore"
75+
git checkout $BRANCH
76+
fi
6077

6178
message "Turning off Columnstore submodule auto update via gitconfig"
6279
cd $MDB_SOURCE_PATH
6380
git config submodule.storage/columnstore/columnstore.update none
6481
cd -
6582
fi
6683

67-
cd $SCRIPT_LOCATION
68-
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
6984
cd -
7085
message "Columnstore will be built from $color_yellow$CURRENT_BRANCH$color_normal branch"
7186
}
@@ -136,7 +151,9 @@ clean_old_installation()
136151
rm -rf /var/lib/columnstore/local/
137152
rm -f /var/lib/columnstore/storagemanager/storagemanager-lock
138153
rm -f /var/lib/columnstore/storagemanager/cs-initialized
154+
rm -rf /var/log/mariadb/columnstore/*
139155
rm -rf /tmp/*
156+
rm -rf $REPORT_PATH
140157
rm -rf /var/lib/mysql
141158
rm -rf /var/run/mysqld
142159
rm -rf $DATA_DIR
@@ -161,7 +178,8 @@ build()
161178
-DWITH_WSREP=OFF
162179
-DWITH_SSL=system
163180
-DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX
164-
-DCMAKE_EXPORT_COMPILE_COMMANDS=1"
181+
-DCMAKE_EXPORT_COMPILE_COMMANDS=1
182+
"
165183

166184

167185
if [[ $SKIP_UNIT_TESTS = true ]] ; then
@@ -172,11 +190,21 @@ build()
172190
message "Buiding with unittests"
173191
fi
174192

193+
if [[ $ASAN = true ]] ; then
194+
warn "Building with ASAN"
195+
MDB_CMAKE_FLAGS="${MDB_CMAKE_FLAGS} -DWITH_ASAN=ON -DWITH_COLUMNSTORE_ASAN=ON -DWITH_COLUMNSTORE_REPORT_PATH=${REPORT_PATH}"
196+
fi
197+
175198
if [[ $WITHOUT_COREDUMPS = true ]] ; then
176199
warn "Cores are not dumped"
177-
178200
else
179201
MDB_CMAKE_FLAGS="${MDB_CMAKE_FLAGS} -DWITH_COREDUMPS=ON"
202+
echo "${REPORT_PATH}/core_%e.%p" | sudo tee /proc/sys/kernel/core_pattern
203+
fi
204+
205+
if [[ $MAKEFILE_VERBOSE = true ]] ; then
206+
warn "Verbosing Makefile Commands"
207+
MDB_CMAKE_FLAGS="${MDB_CMAKE_FLAGS} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
180208
fi
181209

182210
if [[ $RUN_BENCHMARKS = true ]] ; then
@@ -197,7 +225,6 @@ build()
197225
message "Buiding without microbenchmarks"
198226
fi
199227

200-
201228
cd $MDB_SOURCE_PATH
202229

203230
if [[ $SKIP_SUBMODULES = true ]] ; then
@@ -228,11 +255,13 @@ build()
228255
message "building with flags $MDB_CMAKE_FLAGS"
229256

230257
local CPUS=$(getconf _NPROCESSORS_ONLN)
231-
${CMAKE_BIN_NAME} . -DCMAKE_BUILD_TYPE=$MCS_BUILD_TYPE $MDB_CMAKE_FLAGS && \
232-
make -j $CPUS install
258+
${CMAKE_BIN_NAME} -DCMAKE_BUILD_TYPE=$MCS_BUILD_TYPE $MDB_CMAKE_FLAGS && \ |
259+
make -j $CPUS
260+
message "Installing silently"
261+
make -j $CPUS install > /dev/null
233262

234263
if [ $? -ne 0 ]; then
235-
error "!!!! BUILD FAILED"
264+
error "!!!! BUILD FAILED !!!!"
236265
exit 1
237266
fi
238267
cd -
@@ -259,7 +288,7 @@ run_unit_tests()
259288
else
260289
message "Running unittests"
261290
cd $MDB_SOURCE_PATH
262-
${CTEST_BIN_NAME} . -R columnstore: -j $(nproc)
291+
${CTEST_BIN_NAME} . -R columnstore: -j $(nproc) --progress
263292
cd -
264293
fi
265294
}
@@ -271,14 +300,56 @@ run_microbenchmarks_tests()
271300
else
272301
message "Runnning microbenchmarks"
273302
cd $MDB_SOURCE_PATH
274-
${CTEST_BIN_NAME} . -V -R columnstore_microbenchmarks: -j $(nproc)
303+
${CTEST_BIN_NAME} . -V -R columnstore_microbenchmarks: -j $(nproc) --progress
275304
cd -
276305
fi
277306
}
278307

308+
disable_plugins_for_bootstrap()
309+
{
310+
find /etc -type f -exec sed -i 's/plugin-load-add=auth_gssapi.so//g' {} +
311+
find /etc -type f -exec sed -i 's/plugin-load-add=ha_columnstore.so//g' {} +
312+
}
313+
314+
enable_columnstore_back()
315+
{
316+
echo plugin-load-add=ha_columnstore.so >> $CONFIG_DIR/columnstore.cnf
317+
}
318+
319+
fix_config_files()
320+
{
321+
message Fixing config files
322+
323+
THREAD_STACK_SIZE="20M"
324+
325+
SYSTEMD_SERVICE_DIR="/usr/lib/systemd/system"
326+
if [[ $ASAN = true ]] ; then
327+
COLUMNSTORE_CONFIG=$CONFIG_DIR/columnstore.cnf
328+
if grep -q thread_stack $COLUMNSTORE_CONFIG; then
329+
warn "MDB Server has thread_stack settings on $COLUMNSTORE_CONFIG check it's compatibility with ASAN"
330+
else
331+
echo "thread_stack = ${THREAD_STACK_SIZE}" >> $COLUMNSTORE_CONFIG
332+
message "thread_stack was set to ${THREAD_STACK_SIZE} in $COLUMNSTORE_CONFIG"
333+
fi
334+
335+
MDB_SERVICE_FILE=$SYSTEMD_SERVICE_DIR/mariadb.service
336+
if grep -q ASAN $MDB_SERVICE_FILE; then
337+
warn "MDB Server has ASAN options in $MDB_SERVICE_FILE, check it's compatibility"
338+
else
339+
echo Environment="'ASAN_OPTIONS=abort_on_error=1:disable_coredump=0,print_stats=false,detect_odr_violation=0,check_initialization_order=1,detect_stack_use_after_return=1,atexit=false,log_path=${ASAN_PATH}'" >> $MDB_SERVICE_FILE
340+
message "ASAN options were added to $MDB_SERVICE_FILE"
341+
fi
342+
fi
343+
systemctl daemon-reload
344+
}
345+
279346
install()
280347
{
281348
message "Installing MariaDB"
349+
disable_plugins_for_bootstrap
350+
351+
mkdir -p $REPORT_PATH
352+
chmod 777 $REPORT_PATH
282353

283354
check_user_and_group
284355

@@ -288,10 +359,15 @@ install()
288359
socket=/run/mysqld/mysqld.sock" > /etc/my.cnf.d/socket.cnf'
289360

290361
mv $INSTALL_PREFIX/lib/mysql/plugin/ha_columnstore.so /tmp/ha_columnstore_1.so || mv $INSTALL_PREFIX/lib64/mysql/plugin/ha_columnstore.so /tmp/ha_columnstore_2.so
362+
mkdir -p /var/lib/mysql
363+
chown mysql:mysql /var/lib/mysql
364+
291365
message "Running mysql_install_db"
292-
mysql_install_db --rpm --user=mysql
366+
sudo -u mysql mysql_install_db --rpm --user=mysql > /dev/null
293367
mv /tmp/ha_columnstore_1.so $INSTALL_PREFIX/lib/mysql/plugin/ha_columnstore.so || mv /tmp/ha_columnstore_2.so $INSTALL_PREFIX/lib64/mysql/plugin/ha_columnstore.so
294368

369+
enable_columnstore_back
370+
295371
mkdir -p /etc/columnstore
296372

297373
cp $MDB_SOURCE_PATH/storage/columnstore/columnstore/oam/etc/Columnstore.xml /etc/columnstore/Columnstore.xml
@@ -308,7 +384,7 @@ socket=/run/mysqld/mysqld.sock" > /etc/my.cnf.d/socket.cnf'
308384
> /etc/mysql/debian.cnf
309385
fi
310386

311-
systemctl daemon-reload
387+
fix_config_files
312388

313389
if [ -d "/etc/mysql/mariadb.conf.d/" ]; then
314390
message "Copying configs from /etc/mysql/mariadb.conf.d/ to /etc/my.cnf.d"
@@ -345,9 +421,23 @@ socket=/run/mysqld/mysqld.sock" > /etc/my.cnf.d/socket.cnf'
345421
chmod 777 /var/log/mariadb/columnstore
346422
}
347423

424+
425+
smoke()
426+
{
427+
message "Creating test database"
428+
mariadb -e "create database if not exists test;"
429+
message "Selecting magic numbers"
430+
MAGIC=`mysql -N test < $MDB_SOURCE_PATH/storage/columnstore/columnstore/tests/scripts/smoke.sql`
431+
if [[ $MAGIC == '42' ]] ; then
432+
message "Great answer correct"
433+
else
434+
warn "Smoke failed, answer is '$MAGIC'"
435+
fi
436+
}
437+
348438
select_branch
349439

350-
if [[ $SKIP_DEPS = false ]] ; then
440+
if [[ $INSTALL_DEPS = true ]] ; then
351441
install_deps
352442
fi
353443

@@ -358,4 +448,6 @@ run_unit_tests
358448
run_microbenchmarks_tests
359449
install
360450
start_service
451+
smoke
452+
361453
message "$color_green FINISHED $color_normal"

datatypes/mcs_decimal.h

+21
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,27 @@ const int128_t mcs_pow_10_128[20] = {
165165
100000000000000000000000000000000000000_xxl,
166166
};
167167

168+
const long long columnstore_precision[19] = {0,
169+
9,
170+
99,
171+
999,
172+
9999,
173+
99999,
174+
999999,
175+
9999999,
176+
99999999,
177+
999999999,
178+
9999999999LL,
179+
99999999999LL,
180+
999999999999LL,
181+
9999999999999LL,
182+
99999999999999LL,
183+
999999999999999LL,
184+
9999999999999999LL,
185+
99999999999999999LL,
186+
999999999999999999LL};
187+
188+
168189
const int128_t ConversionRangeMaxValue[20] = {9999999999999999999_xxl,
169190
99999999999999999999_xxl,
170191
999999999999999999999_xxl,

0 commit comments

Comments
 (0)