Description:
SET GLOBAL and SET SESSION nondeterministically fails when setting variables such as key_cache_age_threshold, key_cache_block_size, key_cache_division_limit, and key_buffer_size. For example, this is some console output that I produced when setting key_cache_division_limit:
mysql> SET GLOBAL key_cache_division_limit = 100;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL key_cache_division_limit = 100;
ERROR 1210 (HY000): Incorrect arguments to SET
mysql> SET GLOBAL key_cache_division_limit = 100;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL key_cache_division_limit = 100;
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL key_cache_division_limit = 100;
Query OK, 0 rows affected (0.00 sec)
That one of the SET GLOBAL fails is unexpected.
How to repeat:
SET GLOBAL key_cache_division_limit = 100; -- unexpected: ERROR 1210 (HY000): Incorrect arguments to SET
To conveniently trigger the bug, the following Java program can be executed:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class TriggerSetKeyCacheDivisionLimitBug {
private static final String PASSWORD = "";
private static final String USER_NAME = "";
private static final String CONNECTION_STRING = "";
public static void main(String[] args) {
while (true) {
try (Connection con = DriverManager.getConnection(CONNECTION_STRING, USER_NAME, PASSWORD)) {
try (Statement st = con.createStatement()) {
// should also work with key_cache_age_threshold, key_cache_block_size,
// key_cache_division_limit and key_buffer_size global variables
st.execute("SET SESSION key_cache_division_limit = 100");
st.execute("SELECT 1;"); // if the bug cannot be reproduced, try DO SLEEP(1); instead
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
}