Commit 6eecb8e4 authored by unknown's avatar unknown
Browse files

fil0fil.c:

  Fix bug #8021 :Windows error number 87 with multiple tablespaces after mysqld restart; still has to be tested on Windows that this now works


innobase/fil/fil0fil.c:
  Fix bug #8021 :Windows error number 87 with multiple tablespaces after mysqld restart; still has to be tested on Windows that this now works
parent 5e98f462
Loading
Loading
Loading
Loading
+51 −23
Original line number Diff line number Diff line
@@ -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 (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);
	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);

	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);