diff options
author | Gleb Shchepa <gleb.shchepa@oracle.com> | 2012-03-28 12:22:31 +0400 |
---|---|---|
committer | Gleb Shchepa <gleb.shchepa@oracle.com> | 2012-03-28 12:22:31 +0400 |
commit | 46d848b8e1f3e800f2cd0adbc410e4a9cb9f88ca (patch) | |
tree | b5ad741cd4a68fdc3ee8153a1c7a017450c63629 /storage | |
parent | 19d68d68df7dd1d3b4882434f60d773393c97bc1 (diff) | |
download | mariadb-git-46d848b8e1f3e800f2cd0adbc410e4a9cb9f88ca.tar.gz |
Bug #11880012: INDEX_SUBQUERY, BLACKHOLE,
HANG IN PREPARING WITH 100% CPU USAGE
Infinite loop in the subselect_indexsubquery_engine::exec()
function caused Server hang with 100% CPU usage.
The BLACKHOLE storage engine didn't update handler's
table->status variable after index operations, that
caused an infinite "while(!table->status)" execution.
Index access methods of the BLACKHOLE engine handler
have been updated to set table->status variable to
STATUS_NOT_FOUND or 0 when such a method returns a
HA_ERR_END_OF_FILE error or 0 respectively.
mysql-test/r/blackhole.result:
Bug #11880012: INDEX_SUBQUERY, BLACKHOLE,
HANG IN PREPARING WITH 100% CPU USAGE
New test file for the BLACKHOLE engine.
mysql-test/t/blackhole.test:
Bug #11880012: INDEX_SUBQUERY, BLACKHOLE,
HANG IN PREPARING WITH 100% CPU USAGE
New test file for the BLACKHOLE engine.
storage/blackhole/ha_blackhole.cc:
Bug #11880012: INDEX_SUBQUERY, BLACKHOLE,
HANG IN PREPARING WITH 100% CPU USAGE
Index access methods of the BLACKHOLE engine handler
have been updated to set table->status variable to
STATUS_NOT_FOUND or 0 when such a method returns a
HA_ERR_END_OF_FILE error or 0 respectively, like
we do in MyISAM storage engine.
Diffstat (limited to 'storage')
-rw-r--r-- | storage/blackhole/ha_blackhole.cc | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/storage/blackhole/ha_blackhole.cc b/storage/blackhole/ha_blackhole.cc index c12d5afbfa5..9d0f89915a5 100644 --- a/storage/blackhole/ha_blackhole.cc +++ b/storage/blackhole/ha_blackhole.cc @@ -151,6 +151,7 @@ int ha_blackhole::rnd_next(uchar *buf) else rc= HA_ERR_END_OF_FILE; MYSQL_READ_ROW_DONE(rc); + table->status= rc ? STATUS_NOT_FOUND : 0; DBUG_RETURN(rc); } @@ -241,6 +242,7 @@ int ha_blackhole::index_read_map(uchar * buf, const uchar * key, else rc= HA_ERR_END_OF_FILE; MYSQL_INDEX_READ_ROW_DONE(rc); + table->status= rc ? STATUS_NOT_FOUND : 0; DBUG_RETURN(rc); } @@ -258,6 +260,7 @@ int ha_blackhole::index_read_idx_map(uchar * buf, uint idx, const uchar * key, else rc= HA_ERR_END_OF_FILE; MYSQL_INDEX_READ_ROW_DONE(rc); + table->status= rc ? STATUS_NOT_FOUND : 0; DBUG_RETURN(rc); } @@ -274,6 +277,7 @@ int ha_blackhole::index_read_last_map(uchar * buf, const uchar * key, else rc= HA_ERR_END_OF_FILE; MYSQL_INDEX_READ_ROW_DONE(rc); + table->status= rc ? STATUS_NOT_FOUND : 0; DBUG_RETURN(rc); } @@ -285,6 +289,7 @@ int ha_blackhole::index_next(uchar * buf) MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str); rc= HA_ERR_END_OF_FILE; MYSQL_INDEX_READ_ROW_DONE(rc); + table->status= STATUS_NOT_FOUND; DBUG_RETURN(rc); } @@ -296,6 +301,7 @@ int ha_blackhole::index_prev(uchar * buf) MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str); rc= HA_ERR_END_OF_FILE; MYSQL_INDEX_READ_ROW_DONE(rc); + table->status= STATUS_NOT_FOUND; DBUG_RETURN(rc); } @@ -307,8 +313,8 @@ int ha_blackhole::index_first(uchar * buf) MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str); rc= HA_ERR_END_OF_FILE; MYSQL_INDEX_READ_ROW_DONE(rc); + table->status= STATUS_NOT_FOUND; DBUG_RETURN(rc); - DBUG_RETURN(HA_ERR_END_OF_FILE); } @@ -319,6 +325,7 @@ int ha_blackhole::index_last(uchar * buf) MYSQL_INDEX_READ_ROW_START(table_share->db.str, table_share->table_name.str); rc= HA_ERR_END_OF_FILE; MYSQL_INDEX_READ_ROW_DONE(rc); + table->status= STATUS_NOT_FOUND; DBUG_RETURN(rc); } |