mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
MDEV-7906: InnoDB: Failing assertion: prebuilt->sql_stat_start || trx->state == 1 on concurrent multi-table update
Analysis: Problem is that SQL-layer calls handler API after storage engine has already returned error state. InnoDB does internal rollback when it notices transaction error (e.g. lock wait timeout, deadlock, etc.) and after this transaction is not naturally in correct state to continue. Fix: Do not continue fetch operations if transaction is not started.
This commit is contained in:
parent
c79e98e491
commit
a8b8544a03
2 changed files with 10 additions and 2 deletions
|
@ -93,7 +93,6 @@ extern "C" {
|
|||
#include "ibuf0ibuf.h"
|
||||
|
||||
enum_tx_isolation thd_get_trx_isolation(const THD* thd);
|
||||
|
||||
}
|
||||
|
||||
#include "ha_innodb.h"
|
||||
|
@ -6299,6 +6298,11 @@ ha_innobase::general_fetch(
|
|||
|
||||
DBUG_ENTER("general_fetch");
|
||||
|
||||
/* If transaction is not startted do not continue, instead return a error code. */
|
||||
if(!(prebuilt->sql_stat_start || (prebuilt->trx && prebuilt->trx->conc_state == 1))) {
|
||||
DBUG_RETURN(HA_ERR_END_OF_FILE);
|
||||
}
|
||||
|
||||
ut_a(prebuilt->trx == thd_to_trx(user_thd));
|
||||
|
||||
innodb_srv_conc_enter_innodb(prebuilt->trx);
|
||||
|
|
|
@ -102,7 +102,6 @@ extern "C" {
|
|||
#include "ibuf0ibuf.h"
|
||||
|
||||
enum_tx_isolation thd_get_trx_isolation(const THD* thd);
|
||||
|
||||
}
|
||||
|
||||
#include "ha_innodb.h"
|
||||
|
@ -7327,6 +7326,11 @@ ha_innobase::general_fetch(
|
|||
|
||||
DBUG_ENTER("general_fetch");
|
||||
|
||||
/* If transaction is not startted do not continue, instead return a error code. */
|
||||
if(!(prebuilt->sql_stat_start || (prebuilt->trx && prebuilt->trx->state == 1))) {
|
||||
DBUG_RETURN(HA_ERR_END_OF_FILE);
|
||||
}
|
||||
|
||||
if (UNIV_UNLIKELY(share->ib_table->is_corrupt &&
|
||||
srv_pass_corrupt_table <= 1)) {
|
||||
DBUG_RETURN(HA_ERR_CRASHED);
|
||||
|
|
Loading…
Add table
Reference in a new issue