summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2016-09-28 17:59:11 +0200
committerSergei Golubchik <serg@mariadb.org>2016-09-28 17:59:11 +0200
commit735a4a17c2b83a214dcd5279c66cd3577ef76eb1 (patch)
tree1f283254cea2d241ea1b1422c4bc88a70ec90208
parent794c826244c4d8b082600afa4999130fe688aa49 (diff)
downloadmariadb-git-735a4a17c2b83a214dcd5279c66cd3577ef76eb1.tar.gz
MDEV-10508 Mariadb crash on out of disk space during dump import
update info->write_end and info->write_pos together, with no "return on error" in between, otherwise write_end might end up being smaller than write_pos
-rw-r--r--mysql-test/r/slowlog_enospace-10508.result60
-rw-r--r--mysql-test/t/slowlog_enospace-10508.test24
-rw-r--r--mysys/mf_iocache.c4
3 files changed, 86 insertions, 2 deletions
diff --git a/mysql-test/r/slowlog_enospace-10508.result b/mysql-test/r/slowlog_enospace-10508.result
new file mode 100644
index 00000000000..f39bfa2f00e
--- /dev/null
+++ b/mysql-test/r/slowlog_enospace-10508.result
@@ -0,0 +1,60 @@
+call mtr.add_suppression('Error writing file.*errno: 28 ');
+create table t1 (a int, b int) engine=memory;
+insert t1 select seq, seq+1 from seq_1_to_1000;
+set global general_log=0;
+set global log_queries_not_using_indexes=1;
+set debug_dbug='+d,simulate_file_write_error';
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+select * from t1 where a>10;
+set debug_dbug='';
+set global general_log=1;
+set global log_queries_not_using_indexes=default;
+drop table t1;
diff --git a/mysql-test/t/slowlog_enospace-10508.test b/mysql-test/t/slowlog_enospace-10508.test
new file mode 100644
index 00000000000..b2c26a5984d
--- /dev/null
+++ b/mysql-test/t/slowlog_enospace-10508.test
@@ -0,0 +1,24 @@
+#
+# MDEV-10508 Mariadb crash on out of disk space during dump import
+#
+--source include/have_sequence.inc
+--source include/have_debug.inc
+
+call mtr.add_suppression('Error writing file.*errno: 28 ');
+create table t1 (a int, b int) engine=memory;
+insert t1 select seq, seq+1 from seq_1_to_1000;
+set global general_log=0;
+set global log_queries_not_using_indexes=1;
+set debug_dbug='+d,simulate_file_write_error';
+--disable_result_log
+--let $run= 50
+while ($run)
+{
+ select * from t1 where a>10;
+ dec $run;
+}
+--enable_result_log
+set debug_dbug='';
+set global general_log=1;
+set global log_queries_not_using_indexes=default;
+drop table t1;
diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c
index daf99065eb0..4afe74da077 100644
--- a/mysys/mf_iocache.c
+++ b/mysys/mf_iocache.c
@@ -1825,8 +1825,6 @@ int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock)
if ((length=(size_t) (info->write_pos - info->write_buffer)))
{
- info->write_end= (info->write_buffer + info->buffer_length -
- ((info->pos_in_file + length) & (IO_SIZE - 1)));
if (append_cache)
{
@@ -1848,6 +1846,8 @@ int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock)
set_if_bigger(info->end_of_file, info->pos_in_file);
}
+ info->write_end= (info->write_buffer + info->buffer_length -
+ ((info->pos_in_file + length) & (IO_SIZE - 1)));
info->write_pos= info->write_buffer;
++info->disk_writes;
UNLOCK_APPEND_BUFFER;