diff options
author | unknown <heikki@donna.mysql.fi> | 2001-07-19 22:46:41 +0300 |
---|---|---|
committer | unknown <heikki@donna.mysql.fi> | 2001-07-19 22:46:41 +0300 |
commit | 1116aced39592ff1813d0fb0345dd8e177deef5f (patch) | |
tree | 371e412a14e8b6b61123eff561729e2b78f26d15 /innobase | |
parent | dece009c8b84f6ee60cf43e32931debc361b932c (diff) | |
download | mariadb-git-1116aced39592ff1813d0fb0345dd8e177deef5f.tar.gz |
srv0srv.h Support raw disk as a data file
srv0start.c Support raw disk as a data file
srv0srv.c Support raw disk as a data file
ha_innobase.cc Some error messages and support raw disk as a data file
sql/ha_innobase.cc:
Some error messages and support raw disk as a data file
innobase/srv/srv0srv.c:
Support raw disk as a data file
innobase/srv/srv0start.c:
Support raw disk as a data file
innobase/include/srv0srv.h:
Support raw disk as a data file
Diffstat (limited to 'innobase')
-rw-r--r-- | innobase/include/srv0srv.h | 16 | ||||
-rw-r--r-- | innobase/srv/srv0srv.c | 92 | ||||
-rw-r--r-- | innobase/srv/srv0start.c | 29 |
3 files changed, 131 insertions, 6 deletions
diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h index 26164e2ccdc..f80abda19c6 100644 --- a/innobase/include/srv0srv.h +++ b/innobase/include/srv0srv.h @@ -25,6 +25,7 @@ extern char* srv_arch_dir; extern ulint srv_n_data_files; extern char** srv_data_file_names; extern ulint* srv_data_file_sizes; +extern ulint* srv_data_file_is_raw_partition; extern char** srv_log_group_home_dirs; @@ -103,13 +104,26 @@ typedef struct srv_sys_struct srv_sys_t; /* The server system */ extern srv_sys_t* srv_sys; -/* Alternatives for fiel flush option in Unix; see the InnoDB manual about +/* Alternatives for file flush option in Unix; see the InnoDB manual about what these mean */ #define SRV_UNIX_FDATASYNC 1 #define SRV_UNIX_O_DSYNC 2 #define SRV_UNIX_LITTLESYNC 3 #define SRV_UNIX_NOSYNC 4 +/* Raw partition flags */ +#define SRV_OLD_RAW 1 +#define SRV_NEW_RAW 2 + +void +srv_mysql_thread_release(void); +/*==========================*/ +os_event_t +srv_mysql_thread_event_get(void); +void +srv_mysql_thread_slot_free( +/*==========================*/ + os_event_t event); /************************************************************************* Boots Innobase server. */ diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 186ed1b8d56..028fae010d5 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -64,6 +64,8 @@ ulint srv_n_data_files = 0; char** srv_data_file_names = NULL; ulint* srv_data_file_sizes = NULL; /* size in database pages */ +ulint* srv_data_file_is_raw_partition = NULL; + char** srv_log_group_home_dirs = NULL; ulint srv_n_log_groups = ULINT_MAX; @@ -1490,6 +1492,7 @@ srv_init(void) slot = srv_mysql_table + i; slot->in_use = FALSE; slot->event = os_event_create(NULL); + slot->suspended = FALSE; ut_a(slot->event); } @@ -1658,6 +1661,7 @@ srv_suspend_mysql_thread( slot->thr = thr; os_event_reset(event); + slot->suspended = TRUE; slot->suspend_time = ut_time(); @@ -1689,6 +1693,27 @@ srv_suspend_mysql_thread( return(FALSE); } +os_event_t +srv_mysql_thread_event_get(void) +{ + srv_slot_t* slot; + os_event_t event; + + mutex_enter(&kernel_mutex); + + slot = srv_table_reserve_slot_for_mysql(); + + event = slot->event; + + os_event_reset(event); + + slot->suspended = TRUE; + + mutex_exit(&kernel_mutex); + + return(event); +} + /************************************************************************ Releases a MySQL OS thread waiting for a lock to be released, if the thread is already suspended. */ @@ -1712,6 +1737,7 @@ srv_release_mysql_thread_if_suspended( /* Found */ os_event_set(slot->event); + slot->suspended = FALSE; return; } @@ -1720,6 +1746,59 @@ srv_release_mysql_thread_if_suspended( /* not found */ } +void +srv_mysql_thread_release(void) +/*==========================*/ +{ + srv_slot_t* slot; + ulint i; + + mutex_enter(&kernel_mutex); + + for (i = 0; i < OS_THREAD_MAX_N; i++) { + + slot = srv_mysql_table + i; + + if (slot->in_use && slot->suspended) { + /* Found */ + slot->suspended = FALSE; + mutex_exit(&kernel_mutex); + + os_event_set(slot->event); + + return; + } + } + + ut_a(0); +} + +void +srv_mysql_thread_slot_free( +/*==========================*/ + os_event_t event) +{ + srv_slot_t* slot; + ulint i; + + mutex_enter(&kernel_mutex); + + for (i = 0; i < OS_THREAD_MAX_N; i++) { + + slot = srv_mysql_table + i; + + if (slot->in_use && slot->event == event) { + /* Found */ + slot->in_use = FALSE; + mutex_exit(&kernel_mutex); + + return; + } + } + + ut_a(0); +} + /************************************************************************* A thread which wakes up threads whose lock wait may have lasted too long. */ @@ -1907,6 +1986,11 @@ loop: } background_loop: + /* + sync_array_print_info(sync_primary_wait_array); + os_aio_print(); + buf_print_io(); + */ /* In this loop we run background operations while the server is quiet */ @@ -1967,9 +2051,15 @@ background_loop: } /* mem_print_new_info(); + */ - fsp_print(0); +/* fsp_print(0); */ + +/* fprintf(stderr, "Validating tablespace\n"); + fsp_validate(0); + fprintf(stderr, "Validation ok\n"); */ + #ifdef UNIV_SEARCH_PERF_STAT /* btr_search_print_info(); */ #endif diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index 80fafa37adf..16997e44349 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -330,10 +330,28 @@ open_or_create_data_files( sprintf(name, "%s%s", srv_data_home, srv_data_file_names[i]); - files[i] = os_file_create(name, OS_FILE_CREATE, + if (srv_data_file_is_raw_partition[i] == 0) { + + files[i] = os_file_create(name, OS_FILE_CREATE, OS_FILE_NORMAL, &ret); + } else if (srv_data_file_is_raw_partition[i] == SRV_OLD_RAW) { + ret = FALSE; + } else if (srv_data_file_is_raw_partition[i] == SRV_NEW_RAW) { + + files[i] = os_file_create( + name, OS_FILE_OPEN, OS_FILE_NORMAL, &ret); + + if (!ret) { + fprintf(stderr, + "InnoDB: Error in opening %s\n", name); + + return(DB_ERROR); + } + } + if (ret == FALSE) { - if (os_file_get_last_error() != + if (srv_data_file_is_raw_partition[i] == 0 + && os_file_get_last_error() != OS_FILE_ALREADY_EXISTS) { fprintf(stderr, "InnoDB: Error in creating or opening %s\n", @@ -364,8 +382,10 @@ open_or_create_data_files( ret = os_file_get_size(files[i], &size, &size_high); ut_a(ret); - if (size != UNIV_PAGE_SIZE * srv_data_file_sizes[i] - || size_high != 0) { + if (srv_data_file_is_raw_partition[i] == 0 + && (size != UNIV_PAGE_SIZE * srv_data_file_sizes[i] + || size_high != 0)) { + fprintf(stderr, "InnoDB: Error: data file %s is of different size\n" "InnoDB: than specified in the .cnf file!\n", name); @@ -722,6 +742,7 @@ innobase_start_or_create_for_mysql(void) mutex_exit(&(log_sys->mutex)); } + mutex_create(&row_mysql_thread_mutex); sess_sys_init_at_db_start(); if (create_new_db) { |