mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
fixed bug #2342
"Running ANALYZE TABLE on bdb table inside a transaction hangs server thread"
This commit is contained in:
parent
d1622a941d
commit
8a66c13b34
5 changed files with 56 additions and 0 deletions
|
@ -30,3 +30,10 @@ ChargeID ServiceID ChargeDate ChargeAmount FedTaxes ProvTaxes ChargeStatus Charg
|
||||||
1 1 2001-03-01 1.00 1.00 1.00 New blablabla NULL now
|
1 1 2001-03-01 1.00 1.00 1.00 New blablabla NULL now
|
||||||
2 1 2001-03-01 1.00 1.00 1.00 New NULL NULL now
|
2 1 2001-03-01 1.00 1.00 1.00 New NULL NULL now
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (a int) engine=bdb;
|
||||||
|
set autocommit=0;
|
||||||
|
insert into t1 values(1);
|
||||||
|
analyze table t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Operation need committed state
|
||||||
|
drop table t1;
|
||||||
|
|
|
@ -36,3 +36,16 @@ INSERT INTO t1
|
||||||
VALUES(NULL,1,'2001-03-01',1,1,1,'New',NULL,NULL,'now');
|
VALUES(NULL,1,'2001-03-01',1,1,1,'New',NULL,NULL,'now');
|
||||||
select * from t1;
|
select * from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test for bug #2342 "Running ANALYZE TABLE on bdb table
|
||||||
|
# inside a transaction hangs server thread"
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1 (a int) engine=bdb;
|
||||||
|
|
||||||
|
set autocommit=0;
|
||||||
|
insert into t1 values(1);
|
||||||
|
analyze table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
|
|
@ -2125,6 +2125,35 @@ int ha_berkeley::analyze(THD* thd, HA_CHECK_OPT* check_opt)
|
||||||
{
|
{
|
||||||
DB_BTREE_STAT *stat=0;
|
DB_BTREE_STAT *stat=0;
|
||||||
uint i;
|
uint i;
|
||||||
|
DB_TXN_STAT *txn_stat_ptr= 0;
|
||||||
|
|
||||||
|
if (!db_env->txn_stat(db_env, &txn_stat_ptr, 0) &&
|
||||||
|
txn_stat_ptr && txn_stat_ptr->st_nactive>=2)
|
||||||
|
{
|
||||||
|
DB_TXN_ACTIVE *atxn_stmt= 0, *atxn_all= 0;
|
||||||
|
|
||||||
|
DB_TXN *txn_all= (DB_TXN*) thd->transaction.all.bdb_tid;
|
||||||
|
u_int32_t all_id= txn_all->id(txn_all);
|
||||||
|
|
||||||
|
DB_TXN *txn_stmt= (DB_TXN*) thd->transaction.stmt.bdb_tid;
|
||||||
|
u_int32_t stmt_id= txn_stmt->id(txn_stmt);
|
||||||
|
|
||||||
|
DB_TXN_ACTIVE *cur= txn_stat_ptr->st_txnarray;
|
||||||
|
DB_TXN_ACTIVE *end= cur + txn_stat_ptr->st_nactive;
|
||||||
|
for (; cur!=end && (!atxn_stmt || !atxn_all); cur++)
|
||||||
|
{
|
||||||
|
if (cur->txnid==all_id) atxn_all= cur;
|
||||||
|
if (cur->txnid==stmt_id) atxn_stmt= cur;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (atxn_stmt && atxn_all &&
|
||||||
|
log_compare(&atxn_stmt->lsn,&atxn_all->lsn))
|
||||||
|
{
|
||||||
|
free(txn_stat_ptr);
|
||||||
|
return HA_ADMIN_REJECT;
|
||||||
|
}
|
||||||
|
free(txn_stat_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
for (i=0 ; i < table->keys ; i++)
|
for (i=0 ; i < table->keys ; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#define HA_ADMIN_CORRUPT -3
|
#define HA_ADMIN_CORRUPT -3
|
||||||
#define HA_ADMIN_INTERNAL_ERROR -4
|
#define HA_ADMIN_INTERNAL_ERROR -4
|
||||||
#define HA_ADMIN_INVALID -5
|
#define HA_ADMIN_INVALID -5
|
||||||
|
#define HA_ADMIN_REJECT -6
|
||||||
|
|
||||||
/* Bits in table_flags() to show what database can do */
|
/* Bits in table_flags() to show what database can do */
|
||||||
#define HA_READ_RND_SAME 1 /* Read RND-record to KEY-record
|
#define HA_READ_RND_SAME 1 /* Read RND-record to KEY-record
|
||||||
|
|
|
@ -1666,6 +1666,12 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
||||||
protocol->store("Operation failed",16, system_charset_info);
|
protocol->store("Operation failed",16, system_charset_info);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case HA_ADMIN_REJECT:
|
||||||
|
protocol->store("status", 6, system_charset_info);
|
||||||
|
protocol->store("Operation need committed state",30, system_charset_info);
|
||||||
|
open_for_modify= false;
|
||||||
|
break;
|
||||||
|
|
||||||
case HA_ADMIN_ALREADY_DONE:
|
case HA_ADMIN_ALREADY_DONE:
|
||||||
protocol->store("status", 6, system_charset_info);
|
protocol->store("status", 6, system_charset_info);
|
||||||
protocol->store("Table is already up to date", 27, system_charset_info);
|
protocol->store("Table is already up to date", 27, system_charset_info);
|
||||||
|
|
Loading…
Add table
Reference in a new issue