mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Use transaction-aware DB->stat() call when doing 'ANALYZE TABLE' on
a table using the BDB storage engine. (Bug #14671) mysql-test/r/bdb-crash.result: Update test result sql/ha_berkeley.cc: Remove unnecessary code to skip 'ANALYZE TABLE' when transactions are in process, now that BDB supports passing the transaction to the DB->stat() method.
This commit is contained in:
@ -35,5 +35,5 @@ set autocommit=0;
|
|||||||
insert into t1 values(1);
|
insert into t1 values(1);
|
||||||
analyze table t1;
|
analyze table t1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 analyze status Operation need committed state
|
test.t1 analyze status OK
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
@ -2286,40 +2286,6 @@ int ha_berkeley::analyze(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
berkeley_trx_data *trx=(berkeley_trx_data *)thd->ha_data[berkeley_hton.slot];
|
berkeley_trx_data *trx=(berkeley_trx_data *)thd->ha_data[berkeley_hton.slot];
|
||||||
DBUG_ASSERT(trx);
|
DBUG_ASSERT(trx);
|
||||||
|
|
||||||
/*
|
|
||||||
Original bdb documentation says:
|
|
||||||
"The DB->stat method cannot be transaction-protected.
|
|
||||||
For this reason, it should be called in a thread of
|
|
||||||
control that has no open cursors or active transactions."
|
|
||||||
So, let's check if there are any changes have been done since
|
|
||||||
the beginning of the transaction..
|
|
||||||
*/
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
u_int32_t all_id= trx->all->id(trx->all);
|
|
||||||
u_int32_t stmt_id= trx->stmt->id(trx->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->s->keys ; i++)
|
for (i=0 ; i < table->s->keys ; i++)
|
||||||
{
|
{
|
||||||
if (stat)
|
if (stat)
|
||||||
@ -2327,7 +2293,7 @@ int ha_berkeley::analyze(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
free(stat);
|
free(stat);
|
||||||
stat=0;
|
stat=0;
|
||||||
}
|
}
|
||||||
if ((key_file[i]->stat)(key_file[i], NULL, (void*) &stat, 0))
|
if ((key_file[i]->stat)(key_file[i], trx->all, (void*) &stat, 0))
|
||||||
goto err; /* purecov: inspected */
|
goto err; /* purecov: inspected */
|
||||||
share->rec_per_key[i]= (stat->bt_ndata /
|
share->rec_per_key[i]= (stat->bt_ndata /
|
||||||
(stat->bt_nkeys ? stat->bt_nkeys : 1));
|
(stat->bt_nkeys ? stat->bt_nkeys : 1));
|
||||||
@ -2340,7 +2306,7 @@ int ha_berkeley::analyze(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
free(stat);
|
free(stat);
|
||||||
stat=0;
|
stat=0;
|
||||||
}
|
}
|
||||||
if ((file->stat)(file, NULL, (void*) &stat, 0))
|
if ((file->stat)(file, trx->all, (void*) &stat, 0))
|
||||||
goto err; /* purecov: inspected */
|
goto err; /* purecov: inspected */
|
||||||
}
|
}
|
||||||
pthread_mutex_lock(&share->mutex);
|
pthread_mutex_lock(&share->mutex);
|
||||||
|
Reference in New Issue
Block a user