Bug #76650 sysbench read/write crashes on POWER
Submitted: 10 Apr 2015 8:21 Modified: 5 Nov 2018 13:54
Reporter: Stewart Smith Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: InnoDB storage engine Severity:S1 (Critical)
Version:5.7.7 OS:Linux (Ubuntu Vivid ppc64el)
Assigned to: CPU Architecture:Any
Tags: power, PowerPC

[10 Apr 2015 8:21] Stewart Smith
Description:
sysbench read/write workload (any concurrency, any table size) on POWER8 Ubuntu system will hit asserts:

#0  0x00003fffb7a2ef94 in __GI_raise (sig=<optimised out>)
    at ../sysdeps/unix/sysv/linux/raise.c:55
#1  0x00003fffb7a317a4 in __GI_abort () at abort.c:89
#2  0x0000000010325eec in ut_dbg_assertion_failed (
    expr=0x112f0580 "list.count > 0",
    file=0x112f0590 "/home/stewart/mysql-5.7.7-rc/storage/innobase/include/ut0lst.h", line=279)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/ut/ut0dbg.cc:67
#3  0x0000000010d7da8c in ut_list_remove<ut_list_base<trx_t, ut_list_node<trx_t> trx_t::*>, GenericGetNode<trx_t> > (list=..., node=..., get_node=...)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/include/ut0lst.h:279
#4  0x0000000010d7b404 in ut_list_remove<ut_list_base<trx_t, ut_list_node<trx_t> trx_t::*> > (elem=0x3fffae8711f8, list=...)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/include/ut0lst.h:331
#5  trx_commit_in_memory (serialised=true, mtr=0x3fffac27bf30,
    trx=0x3fffae8711f8)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/trx/trx0trx.cc:1963
#6  trx_commit_low (trx=0x3fffae8711f8, mtr=0x3fffac27bf30)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/trx/trx0trx.cc:2177
#7  0x0000000010d7ba28 in trx_commit (trx=0x3fffae8711f8)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/trx/trx0trx.cc:2201
#8  0x0000000010d7be24 in trx_commit_for_mysql (trx=0x3fffae8711f8)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/trx/trx0trx.cc:2431
#9  0x0000000010bcd194 in innobase_commit_low (trx=<optimised out>)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/handler/ha_innodb.cc:3612
#10 0x0000000010bde1c4 in innobase_commit (hton=<optimised out>, thd=
    0x3fbc7c000b40, commit_trx=<optimised out>)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/handler/ha_innodb.cc:3771
#11 0x00000000103b353c in ha_commit_low (thd=0x3fbc7c000b40,
    all=<optimised out>, run_after_commit=<optimised out>)
    at /home/stewart/mysql-5.7.7-rc/sql/handler.cc:1719
#12 0x0000000010828f3c in TC_LOG_DUMMY::commit (this=<optimised out>,
    thd=<optimised out>, all=<optimised out>)
    at /home/stewart/mysql-5.7.7-rc/sql/log.h:104
#13 0x00000000103b42bc in ha_commit_trans (thd=0x3fbc7c000b40,
    all=<optimised out>, ignore_global_read_lock=<optimised out>)
    at /home/stewart/mysql-5.7.7-rc/sql/handler.cc:1615

(gdb) down
#5  trx_commit_in_memory (serialised=true, mtr=0x3fffac27bf30, 
    trx=0x3fffae8711f8)
    at /home/stewart/mysql-5.7.7-rc/storage/innobase/trx/trx0trx.cc:1963
1963                            UT_LIST_REMOVE(trx_sys->rw_trx_list, trx);
(gdb) list
1958
1959                            trx_sys_mutex_enter();
1960
1961                            check_trx_state(trx);
1962
1963                            UT_LIST_REMOVE(trx_sys->rw_trx_list, trx);
1964
1965                            ut_d(trx->in_rw_trx_list = false);
1966
1967                            MONITOR_INC(MONITOR_TRX_RW_COMMIT);

How to repeat:
Build MySQL 5.7.7 on Ubuntu on POWER, run sysbench read/write.

Suggested fix:
I haven't root caused this yet. Read/write workloads seems fine (any concurrency... 2048 threads is fine over hundreds of hardware threads). Read/write though... something goes horribly wrong.
[8 Nov 2017 5:31] Daniel Black
On 8286-42A Power8 in SMT8

tested 5.7.20 running:

bin/mysqld --no-defaults --pid-file=/tmp/master.pid --port 3310 --datadir=/dev/shm/oltp_master --socket /tmp/oltp_master.sock --log-bin=/dev/shm/oltp_master/mysqlbin --server-id=120 --innodb_log_file_size=200M --innodb_log_files_in_group=5 --innodb-buffer-pool-size=6G --innodb-buffer-pool-instances=6 --innodb_file_per_table --binlog_checksum=NONE --innodb_checksum_algorithm=none --max-connections=16000 --max_prepared_stmt_count=1M --core-file

With sysbench as follows:

export try=50
sock=/tmp/oltp_master.sock
engine=innodb
export sysbench_options="--db-driver=mysql --mysql-user=root --mysql-password=mysql --test=oltp --mysql-table-engine=${engine} \
            --mysql-socket=${sock}  \
            --num-threads=50 \
            --oltp-table-size=$(( 20000000 / ${try} ))  --oltp-range-size=0   \
            --oltp-point-selects=0  --oltp-simple-ranges=0 --oltp-sum-ranges=0    --oltp-order-ranges=0 \
            --oltp-distinct-ranges=0   --oltp-connect-delay=0   \
            --oltp-nontrx-mode=update_key"

for a in `seq ${try}`; do
   un=oltp$a;
   mysql -u root -pmysql -S "${sock}" -e "drop database $un" || true;
   mysql -u root -pmysql -S "${sock}" -e "create database $un";
   sysbench ${sysbench_options}  --mysql-db=$un --oltp-table-name=$un   prepare &
done
wait
for a in `seq ${try}`; do
   un=oltp$a;
   ( sysbench ${sysbench_options}  --mysql-db=$un --oltp-table-name=$un run 2>&1 | tee /tmp/sysbench-run.${un}.log ) &
done

No errors or segfaults.

Assumed to be fixed in https://github.com/mysql/mysql-server/commit/8870f822d86644fe4578be7025c76478f42100fa

(release 5.7.13)
[5 Nov 2018 13:54] MySQL Verification Team
Thank you Mr. Black on informing us that a bug is fixed interim 5.7.7 and 5.7.13.

Mr. Smith, if you hit another problem on the POWER CPU, please notify us. However, make sure that your OS and CPU are still supported in the MySQL version that you are testing.

ARM64 will soon be supported in MySQL 8.0 .......