From dac9f99327498e898aec1a90f1002a0695fe6432 Mon Sep 17 00:00:00 2001 From: "dkatz@damien-katzs-computer.local" <> Date: Thu, 12 Apr 2007 18:03:26 -0400 Subject: [PATCH] Bug #27322 failure to allocate transaction_prealloc_size causes crash Fix for when memory pre-allocation fails. --- mysql-test/r/bdb_notembedded.result | 35 ++++++++++++++++++++++++++ mysql-test/r/variables-big.result | 20 +++++++++++++++ mysql-test/t/bdb_notembedded.test | 38 +++++++++++++++++++++++++++++ mysql-test/t/variables-big.test | 20 +++++++++++++++ mysys/my_alloc.c | 4 +++ 5 files changed, 117 insertions(+) create mode 100644 mysql-test/r/bdb_notembedded.result create mode 100644 mysql-test/r/variables-big.result create mode 100644 mysql-test/t/bdb_notembedded.test create mode 100644 mysql-test/t/variables-big.test diff --git a/mysql-test/r/bdb_notembedded.result b/mysql-test/r/bdb_notembedded.result new file mode 100644 index 00000000000..14cb5fad915 --- /dev/null +++ b/mysql-test/r/bdb_notembedded.result @@ -0,0 +1,35 @@ +set autocommit=1; +reset master; +create table bug16206 (a int); +insert into bug16206 values(1); +start transaction; +insert into bug16206 values(2); +commit; +show binlog events; +Log_name Pos Event_type Server_id End_log_pos Info +f n Format_desc 1 n Server ver: VERSION, Binlog ver: 4 +f n Query 1 n use `test`; create table bug16206 (a int) +f n Query 1 n use `test`; insert into bug16206 values(1) +f n Query 1 n use `test`; insert into bug16206 values(2) +drop table bug16206; +reset master; +create table bug16206 (a int) engine= bdb; +insert into bug16206 values(0); +insert into bug16206 values(1); +start transaction; +insert into bug16206 values(2); +commit; +insert into bug16206 values(3); +show binlog events; +Log_name Pos Event_type Server_id End_log_pos Info +f n Format_desc 1 n Server ver: VERSION, Binlog ver: 4 +f n Query 1 n use `test`; create table bug16206 (a int) engine= bdb +f n Query 1 n use `test`; insert into bug16206 values(0) +f n Query 1 n use `test`; insert into bug16206 values(1) +f n Query 1 n use `test`; BEGIN +f n Query 1 n use `test`; insert into bug16206 values(2) +f n Query 1 n use `test`; COMMIT +f n Query 1 n use `test`; insert into bug16206 values(3) +drop table bug16206; +set autocommit=0; +End of 5.0 tests diff --git a/mysql-test/r/variables-big.result b/mysql-test/r/variables-big.result new file mode 100644 index 00000000000..d7906869276 --- /dev/null +++ b/mysql-test/r/variables-big.result @@ -0,0 +1,20 @@ +set session transaction_prealloc_size=1024*1024*1024*1; +show processlist; +Id User Host db Command Time State Info +1 root localhost test Query 0 NULL show processlist +set session transaction_prealloc_size=1024*1024*1024*2; +show processlist; +Id User Host db Command Time State Info +1 root localhost test Query 2 NULL show processlist +set session transaction_prealloc_size=1024*1024*1024*3; +show processlist; +Id User Host db Command Time State Info +1 root localhost test Query 0 NULL show processlist +set session transaction_prealloc_size=1024*1024*1024*4; +show processlist; +Id User Host db Command Time State Info +1 root localhost test Query 0 NULL show processlist +set session transaction_prealloc_size=1024*1024*1024*5; +show processlist; +Id User Host db Command Time State Info +1 root localhost test Query 0 NULL show processlist diff --git a/mysql-test/t/bdb_notembedded.test b/mysql-test/t/bdb_notembedded.test new file mode 100644 index 00000000000..24e64ebbfb2 --- /dev/null +++ b/mysql-test/t/bdb_notembedded.test @@ -0,0 +1,38 @@ +-- source include/not_embedded.inc +-- source include/have_bdb.inc + +# +# Bug #16206: Superfluous COMMIT event in binlog when updating BDB in autocommit mode +# +set autocommit=1; + +let $VERSION=`select version()`; + +reset master; +create table bug16206 (a int); +insert into bug16206 values(1); +start transaction; +insert into bug16206 values(2); +commit; +--replace_result $VERSION VERSION +--replace_column 1 f 2 n 5 n +show binlog events; +drop table bug16206; + +reset master; +create table bug16206 (a int) engine= bdb; +insert into bug16206 values(0); +insert into bug16206 values(1); +start transaction; +insert into bug16206 values(2); +commit; +insert into bug16206 values(3); +--replace_result $VERSION VERSION +--replace_column 1 f 2 n 5 n +show binlog events; +drop table bug16206; + +set autocommit=0; + + +--echo End of 5.0 tests diff --git a/mysql-test/t/variables-big.test b/mysql-test/t/variables-big.test new file mode 100644 index 00000000000..43326f3d016 --- /dev/null +++ b/mysql-test/t/variables-big.test @@ -0,0 +1,20 @@ +# +# test variables big +# + +--source include/big_test.inc + +# +# Bug #27322 failure to allocate transaction_prealloc_size causes crash +# + +set session transaction_prealloc_size=1024*1024*1024*1; +show processlist; +set session transaction_prealloc_size=1024*1024*1024*2; +show processlist; +set session transaction_prealloc_size=1024*1024*1024*3; +show processlist; +set session transaction_prealloc_size=1024*1024*1024*4; +show processlist; +set session transaction_prealloc_size=1024*1024*1024*5; +show processlist; diff --git a/mysys/my_alloc.c b/mysys/my_alloc.c index cfa2dd6216d..5983a29a3e1 100644 --- a/mysys/my_alloc.c +++ b/mysys/my_alloc.c @@ -133,6 +133,10 @@ void reset_root_defaults(MEM_ROOT *mem_root, uint block_size, mem->next= *prev; *prev= mem_root->pre_alloc= mem; } + else + { + mem_root->pre_alloc= 0; + } } } else