[debian-mysql] Bug#850682: mariadb-10.0: segmentation fault after killing a query blocked on disk space availability
Apollon Oikonomopoulos
apoikos at debian.org
Mon Jan 9 10:44:23 UTC 2017
Package: mariadb-server-10.0
Version: 10.0.27-0+deb8u1
Severity: grave
Control: tags -1 upstream
Dear Maintainer,
MariaDB 10.0 will segfault reproducibly in the following scenario:
1. A query is blocked waiting for disk space to be freed
2. The same query is killed (through the KILL command, or by issuing a
SIGINT to the DB shell).
3. The internal 60-second sleep timeout in wait_for_free_space() has
elapsed.
Apparently the KILL command causes some of the query's resources to be
immediately free()'d, which however will still be used by the sleeping
thread in its next attempt to write data out to disk. The server's logs
also seem to confirm this:
...
Jan 9 12:17:18 marvin mysqld: 170109 12:17:18 [Warning] mysqld: Disk is full writing '/var/tmp/mysql/#sql_2525_0.MAD' (Errcode: 28 "No space left on device"). Waiting for someone to free space... (Expect up to 60 secs delay for server to continue after freeing disk space)
Jan 9 12:17:18 marvin mysqld: 170109 12:17:18 [Warning] mysqld: Retry in 60 secs. Message reprinted in 600 secs
Jan 9 12:18:18 marvin mysqld: 170109 12:18:18 [ERROR] mysqld got signal 11 ;
...
Jan 9 12:18:18 marvin mysqld: Trying to get some variables.
Jan 9 12:18:18 marvin mysqld: Some pointers may be invalid and cause the dump to abort.
Jan 9 12:18:18 marvin mysqld: Query (0x7f1fdf08e020): is an invalid pointer
Jan 9 12:18:18 marvin mysqld: Connection ID (thread ID): 31
Jan 9 12:18:18 marvin mysqld: Status: KILL_QUERY
...
The problem can be trivially reproduced on an amd64 system using the attached
script that uses a small tmpfs and a crafted query to force the database to an
out-of-disk-space condition.
We actually hit this bug on a production system where a LEFT OUTER JOIN
of GB-sized tables caused an 18GB on-disk temporary table to exhaust all
temp space. Note that MariaDB Server 10.1 does not seem to be affected.
N.B: I know this is really a corner-case, however I'm setting the severity to
`grave' as I'm not sure how well MariaDB copes with the segmentation fault in
terms of data loss. If you feel that this is too aggressive, please downgrade
accordingly.
Regards,
Apollon
-- System Information:
Debian Release: stretch/sid
APT prefers unstable-debug
APT policy: (500, 'unstable-debug'), (500, 'testing-debug'), (500, 'testing'), (500, 'stable'), (90, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 4.8.0-2-amd64 (SMP w/4 CPU cores)
Locale: LANG=el_GR.UTF-8, LC_CTYPE=el_GR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
Versions of packages mariadb-server-10.0 depends on:
ii adduser 3.115
ii debconf [debconf-2.0] 1.5.59
ii libaio1 0.3.110-3
ii libc6 2.24-8
ii libdbi-perl 1.636-1+b1
ii libpam0g 1.1.8-3.3
ii libstdc++6 6.2.1-5
ii lsb-base 9.20161125
ii mariadb-client-10.0 10.0.28-2
ii mariadb-common 10.1.20-3
ii mariadb-server-core-10.0 10.0.27-0+deb8u1
ii passwd 1:4.2-3.3
ii perl 5.24.1~rc4-1
ii psmisc 22.21-2.1+b1
ii zlib1g 1:1.2.8.dfsg-2+b3
Versions of packages mariadb-server-10.0 recommends:
ii libhtml-template-perl 2.95-2
Versions of packages mariadb-server-10.0 suggests:
ii bsd-mailx [mailx] 8.1.2-0.20160123cvs-3
ii mailutils [mailx] 1:2.99.99-1.1+b1
pn mariadb-test <none>
pn tinyca <none>
-- debconf information excluded
-------------- next part --------------
#!/bin/sh
cat >/etc/mysql/mariadb.conf.d/99-local.cnf <<EOF
[mysqld]
tmpdir=/var/tmp/mysql
tmp_table_size=1024
EOF
mkdir /var/tmp/mysql
mount -o size=100k -t tmpfs tmpfs /var/tmp/mysql
systemctl restart mysql
sleep 5
mysql <<EOF
DROP DATABASE IF EXISTS oodtest;
CREATE DATABASE oodtest;
use oodtest;
CREATE TABLE test (id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, data MEDIUMTEXT);
EOF
for i in $(seq 25); do
echo "INSERT INTO test (data) VALUES (REPEAT('a', 16000));"
done | mysql oodtest
# This should block
mysql -e "SELECT * FROM test AS a LEFT OUTER JOIN test AS b ON a.data = b.data LEFT OUTER JOIN test AS c ON b.data = c.data ORDER BY a.data ASC" oodtest &
childpid=$!
sleep 5
# Send SIGINT to the client
echo "Killing the query"
kill -INT $childpid
# MySQL should die within a minute, disconnecting the client
echo "Waiting for MariaDB to die (in approx. 55s)"
wait
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.alioth.debian.org/pipermail/pkg-mysql-maint/attachments/20170109/c18fc20b/attachment.sig>
More information about the pkg-mysql-maint
mailing list