Assertion `pool_.size() == allocd_' failed in gu::MemPool<thread_safe>::~MemPool() [with bool thread_safe = false]

Description

GDB info

#0 0x00007f95a0e32741 in pthread_kill () from /lib64/libpthread.so.0 #1 0x000000000187be40 in my_write_core (sig=6) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/mysys/stacktrace.c:247 #2 0x0000000000e8927a in handle_fatal_signal (sig=6) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/signal_handler.cc:235 #3 <signal handler called> #4 0x00007f959efb95f7 in raise () from /lib64/libc.so.6 #5 0x00007f959efbace8 in abort () from /lib64/libc.so.6 #6 0x00007f959efb2566 in __assert_fail_base () from /lib64/libc.so.6 #7 0x00007f959efb2612 in __assert_fail () from /lib64/libc.so.6 #8 0x00007f958fcedcd2 in gu::MemPool<false>::~MemPool (this=0x36a58c0, __in_chrg=<optimized out>) at galerautils/src/gu_mem_pool.hpp:52 #9 0x00007f958fcedd44 in gu::MemPool<true>::~MemPool (this=0x36a58c0, __in_chrg=<optimized out>) at galerautils/src/gu_mem_pool.hpp:188 #10 0x00007f958fcec8ed in galera::Wsdb::~Wsdb (this=0x36a58c0, __in_chrg=<optimized out>) at galera/src/wsdb.cpp:52 #11 0x00007f958fd13f5d in galera::ReplicatorSMM::~ReplicatorSMM (this=0x36a5130, __in_chrg=<optimized out>) at galera/src/replicator_smm.cpp:302 #12 0x00007f958fd141a9 in galera::ReplicatorSMM::~ReplicatorSMM (this=0x36a5130, __in_chrg=<optimized out>) at galera/src/replicator_smm.cpp:321 #13 0x00007f958fd207ff in galera_tear_down (gh=0x3671d30) at galera/src/wsrep_provider.cpp:103 #14 0x0000000001d9387f in wsrep_unload (hptr=0x3671d30) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/wsrep/wsrep_loader.c:221 #15 0x0000000000e99fe7 in wsrep_deinit () at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/wsrep_mysqld.cc:1201 #16 0x0000000000ea6455 in wsrep_provider_update (self=0x2d06fc0 <Sys_wsrep_provider>, thd=0x7f9518000b70, type=OPT_GLOBAL) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/wsrep_var.cc:365 #17 0x000000000147718b in sys_var::update (this=0x2d06fc0 <Sys_wsrep_provider>, thd=0x7f9518000b70, var=0x7f9518006530) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/set_var.cc:184 #18 0x000000000147788e in sys_var::set_default (this=0x2d06fc0 <Sys_wsrep_provider>, thd=0x7f9518000b70, var=0x7f9518006530) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/set_var.cc:292 #19 0x000000000147886e in set_var::update (this=0x7f9518006530, thd=0x7f9518000b70) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/set_var.cc:812 #20 0x0000000001478116 in sql_set_variables (thd=0x7f9518000b70, var_list=0x7f95180035a0) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/set_var.cc:669 #21 0x00000000015467ff in mysql_execute_command (thd=0x7f9518000b70, first_level=true) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/sql_parse.cc:4404 #22 0x000000000154e7b4 in mysql_parse (thd=0x7f9518000b70, parser_state=0x7f957c15f100) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/sql_parse.cc:6870 #23 0x000000000154d8c8 in wsrep_mysql_parse (thd=0x7f9518000b70, rawbuf=0x7f9518005ab0 "SET @@global.wsrep_provider=default", length=35, parser_state=0x7f957c15f100) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/sql_parse.cc:6538 #24 0x000000000153f831 in dispatch_command (thd=0x7f9518000b70, com_data=0x7f957c15f890, command=COM_QUERY) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/sql_parse.cc:1747 #25 0x000000000153dd96 in do_command (thd=0x7f9518000b70) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/sql_parse.cc:1139 #26 0x00000000016817c5 in handle_connection (arg=0x3beab30) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/sql/conn_handler/connection_handler_per_thread.cc:312 #27 0x00000000018a72b8 in pfs_spawn_thread (arg=0x3bf1800) at /mnt/workspace/qa.pxc57.build/BUILD_TYPE/debug/label_exp/centos7-64/storage/perfschema/pfs.cc:2188 #28 0x00007f95a0e2ddc5 in start_thread () from /lib64/libpthread.so.0 #29 0x00007f959f07aced in clone () from /lib64/libc.so.6

Testcase

# mysqld options to reproduce this issue --multi-range-count=1125899906842624 --wsrep-certify-nonPK=0 --wsrep-convert-LOCK-to-trx=0 CREATE DATABASE test;USE test; set sql_mode='traditional'; use mysql; SET @@global.long_query_time = TRUE; create TABLE t1 ( a varchar(255), key a(a) ) character set utf8 collate utf8_czech_ci; INSERT INTO t1 VALUES (CONVERT(_ucs2 0x062F0633062A USING utf8)); DROP TABLE t1; create table t1 (a tinytext character set latin1); SET @@global.wsrep_provider=default;

Environment

None

Smart Checklist

Activity

Show:

KennT May 1, 2017 at 12:09 PM

5.6
commit 7c5508c31bf3a203d2c055595425a17f24bc0695
Author: Kenn Takara <kenn.takara@percona.com>
Date: Thu Apr 6 04:38:45 2017 -0700

5.7
commit b01de80a52a97852ffa632737e58451c6b92a06e
Author: Kenn Takara <kenn.takara@percona.com>
Date: Thu Apr 6 04:38:45 2017 -0700

Fix https://perconadev.atlassian.net/browse/PXC-749#icft=PXC-749: Assertion `pool_.size() == allocd_' failed in gu::MemPool<thread_safe>::~MemPool() [with bool thread_safe = false]

