summaryrefslogtreecommitdiff
path: root/innobase
diff options
context:
space:
mode:
authorunknown <jan@hundin.mysql.fi>2005-01-24 09:55:41 +0200
committerunknown <jan@hundin.mysql.fi>2005-01-24 09:55:41 +0200
commit8caa165f86b23fcc1b1a6fdf9cf2ad07c950d260 (patch)
treeb5e0462ed5e5f1bee1abaca8fbcd174f0df36a3b /innobase
parentd49bae51fe9eefa412d4b35d8bee944bb829924d (diff)
parent8023f38a8f3c94cd3f028250980498f920b0af34 (diff)
downloadmariadb-git-8caa165f86b23fcc1b1a6fdf9cf2ad07c950d260.tar.gz
Merge jlindstrom@bk-internal.mysql.com:/home/bk/mysql-4.1
into hundin.mysql.fi:/home/jan/mysql-4.1
Diffstat (limited to 'innobase')
-rw-r--r--innobase/dict/dict0crea.c11
-rw-r--r--innobase/dict/dict0dict.c8
-rw-r--r--innobase/dict/dict0load.c17
-rw-r--r--innobase/fil/fil0fil.c77
4 files changed, 87 insertions, 26 deletions
diff --git a/innobase/dict/dict0crea.c b/innobase/dict/dict0crea.c
index cbdc0aab53c..d9e89316613 100644
--- a/innobase/dict/dict0crea.c
+++ b/innobase/dict/dict0crea.c
@@ -81,6 +81,17 @@ dict_create_sys_tables_tuple(
dfield_set_data(dfield, ptr, 8);
/* 7: MIX_LEN --------------------------*/
+
+ /* Track corruption reported on mailing list Jan 14, 2005 */
+ if (table->mix_len != 0 && table->mix_len != 0x80000000) {
+ fprintf(stderr,
+"InnoDB: Error: mix_len is %lu in table %s\n", (ulong)table->mix_len,
+ table->name);
+ mem_analyze_corruption((byte*)&(table->mix_len));
+
+ ut_error;
+ }
+
dfield = dtuple_get_nth_field(entry, 5);
ptr = mem_heap_alloc(heap, 4);
diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c
index 2e6504cac11..186f3be2f31 100644
--- a/innobase/dict/dict0dict.c
+++ b/innobase/dict/dict0dict.c
@@ -2895,9 +2895,9 @@ loop:
constraint_name = NULL;
if (ptr1 < ptr2) {
- /* The user has specified a constraint name. Pick it so
+ /* The user may have specified a constraint name. Pick it so
that we can store 'databasename/constraintname' as the id of
- the id of the constraint to system tables. */
+ of the constraint to system tables. */
ptr = ptr1;
ptr = dict_accept(ptr, "CONSTRAINT", &success);
@@ -2934,6 +2934,10 @@ loop:
ptr = dict_accept(ptr, "FOREIGN", &success);
+ if (!success) {
+ goto loop;
+ }
+
if (!isspace(*ptr)) {
goto loop;
}
diff --git a/innobase/dict/dict0load.c b/innobase/dict/dict0load.c
index 61facc8818d..717c64c3963 100644
--- a/innobase/dict/dict0load.c
+++ b/innobase/dict/dict0load.c
@@ -729,6 +729,7 @@ dict_load_table(
ulint space;
ulint n_cols;
ulint err;
+ ulint mix_len;
mtr_t mtr;
#ifdef UNIV_SYNC_DEBUG
@@ -775,6 +776,22 @@ dict_load_table(
return(NULL);
}
+ /* Track a corruption bug reported on the MySQL mailing list Jan 14,
+ 2005: mix_len had a value different from 0 */
+
+ field = rec_get_nth_field(rec, 7, &len);
+ ut_a(len == 4);
+
+ mix_len = mach_read_from_4(field);
+
+ if (mix_len != 0 && mix_len != 0x80000000) {
+ ut_print_timestamp(stderr);
+
+ fprintf(stderr,
+ " InnoDB: table %s has a nonsensical mix len %lu\n",
+ name, (ulong)mix_len);
+ }
+
#if MYSQL_VERSION_ID < 50300
/* Starting from MySQL 5.0.3, the high-order bit of MIX_LEN is the
"compact format" flag. */
diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c
index d1a083fcd66..5f71c00aea6 100644
--- a/innobase/fil/fil0fil.c
+++ b/innobase/fil/fil0fil.c
@@ -477,28 +477,33 @@ fil_node_open_file(
ut_a(node->n_pending == 0);
ut_a(node->open == FALSE);
- /* printf("Opening file %s\n", node->name); */
+ if (node->size == 0) {
+ /* It must be a single-table tablespace and we do not know the
+ size of the file yet. First we open the file in the normal
+ mode, no async I/O here, for simplicity. Then do some checks,
+ and close the file again.
+ NOTE that we could not use the simple file read function
+ os_file_read() in Windows to read from a file opened for
+ async I/O! */
+
+ node->handle = os_file_create_simple_no_error_handling(
+ node->name, OS_FILE_OPEN,
+ OS_FILE_READ_ONLY, &success);
+ if (!success) {
+ /* The following call prints an error message */
+ os_file_get_last_error(TRUE);
- if (space->purpose == FIL_LOG) {
- node->handle = os_file_create(node->name, OS_FILE_OPEN,
- OS_FILE_AIO, OS_LOG_FILE, &ret);
- } else if (node->is_raw_disk) {
- node->handle = os_file_create(node->name,
- OS_FILE_OPEN_RAW,
- OS_FILE_AIO, OS_DATA_FILE, &ret);
- } else {
- node->handle = os_file_create(node->name, OS_FILE_OPEN,
- OS_FILE_AIO, OS_DATA_FILE, &ret);
- }
-
- ut_a(ret);
-
- node->open = TRUE;
+ ut_print_timestamp(stderr);
- system->n_open++;
+ fprintf(stderr,
+" InnoDB: Fatal error: cannot open %s\n."
+"InnoDB: Have you deleted .ibd files under a running mysqld server?\n",
+ node->name);
+ ut_a(0);
+ }
- if (node->size == 0) {
ut_a(space->purpose != FIL_LOG);
+ ut_a(space->id != 0);
os_file_get_size(node->handle, &size_low, &size_high);
@@ -508,11 +513,6 @@ fil_node_open_file(
node->size = (ulint) (size_bytes / UNIV_PAGE_SIZE);
#else
- /* It must be a single-table tablespace and we do not know the
- size of the file yet */
-
- ut_a(space->id != 0);
-
if (size_bytes < FIL_IBD_FILE_INITIAL_SIZE * UNIV_PAGE_SIZE) {
fprintf(stderr,
"InnoDB: Error: the size of single-table tablespace file %s\n"
@@ -536,6 +536,10 @@ fil_node_open_file(
ut_free(buf2);
+ /* Close the file now that we have read the space id from it */
+
+ os_file_close(node->handle);
+
if (space_id == ULINT_UNDEFINED || space_id == 0) {
fprintf(stderr,
"InnoDB: Error: tablespace id %lu in file %s is not sensible\n",
@@ -563,6 +567,30 @@ fil_node_open_file(
space->size += node->size;
}
+ /* printf("Opening file %s\n", node->name); */
+
+ /* Open the file for reading and writing, in Windows normally in the
+ unbuffered async I/O mode, though global variables may make
+ os_file_create() to fall back to the normal file I/O mode. */
+
+ if (space->purpose == FIL_LOG) {
+ node->handle = os_file_create(node->name, OS_FILE_OPEN,
+ OS_FILE_AIO, OS_LOG_FILE, &ret);
+ } else if (node->is_raw_disk) {
+ node->handle = os_file_create(node->name,
+ OS_FILE_OPEN_RAW,
+ OS_FILE_AIO, OS_DATA_FILE, &ret);
+ } else {
+ node->handle = os_file_create(node->name, OS_FILE_OPEN,
+ OS_FILE_AIO, OS_DATA_FILE, &ret);
+ }
+
+ ut_a(ret);
+
+ node->open = TRUE;
+
+ system->n_open++;
+
if (space->purpose == FIL_TABLESPACE && space->id != 0) {
/* Put the node to the LRU list */
UT_LIST_ADD_FIRST(LRU, system->LRU, node);
@@ -4111,7 +4139,8 @@ fil_flush_file_spaces(
space = UT_LIST_GET_FIRST(system->space_list);
while (space) {
- if (space->purpose == purpose) {
+ if (space->purpose == purpose && !space->is_being_deleted) {
+
space->n_pending_flushes++; /* prevent dropping of the
space while we are
flushing */