mirror of
https://github.com/MariaDB/server.git
synced 2025-08-05 13:16:09 +03:00
BUG#48757 - missing .ARZ file causes server crash
Server crashes when accessing ARCHIVE table with missing .ARZ file. When opening a table, ARCHIVE didn't properly pass through error code from lower level azopen() to higher level open() method.
This commit is contained in:
@@ -12728,3 +12728,12 @@ Table Op Msg_type Msg_text
|
|||||||
test.t1 repair Error Table upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it!
|
test.t1 repair Error Table upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it!
|
||||||
test.t1 repair error Corrupt
|
test.t1 repair error Corrupt
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# BUG#48757 - missing .ARZ file causes server crash
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(a INT) ENGINE=ARCHIVE;
|
||||||
|
FLUSH TABLE t1;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
ERROR HY000: Can't find file: 't1' (errno: 2)
|
||||||
|
DROP TABLE t1;
|
||||||
|
ERROR 42S02: Unknown table 't1'
|
||||||
|
@@ -1644,3 +1644,14 @@ INSERT INTO t1 (col1, col2) VALUES (1, "value");
|
|||||||
REPAIR TABLE t1;
|
REPAIR TABLE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
remove_file $MYSQLD_DATADIR/test/t1.ARM;
|
remove_file $MYSQLD_DATADIR/test/t1.ARM;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # BUG#48757 - missing .ARZ file causes server crash
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1(a INT) ENGINE=ARCHIVE;
|
||||||
|
FLUSH TABLE t1;
|
||||||
|
--remove_file $MYSQLD_DATADIR/test/t1.ARZ
|
||||||
|
--error ER_FILE_NOT_FOUND
|
||||||
|
SELECT * FROM t1;
|
||||||
|
--error ER_BAD_TABLE_ERROR
|
||||||
|
DROP TABLE t1;
|
||||||
|
@@ -355,6 +355,9 @@ ARCHIVE_SHARE *ha_archive::get_share(const char *table_name, int *rc)
|
|||||||
*/
|
*/
|
||||||
if (!(azopen(&archive_tmp, share->data_file_name, O_RDONLY|O_BINARY)))
|
if (!(azopen(&archive_tmp, share->data_file_name, O_RDONLY|O_BINARY)))
|
||||||
{
|
{
|
||||||
|
*rc= my_errno ? my_errno : -1;
|
||||||
|
pthread_mutex_unlock(&archive_mutex);
|
||||||
|
my_free(share, MYF(0));
|
||||||
DBUG_RETURN(NULL);
|
DBUG_RETURN(NULL);
|
||||||
}
|
}
|
||||||
stats.auto_increment_value= archive_tmp.auto_increment + 1;
|
stats.auto_increment_value= archive_tmp.auto_increment + 1;
|
||||||
@@ -504,16 +507,18 @@ int ha_archive::open(const char *name, int mode, uint open_options)
|
|||||||
For now we have to refuse to open such table to avoid
|
For now we have to refuse to open such table to avoid
|
||||||
potential data loss.
|
potential data loss.
|
||||||
*/
|
*/
|
||||||
if ((rc == HA_ERR_CRASHED_ON_USAGE && !(open_options & HA_OPEN_FOR_REPAIR))
|
switch (rc)
|
||||||
|| rc == HA_ERR_TABLE_NEEDS_UPGRADE)
|
|
||||||
{
|
{
|
||||||
/* purecov: begin inspected */
|
case 0:
|
||||||
|
break;
|
||||||
|
case HA_ERR_CRASHED_ON_USAGE:
|
||||||
|
if (open_options & HA_OPEN_FOR_REPAIR)
|
||||||
|
break;
|
||||||
|
/* fall through */
|
||||||
|
case HA_ERR_TABLE_NEEDS_UPGRADE:
|
||||||
free_share();
|
free_share();
|
||||||
DBUG_RETURN(rc);
|
/* fall through */
|
||||||
/* purecov: end */
|
default:
|
||||||
}
|
|
||||||
else if (rc == HA_ERR_OUT_OF_MEM)
|
|
||||||
{
|
|
||||||
DBUG_RETURN(rc);
|
DBUG_RETURN(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user