Issue:
Code asserts when wsrep-certify-nonPK=0 is set and an INSERT is tried on a no-PK table.
The code results in a memory leak (which causes the assert)

Solution:
If the table does not have a PK, and wsrep-certify-nonPK is set to 0, do not
append non-unique keys to the row.

Krunal Bauskar April 6, 2017 at 3:54 AM

diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 9a30ad2..b0c5fac 100644
— a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -10705,9 +10705,10 @@ ha_innobase::wsrep_append_keys(

/* !hasPK == table with no PK,
must append all non-unique keys */
if (!hasPK || key_info>flags & HA_NOSAME ||
- ((tab && wsrep_is_FK_index(tab, idx)) ||
- (!tab && referenced_by_foreign_key()))) {
+ if ((!hasPK && wsrep_certify_nonPK)
+ || key_info->flags & HA_NOSAME
+ || ((tab && wsrep_is_FK_index(tab, idx))
+ || (!tab && referenced_by_foreign_key()))) {

len = wsrep_store_key_val_for_row(
thd, table, i, key0,

Krunal Bauskar April 5, 2017 at 6:48 AM

BTW question still remain what's point in appending non-unique key when it will not make any difference as we are anyway appending complete row digest.

Krunal Bauskar April 5, 2017 at 6:46 AM

PXC#450 introduces an code that will block CREATE TABLE .. from working as it doesn't have a primary key define.

Coming back to PXC#749

  • key that is defined is not a primary key.

  • Since the table doesn't have primary key it will try to append all the non-unique keys to the table and then will generate digest (from inserted rows) that is also appended. This part of the code is bit confusing since if the non-unique key is appended but key_appended is not set to true.

  • since wsrep_certify_nonPK=0 in this case only non-unique key is appended by digest generated (from inserted row) is not.

-----------------------

With that background I think even the non-unquie key should be appended only if wsrep_certify_nonPK=1.

KennT April 5, 2017 at 2:14 AM

The code that was added for https://perconadev.atlassian.net/browse/PXC-450#icft=PXC-450 is overwriting the trx_id, so the original trx_id is not being cleaned up.

Done

Details

Assignee

Reporter

Labels

Affects versions

Priority

Smart Checklist

Created December 13, 2016 at 9:22 AM
Updated January 19, 2020 at 2:42 PM
Resolved May 1, 2017 at 12:09 PM