Close share->data_file in before renaming in ha_tina::repair
Open and seek to end of data_file after rename Fix comment for when file does not need repair. Set share->mapped_file to NULL always when it's been unmapped Add test to see that file can be used after repair mysql-test/r/csv.result: Add more test to see that the table can be used after repair mysql-test/t/csv.test: Add more test to see that the table can be used after repair storage/csv/ha_tina.cc: Close share->data_file in before renaming in ha_tina::repair Open and seek to end after rename Fix comment for when file does not need repair. Set share->mapped_file to NULL always when it's been unmapped
This commit is contained in:
parent
e10f0d9b98
commit
79a2debe46
@ -5085,6 +5085,36 @@ Table Op Msg_type Msg_text
|
|||||||
test.test_repair_table5 repair status OK
|
test.test_repair_table5 repair status OK
|
||||||
SELECT * FROM test_repair_table5;
|
SELECT * FROM test_repair_table5;
|
||||||
num magic_no company_name founded
|
num magic_no company_name founded
|
||||||
|
INSERT INTO test_repair_table5 VALUES (1, 102, "CORRECT", 1876);
|
||||||
|
SELECT * FROM test_repair_table5;
|
||||||
|
num magic_no company_name founded
|
||||||
|
1 0102 CORRECT 1876
|
||||||
|
FLUSH TABLES;
|
||||||
|
CHECK TABLE test_repair_table5;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.test_repair_table5 check error Corrupt
|
||||||
|
REPAIR TABLE test_repair_table5;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.test_repair_table5 repair status OK
|
||||||
|
SELECT * FROM test_repair_table5;
|
||||||
|
num magic_no company_name founded
|
||||||
|
1 0102 CORRECT 1876
|
||||||
|
INSERT INTO test_repair_table5 VALUES (1, 102, "CORRECT2", 1876);
|
||||||
|
SELECT * FROM test_repair_table5;
|
||||||
|
num magic_no company_name founded
|
||||||
|
1 0102 CORRECT 1876
|
||||||
|
1 0102 CORRECT2 1876
|
||||||
|
FLUSH TABLES;
|
||||||
|
CHECK TABLE test_repair_table5;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.test_repair_table5 check error Corrupt
|
||||||
|
REPAIR TABLE test_repair_table5;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.test_repair_table5 repair status OK
|
||||||
|
SELECT * FROM test_repair_table5;
|
||||||
|
num magic_no company_name founded
|
||||||
|
1 0102 CORRECT 1876
|
||||||
|
1 0102 CORRECT2 1876
|
||||||
DROP TABLE test_repair_table5;
|
DROP TABLE test_repair_table5;
|
||||||
create table t1 (a int) engine=csv;
|
create table t1 (a int) engine=csv;
|
||||||
insert t1 values (1);
|
insert t1 values (1);
|
||||||
|
@ -1477,8 +1477,29 @@ CREATE TABLE test_repair_table5 (
|
|||||||
CHECK TABLE test_repair_table5;
|
CHECK TABLE test_repair_table5;
|
||||||
REPAIR TABLE test_repair_table5;
|
REPAIR TABLE test_repair_table5;
|
||||||
SELECT * FROM test_repair_table5;
|
SELECT * FROM test_repair_table5;
|
||||||
DROP TABLE test_repair_table5;
|
INSERT INTO test_repair_table5 VALUES (1, 102, "CORRECT", 1876);
|
||||||
|
SELECT * FROM test_repair_table5;
|
||||||
|
|
||||||
|
# Corrupt a table -- put a row with wrong # of columns at end of file
|
||||||
|
--exec perl -e 'print "\"1\",\"101\",\"IBM\"\n";' >> $MYSQLTEST_VARDIR/master-data/test/test_repair_table5.CSV
|
||||||
|
|
||||||
|
FLUSH TABLES;
|
||||||
|
CHECK TABLE test_repair_table5;
|
||||||
|
REPAIR TABLE test_repair_table5;
|
||||||
|
# The correct record inserted should still be in the file
|
||||||
|
SELECT * FROM test_repair_table5;
|
||||||
|
INSERT INTO test_repair_table5 VALUES (1, 102, "CORRECT2", 1876);
|
||||||
|
SELECT * FROM test_repair_table5;
|
||||||
|
|
||||||
|
# Corrupt table again -- put a row with wrong # of columns at end of file
|
||||||
|
--exec perl -e 'print "\"1\",\"101\",\"IBM\"\n";' >> $MYSQLTEST_VARDIR/master-data/test/test_repair_table5.CSV
|
||||||
|
|
||||||
|
FLUSH TABLES;
|
||||||
|
CHECK TABLE test_repair_table5;
|
||||||
|
REPAIR TABLE test_repair_table5;
|
||||||
|
# The two correct records inserted should still be in the file
|
||||||
|
SELECT * FROM test_repair_table5;
|
||||||
|
DROP TABLE test_repair_table5;
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#13406 - incorrect amount of "records deleted"
|
# BUG#13406 - incorrect amount of "records deleted"
|
||||||
|
@ -451,6 +451,7 @@ static int free_share(TINA_SHARE *share)
|
|||||||
result_code= 1;
|
result_code= 1;
|
||||||
if (share->mapped_file)
|
if (share->mapped_file)
|
||||||
my_munmap(share->mapped_file, share->file_stat.st_size);
|
my_munmap(share->mapped_file, share->file_stat.st_size);
|
||||||
|
share->mapped_file= NULL;
|
||||||
result_code= my_close(share->data_file,MYF(0));
|
result_code= my_close(share->data_file,MYF(0));
|
||||||
hash_delete(&tina_open_tables, (byte*) share);
|
hash_delete(&tina_open_tables, (byte*) share);
|
||||||
thr_lock_delete(&share->lock);
|
thr_lock_delete(&share->lock);
|
||||||
@ -1228,9 +1229,10 @@ int ha_tina::repair(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
|
|
||||||
my_free((char*)buf, MYF(0));
|
my_free((char*)buf, MYF(0));
|
||||||
|
|
||||||
/* The file is ok */
|
|
||||||
if (rc == HA_ERR_END_OF_FILE)
|
if (rc == HA_ERR_END_OF_FILE)
|
||||||
{
|
{
|
||||||
|
/* All rows were read ok until end of file, the file does not need repair. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If rows_recorded != rows_repaired, we should update
|
If rows_recorded != rows_repaired, we should update
|
||||||
rows_recorded value to the current amount of rows.
|
rows_recorded value to the current amount of rows.
|
||||||
@ -1258,11 +1260,29 @@ int ha_tina::repair(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
|
|
||||||
if (my_munmap(share->mapped_file, share->file_stat.st_size))
|
if (my_munmap(share->mapped_file, share->file_stat.st_size))
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
my_rename(repaired_fname, share->data_file_name, MYF(0));
|
|
||||||
|
|
||||||
/* We set it to null so that get_mmap() won't try to unmap it */
|
/* We set it to null so that get_mmap() won't try to unmap it */
|
||||||
share->mapped_file= NULL;
|
share->mapped_file= NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Close the "to"-file before renaming
|
||||||
|
On Windows one cannot rename a file, which descriptor
|
||||||
|
is still open. EACCES will be returned when trying to delete
|
||||||
|
the "to"-file in my_rename()
|
||||||
|
*/
|
||||||
|
my_close(share->data_file,MYF(0));
|
||||||
|
|
||||||
|
if (my_rename(repaired_fname, share->data_file_name, MYF(0)))
|
||||||
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
|
/* Open the file again, it should now be repaired */
|
||||||
|
if ((share->data_file= my_open(share->data_file_name, O_RDWR|O_APPEND,
|
||||||
|
MYF(0))) == -1)
|
||||||
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
|
/* Seek to end of file, any inserts will be appended there */
|
||||||
|
if (my_seek(share->data_file, 0, SEEK_END, MYF(0)) == MY_FILEPOS_ERROR)
|
||||||
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
if (get_mmap(share, 0) > 0)
|
if (get_mmap(share, 0) > 0)
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user