summaryrefslogtreecommitdiff
path: root/storage/blackhole
diff options
context:
space:
mode:
authorGleb Shchepa <gleb.shchepa@oracle.com>2012-03-28 12:22:31 +0400
committerGleb Shchepa <gleb.shchepa@oracle.com>2012-03-28 12:22:31 +0400
commit46d848b8e1f3e800f2cd0adbc410e4a9cb9f88ca (patch)
treeb5ad741cd4a68fdc3ee8153a1c7a017450c63629 /storage/blackhole
parent19d68d68df7dd1d3b4882434f60d773393c97bc1 (diff)
downloadmariadb-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/blackhole')
-rw-r--r--storage/blackhole/ha_blackhole.cc9
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);
}