1
1
/*****************************************************************************
3
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
4
Copyright (c) 2008, Google Inc.
3
Copyright (C) 1996, 2010, Innobase Oy. All Rights Reserved.
4
Copyright (C) 2008, Google Inc.
5
Copyright (C) 2009, Percona Inc.
6
7
Portions of this file contain modifications contributed and copyrighted by
7
8
Google, Inc. Those modifications are gratefully acknowledged and are described
9
10
incorporated with their permission, and subject to the conditions contained in
10
11
the file COPYING.Google.
13
Portions of this file contain modifications contributed and copyrighted
14
by Percona Inc.. Those modifications are
15
gratefully acknowledged and are described briefly in the InnoDB
16
documentation. The contributions by Percona Inc. are incorporated with
17
their permission, and subject to the conditions contained in the file
12
20
This program is free software; you can redistribute it and/or modify it under
13
21
the terms of the GNU General Public License as published by the Free Software
14
22
Foundation; version 2 of the License.
18
26
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
20
28
You should have received a copy of the GNU General Public License along with
21
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22
Place, Suite 330, Boston, MA 02111-1307 USA
29
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
30
St, Fifth Floor, Boston, MA 02110-1301 USA
24
32
*****************************************************************************/
25
/***********************************************************************
27
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
28
Copyright (c) 2009, Percona Inc.
30
Portions of this file contain modifications contributed and copyrighted
31
by Percona Inc.. Those modifications are
32
gratefully acknowledged and are described briefly in the InnoDB
33
documentation. The contributions by Percona Inc. are incorporated with
34
their permission, and subject to the conditions contained in the file
37
This program is free software; you can redistribute it and/or modify it
38
under the terms of the GNU General Public License as published by the
39
Free Software Foundation; version 2 of the License.
41
This program is distributed in the hope that it will be useful, but
42
WITHOUT ANY WARRANTY; without even the implied warranty of
43
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
44
Public License for more details.
46
You should have received a copy of the GNU General Public License along
47
with this program; if not, write to the Free Software Foundation, Inc.,
48
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
50
***********************************************************************/
52
34
/********************************************************************//**
53
35
@file srv/srv0start.c
138
126
/** Files comprising the system tablespace */
139
127
static os_file_t files[1000];
141
/** Mutex protecting the ios count */
142
static mutex_t ios_mutex;
143
/** Count of I/O operations in io_handler_thread() */
146
129
/** io_handler_thread parameters for thread identification */
147
static ulint n[SRV_MAX_N_IO_THREADS + 5];
130
static ulint n[SRV_MAX_N_IO_THREADS + 6];
148
131
/** io_handler_thread identifiers */
149
static os_thread_id_t thread_ids[SRV_MAX_N_IO_THREADS + 5];
132
static os_thread_id_t thread_ids[SRV_MAX_N_IO_THREADS + 6];
151
134
/** We use this mutex to test the return value of pthread_mutex_trylock
152
135
on successful locking. HP-UX does NOT return 0, though Linux et al do. */
160
143
#define SRV_N_PENDING_IOS_PER_THREAD OS_AIO_N_PENDING_IOS_PER_THREAD
161
144
#define SRV_MAX_N_PENDING_SYNC_IOS 100
146
#ifdef UNIV_PFS_THREAD
147
/* Keys to register InnoDB threads with performance schema */
148
UNIV_INTERN mysql_pfs_key_t io_handler_thread_key;
149
UNIV_INTERN mysql_pfs_key_t srv_lock_timeout_thread_key;
150
UNIV_INTERN mysql_pfs_key_t srv_error_monitor_thread_key;
151
UNIV_INTERN mysql_pfs_key_t srv_monitor_thread_key;
152
UNIV_INTERN mysql_pfs_key_t srv_master_thread_key;
153
#endif /* UNIV_PFS_THREAD */
164
155
/*********************************************************************//**
165
156
Convert a numeric string that optionally ends in G or M, to a number
294
srv_data_file_names = malloc(i * sizeof *srv_data_file_names);
295
srv_data_file_sizes = malloc(i * sizeof *srv_data_file_sizes);
296
srv_data_file_is_raw_partition = malloc(
297
i * sizeof *srv_data_file_is_raw_partition);
285
srv_data_file_names = static_cast<char **>(malloc(i * sizeof *srv_data_file_names));
286
srv_data_file_sizes = static_cast<ulint *>(malloc(i * sizeof *srv_data_file_sizes));
287
srv_data_file_is_raw_partition = static_cast<ulint *>(malloc(
288
i * sizeof *srv_data_file_is_raw_partition));
299
290
srv_n_data_files = i;
489
483
fprintf(stderr, "Io handler thread %lu starts, id %lu\n", segment,
490
484
os_thread_pf(os_thread_get_curr_id()));
487
#ifdef UNIV_PFS_THREAD
488
pfs_register_thread(io_handler_thread_key);
489
#endif /* UNIV_PFS_THREAD */
491
while (srv_shutdown_state != SRV_SHUTDOWN_EXIT_THREADS) {
493
492
fil_aio_wait(segment);
495
mutex_enter(&ios_mutex);
497
mutex_exit(&ios_mutex);
500
495
/* We count the number of threads in os_thread_exit(). A created
501
496
thread should always use that to exit and not use return() to exit.
502
497
The thread actually never comes here because it is exited in an
503
498
os_event_wait(). */
504
#if (!defined(__SUNPRO_C) && !defined(__SUNPRO_CC))
508
501
#endif /* !UNIV_HOTBACKUP */
535
/*********************************************************************//**
536
Adds a slash or a backslash to the end of a string if it is missing
537
and the string is not empty.
538
@return string which has the separator if the string is not empty */
541
srv_add_path_separator_if_needed(
542
/*=============================*/
543
char* str) /*!< in: null-terminated character string */
546
ulint len = ut_strlen(str);
548
if (len == 0 || str[len - 1] == SRV_PATH_SEPARATOR) {
553
out_str = ut_malloc(len + 2);
554
memcpy(out_str, str, len);
555
out_str[len] = SRV_PATH_SEPARATOR;
556
out_str[len + 1] = 0;
561
528
#ifndef UNIV_HOTBACKUP
562
529
/*********************************************************************//**
563
530
Calculates the low 32 bits when a file size which is given as a number
608
575
char name[10000];
610
578
UT_NOT_USED(create_new_db);
612
580
*log_file_created = FALSE;
614
582
srv_normalize_path_for_win(srv_log_group_home_dirs[k]);
615
srv_log_group_home_dirs[k] = srv_add_path_separator_if_needed(
616
srv_log_group_home_dirs[k]);
618
ut_a(strlen(srv_log_group_home_dirs[k])
619
< (sizeof name) - 10 - sizeof "ib_logfile");
620
sprintf(name, "%s%s%lu", srv_log_group_home_dirs[k],
621
"ib_logfile", (ulong) i);
623
files[i] = os_file_create(name, OS_FILE_CREATE, OS_FILE_NORMAL,
584
dirnamelen = strlen(srv_log_group_home_dirs[k]);
585
ut_a(dirnamelen < (sizeof name) - 10 - sizeof "ib_logfile");
586
memcpy(name, srv_log_group_home_dirs[k], dirnamelen);
588
/* Add a path separator if needed. */
589
if (dirnamelen && name[dirnamelen - 1] != SRV_PATH_SEPARATOR) {
590
name[dirnamelen++] = SRV_PATH_SEPARATOR;
593
sprintf(name + dirnamelen, "%s%lu", "ib_logfile", (ulong) i);
595
files[i] = os_file_create(innodb_file_log_key, name,
596
OS_FILE_CREATE, OS_FILE_NORMAL,
624
597
OS_LOG_FILE, &ret);
625
598
if (ret == FALSE) {
626
599
if (os_file_get_last_error(FALSE) != OS_FILE_ALREADY_EXISTS
631
604
&& os_file_get_last_error(FALSE) != 100
635
"InnoDB: Error in creating"
636
" or opening %s\n", name);
607
drizzled::errmsg_printf(drizzled::error::ERROR,
608
"InnoDB: Error in creating or opening %s", name);
641
files[i] = os_file_create(name, OS_FILE_OPEN, OS_FILE_AIO,
613
files[i] = os_file_create(innodb_file_log_key, name,
614
OS_FILE_OPEN, OS_FILE_AIO,
642
615
OS_LOG_FILE, &ret);
645
"InnoDB: Error in opening %s\n", name);
617
drizzled::errmsg_printf(drizzled::error::ERROR,
618
"InnoDB: Error in opening %s.", name);
647
620
return(DB_ERROR);
653
626
if (size != srv_calc_low32(srv_log_file_size)
654
627
|| size_high != srv_calc_high32(srv_log_file_size)) {
657
"InnoDB: Error: log file %s is"
658
" of different size %lu %lu bytes\n"
659
"InnoDB: than specified in the .cnf"
660
" file %lu %lu bytes!\n",
661
name, (ulong) size_high, (ulong) size,
662
(ulong) srv_calc_high32(srv_log_file_size),
663
(ulong) srv_calc_low32(srv_log_file_size));
629
drizzled::errmsg_printf(drizzled::error::ERROR,
630
"InnoDB: Error: log file %s is of different size %lu %lu bytes than specified in the .cnf"
631
" file %lu %lu bytes!",
632
name, (ulong) size_high, (ulong) size,
633
(ulong) srv_calc_high32(srv_log_file_size),
634
(ulong) srv_calc_low32(srv_log_file_size));
665
636
return(DB_ERROR);
668
639
*log_file_created = TRUE;
670
ut_print_timestamp(stderr);
673
" InnoDB: Log file %s did not exist:"
674
" new to be created\n",
641
drizzled::errmsg_printf(drizzled::error::INFO,
642
"InnoDB: Log file %s did not exist: new to be created",
676
644
if (log_file_has_been_opened) {
678
646
return(DB_ERROR);
681
fprintf(stderr, "InnoDB: Setting log file %s size to %lu MB\n",
682
name, (ulong) srv_log_file_size
683
>> (20 - UNIV_PAGE_SIZE_SHIFT));
649
drizzled::errmsg_printf(drizzled::error::INFO,
650
"InnoDB: Setting log file %s size to %lu MB",
651
name, (ulong) srv_log_file_size
652
>> (20 - UNIV_PAGE_SIZE_SHIFT));
686
"InnoDB: Database physically writes the file"
654
drizzled::errmsg_printf(drizzled::error::INFO,
655
"InnoDB: Database physically writes the file full: wait...\n");
689
657
ret = os_file_set_size(name, files[i],
690
658
srv_calc_low32(srv_log_file_size),
691
659
srv_calc_high32(srv_log_file_size));
694
"InnoDB: Error in creating %s:"
695
" probably out of disk space\n",
661
drizzled::errmsg_printf(drizzled::error::ERROR,
662
"InnoDB: Error in creating %s: probably out of disk space",
698
665
return(DB_ERROR);
770
737
char name[10000];
772
739
if (srv_n_data_files >= 1000) {
773
fprintf(stderr, "InnoDB: can only have < 1000 data files\n"
774
"InnoDB: you have defined %lu\n",
775
(ulong) srv_n_data_files);
740
drizzled::errmsg_printf(drizzled::error::ERROR,
741
"InnoDB: can only have < 1000 data files you have defined %lu",
742
(ulong) srv_n_data_files);
776
743
return(DB_ERROR);
781
748
*create_new_db = FALSE;
783
750
srv_normalize_path_for_win(srv_data_home);
784
srv_data_home = srv_add_path_separator_if_needed(srv_data_home);
786
752
for (i = 0; i < srv_n_data_files; i++) {
787
755
srv_normalize_path_for_win(srv_data_file_names[i]);
756
dirnamelen = strlen(srv_data_home);
789
ut_a(strlen(srv_data_home) + strlen(srv_data_file_names[i])
758
ut_a(dirnamelen + strlen(srv_data_file_names[i])
790
759
< (sizeof name) - 1);
791
sprintf(name, "%s%s", srv_data_home, srv_data_file_names[i]);
760
memcpy(name, srv_data_home, dirnamelen);
761
/* Add a path separator if needed. */
762
if (dirnamelen && name[dirnamelen - 1] != SRV_PATH_SEPARATOR) {
763
name[dirnamelen++] = SRV_PATH_SEPARATOR;
766
strcpy(name + dirnamelen, srv_data_file_names[i]);
793
768
if (srv_data_file_is_raw_partition[i] == 0) {
795
770
/* First we try to create the file: if it already
796
771
exists, ret will get value FALSE */
798
files[i] = os_file_create(name, OS_FILE_CREATE,
773
files[i] = os_file_create(innodb_file_data_key,
774
name, OS_FILE_CREATE,
800
776
OS_DATA_FILE, &ret);
822
797
srv_start_raw_disk_in_use = TRUE;
823
798
srv_created_new_raw = TRUE;
825
files[i] = os_file_create(name, OS_FILE_OPEN_RAW,
800
files[i] = os_file_create(innodb_file_data_key,
801
name, OS_FILE_OPEN_RAW,
827
803
OS_DATA_FILE, &ret);
830
"InnoDB: Error in opening %s\n", name);
805
drizzled::errmsg_printf(drizzled::error::ERROR,
806
"InnoDB: Error in opening %s", name);
832
808
return(DB_ERROR);
843
819
/* We open the data file */
845
821
if (one_created) {
847
"InnoDB: Error: data files can only"
848
" be added at the end\n");
850
"InnoDB: of a tablespace, but"
851
" data file %s existed beforehand.\n",
822
drizzled::errmsg_printf(drizzled::error::ERROR,
823
"InnoDB: Error: data files can only be added at the end of a tablespace, but"
824
" data file %s existed beforehand.",
853
826
return(DB_ERROR);
856
829
if (srv_data_file_is_raw_partition[i] == SRV_OLD_RAW) {
857
830
files[i] = os_file_create(
831
innodb_file_data_key,
858
832
name, OS_FILE_OPEN_RAW,
859
833
OS_FILE_NORMAL, OS_DATA_FILE, &ret);
860
834
} else if (i == 0) {
861
835
files[i] = os_file_create(
836
innodb_file_data_key,
862
837
name, OS_FILE_OPEN_RETRY,
863
838
OS_FILE_NORMAL, OS_DATA_FILE, &ret);
865
840
files[i] = os_file_create(
841
innodb_file_data_key,
866
842
name, OS_FILE_OPEN, OS_FILE_NORMAL,
867
843
OS_DATA_FILE, &ret);
872
"InnoDB: Error in opening %s\n", name);
847
drizzled::errmsg_printf(drizzled::error::ERROR,
848
"InnoDB: Error in opening %s", name);
873
849
os_file_get_last_error(TRUE);
875
851
return(DB_ERROR);
896
872
&& srv_last_file_size_max
897
873
< rounded_size_pages)) {
900
"InnoDB: Error: auto-extending"
902
" of a different size\n"
903
"InnoDB: %lu pages (rounded"
904
" down to MB) than specified"
905
" in the .cnf file:\n"
906
"InnoDB: initial %lu pages,"
907
" max %lu (relevant if"
908
" non-zero) pages!\n",
910
(ulong) rounded_size_pages,
911
(ulong) srv_data_file_sizes[i],
913
srv_last_file_size_max);
875
drizzled::errmsg_printf(drizzled::error::ERROR,
876
"InnoDB: Error: auto-extending data file %s is of a different size. "
877
"%lu pages (rounded down to MB) than specified in the .cnf file: "
878
"initial %lu pages, max %lu (relevant if non-zero) pages!",
880
(ulong) rounded_size_pages,
881
(ulong) srv_data_file_sizes[i],
883
srv_last_file_size_max);
915
885
return(DB_ERROR);
921
891
if (rounded_size_pages != srv_data_file_sizes[i]) {
924
"InnoDB: Error: data file %s"
925
" is of a different size\n"
927
" (rounded down to MB)\n"
928
"InnoDB: than specified"
929
" in the .cnf file %lu pages!\n",
893
drizzled::errmsg_printf(drizzled::error::ERROR,
894
"InnoDB: Error: data file %s is of a different size. "
895
"%lu pages (rounded down to MB). "
896
"Than specified in the .cnf file %lu pages!",
931
898
(ulong) rounded_size_pages,
932
899
(ulong) srv_data_file_sizes[i]);
948
915
one_created = TRUE;
951
ut_print_timestamp(stderr);
953
" InnoDB: Data file %s did not"
954
" exist: new to be created\n",
918
drizzled::errmsg_printf(drizzled::error::INFO,
919
" InnoDB: Data file %s did not exist: new to be created",
958
"InnoDB: The first specified"
959
" data file %s did not exist:\n"
960
"InnoDB: a new database"
961
" to be created!\n", name);
922
drizzled::errmsg_printf(drizzled::error::INFO,
923
"InnoDB: The first specified data file %s did not exist. A new database to be created!", name);
962
924
*create_new_db = TRUE;
965
ut_print_timestamp(stderr);
967
" InnoDB: Setting file %s size to %lu MB\n",
969
(ulong) (srv_data_file_sizes[i]
970
>> (20 - UNIV_PAGE_SIZE_SHIFT)));
927
drizzled::errmsg_printf(drizzled::error::INFO,
928
" InnoDB: Setting file %s size to %lu MB",
929
name, (ulong) (srv_data_file_sizes[i]
930
>> (20 - UNIV_PAGE_SIZE_SHIFT)));
973
"InnoDB: Database physically writes the"
974
" file full: wait...\n");
932
drizzled::errmsg_printf(drizzled::error::INFO,
933
"InnoDB: Database physically writes the file full: wait...");
976
935
ret = os_file_set_size(
1050
1003
on Mac OS X 10.3 or later. */
1051
1004
struct utsname utsname;
1052
1005
if (uname(&utsname)) {
1053
fputs("InnoDB: cannot determine Mac OS X version!\n", stderr);
1006
fputs(_("InnoDB: cannot determine Mac OS X version!\n"), stderr);
1055
1008
srv_have_fullfsync = strcmp(utsname.release, "7.") >= 0;
1057
1010
if (!srv_have_fullfsync) {
1058
fputs("InnoDB: On Mac OS X, fsync() may be"
1059
" broken on internal drives,\n"
1060
"InnoDB: making transactions unsafe!\n", stderr);
1011
fputs(_("InnoDB: On Mac OS X, fsync() may be"
1012
" broken on internal drives,\n"
1013
"InnoDB: making transactions unsafe!\n"), stderr);
1062
1015
# endif /* F_FULLFSYNC */
1063
1016
#endif /* HAVE_DARWIN_THREADS */
1065
1018
if (sizeof(ulint) != sizeof(void*)) {
1067
"InnoDB: Error: size of InnoDB's ulint is %lu,"
1068
" but size of void* is %lu.\n"
1069
"InnoDB: The sizes should be the same"
1070
" so that on a 64-bit platform you can\n"
1071
"InnoDB: allocate more than 4 GB of memory.",
1019
drizzled::errmsg_printf(drizzled::error::WARN,
1020
_("InnoDB: Error: size of InnoDB's ulint is %lu, but size of void* is %lu. "
1021
"The sizes should be the same so that on a 64-bit platform you can. Allocate more than 4 GB of memory."),
1072
1022
(ulong)sizeof(ulint), (ulong)sizeof(void*));
1078
1028
innodb_file_per_table) until this function has returned. */
1079
1029
srv_file_per_table = FALSE;
1080
1030
#ifdef UNIV_DEBUG
1082
"InnoDB: !!!!!!!! UNIV_DEBUG switched on !!!!!!!!!\n");
1031
drizzled::errmsg_printf(drizzled::error::INFO,
1032
_("InnoDB: !!!!!!!! UNIV_DEBUG switched on !!!!!!!!!\n"));
1085
1035
#ifdef UNIV_IBUF_DEBUG
1087
"InnoDB: !!!!!!!! UNIV_IBUF_DEBUG switched on !!!!!!!!!\n"
1088
"InnoDB: Crash recovery will fail with UNIV_IBUF_DEBUG\n");
1036
drizzled::errmsg_printf(drizzled::error::INFO,
1037
_("InnoDB: !!!!!!!! UNIV_IBUF_DEBUG switched on !!!!!!!!!\n"
1038
# ifdef UNIV_IBUF_COUNT_DEBUG
1039
"InnoDB: !!!!!!!! UNIV_IBUF_COUNT_DEBUG switched on !!!!!!!!!\n"
1040
"InnoDB: Crash recovery will fail with UNIV_IBUF_COUNT_DEBUG\n"
1091
1045
#ifdef UNIV_SYNC_DEBUG
1093
"InnoDB: !!!!!!!! UNIV_SYNC_DEBUG switched on !!!!!!!!!\n");
1046
drizzled::errmsg_printf(drizzled::error::INFO,
1047
_("InnoDB: !!!!!!!! UNIV_SYNC_DEBUG switched on !!!!!!!!!\n"));
1096
1050
#ifdef UNIV_SEARCH_DEBUG
1098
"InnoDB: !!!!!!!! UNIV_SEARCH_DEBUG switched on !!!!!!!!!\n");
1051
drizzled::errmsg_printf(drizzled::error::INFO,
1052
_("InnoDB: !!!!!!!! UNIV_SEARCH_DEBUG switched on !!!!!!!!!\n"));
1055
#ifdef UNIV_LOG_LSN_DEBUG
1056
drizzled::errmsg_printf(drizzled::error::INFO,
1057
_("InnoDB: !!!!!!!! UNIV_LOG_LSN_DEBUG switched on !!!!!!!!!\n"));
1058
#endif /* UNIV_LOG_LSN_DEBUG */
1101
1059
#ifdef UNIV_MEM_DEBUG
1103
"InnoDB: !!!!!!!! UNIV_MEM_DEBUG switched on !!!!!!!!!\n");
1060
drizzled::errmsg_printf(drizzled::error::INFO,
1061
_("InnoDB: !!!!!!!! UNIV_MEM_DEBUG switched on !!!!!!!!!\n"));
1106
if (UNIV_LIKELY(srv_use_sys_malloc)) {
1108
"InnoDB: The InnoDB memory heap is disabled\n");
1064
if (UNIV_LIKELY(srv_use_sys_malloc))
1066
drizzled::errmsg_printf(drizzled::error::ERROR, _("InnoDB: The InnoDB memory heap is disabled\n"));
1111
#ifdef HAVE_GCC_ATOMIC_BUILTINS
1112
# ifdef INNODB_RW_LOCKS_USE_ATOMICS
1114
"InnoDB: Mutexes and rw_locks use GCC atomic builtins.\n");
1115
# else /* INNODB_RW_LOCKS_USE_ATOMICS */
1117
"InnoDB: Mutexes use GCC atomic builtins, rw_locks do not.\n");
1118
# endif /* INNODB_RW_LOCKS_USE_ATOMICS */
1119
#elif defined(HAVE_SOLARIS_ATOMICS)
1120
# ifdef INNODB_RW_LOCKS_USE_ATOMICS
1122
"InnoDB: Mutexes and rw_locks use Solaris atomic functions.\n");
1125
"InnoDB: Mutexes use Solaris atomic functions.\n");
1126
# endif /* INNODB_RW_LOCKS_USE_ATOMICS */
1127
#elif defined(HAVE_WINDOWS_ATOMICS)
1128
# ifdef INNODB_RW_LOCKS_USE_ATOMICS
1130
"InnoDB: Mutexes and rw_locks use Windows interlocked functions.\n");
1133
"InnoDB: Mutexes use Windows interlocked functions.\n");
1134
# endif /* INNODB_RW_LOCKS_USE_ATOMICS */
1135
#else /* HAVE_GCC_ATOMIC_BUILTINS */
1137
"InnoDB: Neither mutexes nor rw_locks use GCC atomic builtins.\n");
1138
#endif /* HAVE_GCC_ATOMIC_BUILTINS */
1069
fputs("InnoDB: " IB_ATOMICS_STARTUP_MSG
1070
"\nInnoDB: Compressed tables use zlib " ZLIB_VERSION
1071
#ifdef UNIV_ZIP_DEBUG
1073
#endif /* UNIV_ZIP_DEBUG */
1074
#ifdef UNIV_ZIP_COPY
1075
" and extra copying"
1076
#endif /* UNIV_ZIP_COPY */
1140
1080
/* Since InnoDB does not currently clean up all its internal data
1141
1081
structures in MySQL Embedded Server Library server_end(), we
1143
1083
second time during the process lifetime. */
1145
1085
if (srv_start_has_been_called) {
1147
"InnoDB: Error:startup called second time"
1148
" during the process lifetime.\n"
1149
"InnoDB: In the MySQL Embedded Server Library"
1150
" you cannot call server_init()\n"
1151
"InnoDB: more than once during"
1152
" the process lifetime.\n");
1086
drizzled::errmsg_printf(drizzled::error::ERROR,
1087
"InnoDB: Error: startup called second time during the process lifetime.\n");
1155
1090
srv_start_has_been_called = TRUE;
1173
1107
but when run in conjunction with InnoDB Hot Backup, it seemed
1174
1108
to corrupt the data files. */
1176
os_aio_use_native_aio = FALSE;
1110
srv_use_native_aio = FALSE;
1115
/* On 2000 and XP, async IO is available. */
1116
srv_use_native_aio = TRUE;
1179
/* On Win 2000 and XP use async i/o */
1180
os_aio_use_native_aio = TRUE;
1120
/* Vista and later have both async IO and condition variables */
1121
srv_use_native_aio = TRUE;
1122
srv_use_native_conditions = TRUE;
1126
#elif defined(LINUX_NATIVE_AIO)
1128
if (srv_use_native_aio) {
1129
drizzled::errmsg_printf(drizzled::error::INFO,
1130
_("InnoDB: Using Linux native AIO"));
1133
/* Currently native AIO is supported only on windows and linux
1134
and that also when the support is compiled in. In all other
1135
cases, we ignore the setting of innodb_use_native_aio. */
1136
srv_use_native_aio = FALSE;
1184
1140
if (srv_file_flush_method_str == NULL) {
1185
1141
/* These are the default options */
1206
1162
} else if (0 == ut_strcmp(srv_file_flush_method_str, "normal")) {
1207
1163
srv_win_file_flush_method = SRV_WIN_IO_NORMAL;
1208
os_aio_use_native_aio = FALSE;
1164
srv_use_native_aio = FALSE;
1210
1166
} else if (0 == ut_strcmp(srv_file_flush_method_str, "unbuffered")) {
1211
1167
srv_win_file_flush_method = SRV_WIN_IO_UNBUFFERED;
1212
os_aio_use_native_aio = FALSE;
1168
srv_use_native_aio = FALSE;
1214
1170
} else if (0 == ut_strcmp(srv_file_flush_method_str,
1215
1171
"async_unbuffered")) {
1216
1172
srv_win_file_flush_method = SRV_WIN_IO_UNBUFFERED;
1220
"InnoDB: Unrecognized value %s for"
1221
" innodb_flush_method\n",
1222
srv_file_flush_method_str);
1175
drizzled::errmsg_printf(drizzled::error::ERROR,
1176
"InnoDB: Unrecognized value %s for innodb_flush_method",
1177
srv_file_flush_method_str);
1223
1178
return(DB_ERROR);
1231
1186
maximum number of threads that can wait in the 'srv_conc array' for
1232
1187
their time to enter InnoDB. */
1234
#if defined(__NETWARE__)
1236
/* Create less event semaphores because Win 98/ME had
1237
difficulty creating 40000 event semaphores. Comment from
1238
Novell, Inc.: also, these just take a lot of memory on
1240
srv_max_n_threads = 1000;
1242
1189
if (srv_buf_pool_size >= 1000 * 1024 * 1024) {
1243
1190
/* If buffer pool is less than 1000 MB,
1244
assume fewer threads. */
1191
assume fewer threads. Also use only one
1192
buffer pool instance */
1245
1193
srv_max_n_threads = 50000;
1247
1195
} else if (srv_buf_pool_size >= 8 * 1024 * 1024) {
1197
srv_buf_pool_instances = 1;
1249
1198
srv_max_n_threads = 10000;
1200
srv_buf_pool_instances = 1;
1251
1201
srv_max_n_threads = 1000; /* saves several MB of memory,
1252
1202
especially in 64-bit
1256
1206
err = srv_boot();
1258
1208
if (err != DB_SUCCESS) {
1260
1210
return((int) err);
1263
mutex_create(&srv_monitor_file_mutex, SYNC_NO_ORDER_CHECK);
1213
mutex_create(srv_monitor_file_mutex_key,
1214
&srv_monitor_file_mutex, SYNC_NO_ORDER_CHECK);
1265
1216
if (srv_innodb_status) {
1266
srv_monitor_file_name = mem_alloc(
1217
srv_monitor_file_name = static_cast<char *>(mem_alloc(
1267
1218
strlen(fil_path_to_mysql_datadir)
1268
+ 20 + sizeof "/innodb_status.");
1219
+ 20 + sizeof "/innodb_status."));
1269
1220
sprintf(srv_monitor_file_name, "%s/innodb_status.%lu",
1270
1221
fil_path_to_mysql_datadir, os_proc_get_number());
1271
1222
srv_monitor_file = fopen(srv_monitor_file_name, "w+");
1272
1223
if (!srv_monitor_file) {
1273
fprintf(stderr, "InnoDB: unable to create %s: %s\n",
1274
srv_monitor_file_name, strerror(errno));
1224
drizzled::errmsg_printf(drizzled::error::ERROR,
1225
"InnoDB: unable to create %s: %s\n", srv_monitor_file_name, strerror(errno));
1275
1226
return(DB_ERROR);
1285
mutex_create(&srv_dict_tmpfile_mutex, SYNC_DICT_OPERATION);
1236
mutex_create(srv_dict_tmpfile_mutex_key,
1237
&srv_dict_tmpfile_mutex, SYNC_DICT_OPERATION);
1287
1239
srv_dict_tmpfile = os_file_create_tmpfile();
1288
1240
if (!srv_dict_tmpfile) {
1289
1241
return(DB_ERROR);
1292
mutex_create(&srv_misc_tmpfile_mutex, SYNC_ANY_LATCH);
1244
mutex_create(srv_misc_tmpfile_mutex_key,
1245
&srv_misc_tmpfile_mutex, SYNC_ANY_LATCH);
1294
1247
srv_misc_tmpfile = os_file_create_tmpfile();
1295
1248
if (!srv_misc_tmpfile) {
1296
1249
return(DB_ERROR);
1299
/* If user has set the value of innodb_file_io_threads then
1300
we'll emit a message telling the user that this parameter
1301
is now deprecated. */
1302
if (srv_n_file_io_threads != 4) {
1303
fprintf(stderr, "InnoDB: Warning:"
1304
" innodb_file_io_threads is deprecated."
1305
" Please use innodb_read_io_threads and"
1306
" innodb_write_io_threads instead\n");
1252
/* innodb_file_io_threads used to be user settable.
1253
It is now just a combination of read_io_threads and
1254
write_io_threads that is set by innodb internally. */
1309
1256
/* Now overwrite the value on srv_n_file_io_threads */
1310
1257
srv_n_file_io_threads = 2 + srv_n_read_io_threads
1328
1275
fil_init(srv_file_per_table ? 50000 : 5000,
1329
1276
srv_max_n_open_files);
1331
ret = buf_pool_init();
1335
"InnoDB: Fatal error: cannot allocate the memory"
1336
" for the buffer pool\n");
1278
/* Print time to initialize the buffer pool */
1280
if (srv_buf_pool_size >= 1024 * 1024 * 1024) {
1281
drizzled::errmsg_printf(drizzled::error::INFO, "InnoDB: Initializing buffer pool, size = %.1fG",
1282
((double) srv_buf_pool_size) / (1024 * 1024 * 1024));
1284
drizzled::errmsg_printf(drizzled::error::INFO, "InnoDB: Initializing buffer pool, size = %.1fM",
1285
((double) srv_buf_pool_size) / (1024 * 1024));
1288
err = buf_pool_init(srv_buf_pool_size, srv_buf_pool_instances);
1290
drizzled::errmsg_printf(drizzled::error::INFO, "InnoDB: Completed initialization of buffer pool");
1292
if (err != DB_SUCCESS) {
1293
drizzled::errmsg_printf(drizzled::error::ERROR, "InnoDB: Fatal error: cannot allocate the memory for the buffer pool");
1341
1298
#ifdef UNIV_DEBUG
1345
1302
if (srv_buf_pool_size <= 5 * 1024 * 1024) {
1347
fprintf(stderr, "InnoDB: Warning: Small buffer pool size "
1348
"(%luM), the flst_validate() debug function "
1349
"can cause a deadlock if the buffer pool fills up.\n",
1350
srv_buf_pool_size / 1024 / 1024);
1304
drizzled::errmsg_printf(drizzled::error::WARN, "InnoDB: Warning: Small buffer pool size "
1305
"(%luM), the flst_validate() debug function "
1306
"can cause a deadlock if the buffer pool fills up.\n",
1307
srv_buf_pool_size / 1024 / 1024);
1367
1324
#ifdef UNIV_LOG_ARCHIVE
1368
1325
if (0 != ut_strcmp(srv_log_group_home_dirs[0], srv_arch_dir)) {
1370
"InnoDB: Error: you must set the log group"
1371
" home dir in my.cnf the\n"
1372
"InnoDB: same as log arch dir.\n");
1326
drizzled::errmsg_printf(drizzled::error::ERROR,
1327
"InnoDB: Error: you must set the log group home dir in my.cnf the same as log arch dir.");
1374
1329
return(DB_ERROR);
1376
1331
#endif /* UNIV_LOG_ARCHIVE */
1378
1333
if (srv_n_log_files * srv_log_file_size >= 262144) {
1380
"InnoDB: Error: combined size of log files"
1381
" must be < 4 GB\n");
1334
drizzled::errmsg_printf(drizzled::error::ERROR,
1335
"InnoDB: Error: combined size of log files must be < 4 GB");
1383
1337
return(DB_ERROR);
1388
1342
for (i = 0; i < srv_n_data_files; i++) {
1389
1343
#ifndef __WIN__
1390
1344
if (sizeof(off_t) < 5 && srv_data_file_sizes[i] >= 262144) {
1392
"InnoDB: Error: file size must be < 4 GB"
1393
" with this MySQL binary\n"
1394
"InnoDB: and operating system combination,"
1395
" in some OS's < 2 GB\n");
1345
drizzled::errmsg_printf(drizzled::error::ERROR,
1346
"InnoDB: Error: file size must be < 4 GB with this MySQL binary and operating system combination,"
1347
" in some OS's < 2 GB\n");
1397
1349
return(DB_ERROR);
1415
1365
&min_flushed_lsn, &max_flushed_lsn,
1416
1366
&sum_of_new_sizes);
1417
1367
if (err != DB_SUCCESS) {
1419
"InnoDB: Could not open or create data files.\n"
1420
"InnoDB: If you tried to add new data files,"
1421
" and it failed here,\n"
1422
"InnoDB: you should now edit innodb_data_file_path"
1424
"InnoDB: to what it was, and remove the"
1425
" new ibdata files InnoDB created\n"
1426
"InnoDB: in this failed attempt. InnoDB only wrote"
1427
" those files full of\n"
1428
"InnoDB: zeros, but did not yet use them in any way."
1429
" But be careful: do not\n"
1430
"InnoDB: remove old data files"
1431
" which contain your precious data!\n");
1368
drizzled::errmsg_printf(drizzled::error::ERROR,
1369
"InnoDB: Could not open or create data files.\n"
1370
"InnoDB: If you tried to add new data files, and it failed here,\n"
1371
"InnoDB: you should now edit innodb_data_file_path in my.cnf back\n"
1372
"InnoDB: to what it was, and remove the new ibdata files InnoDB created\n"
1373
"InnoDB: in this failed attempt. InnoDB only wrote those files full of\n"
1374
"InnoDB: zeros, but did not yet use them in any way. But be careful: do not\n"
1375
"InnoDB: remove old data files which contain your precious data!\n");
1433
1377
return((int) err);
1454
1398
if ((log_opened && create_new_db)
1455
1399
|| (log_opened && log_created)) {
1457
"InnoDB: Error: all log files must be"
1458
" created at the same time.\n"
1459
"InnoDB: All log files must be"
1460
" created also in database creation.\n"
1461
"InnoDB: If you want bigger or smaller"
1462
" log files, shut down the\n"
1463
"InnoDB: database and make sure there"
1464
" were no errors in shutdown.\n"
1465
"InnoDB: Then delete the existing log files."
1466
" Edit the .cnf file\n"
1400
drizzled::errmsg_printf(drizzled::error::ERROR,
1401
"InnoDB: Error: all log files must be created at the same time.\n"
1402
"InnoDB: All log files must be created also in database creation.\n"
1403
"InnoDB: If you want bigger or smaller log files, shut down the\n"
1404
"InnoDB: database and make sure there were no errors in shutdown.\n"
1405
"InnoDB: Then delete the existing log files. Edit the .cnf file\n"
1467
1406
"InnoDB: and start the database again.\n");
1469
1408
return(DB_ERROR);
1485
1424
|| max_arch_log_no != min_arch_log_no
1486
1425
#endif /* UNIV_LOG_ARCHIVE */
1489
"InnoDB: Cannot initialize created"
1490
" log files because\n"
1491
"InnoDB: data files were not in sync"
1492
" with each other\n"
1427
drizzled::errmsg_printf(drizzled::error::ERROR,
1428
"InnoDB: Cannot initialize created log files because\n"
1429
"InnoDB: data files were not in sync with each other\n"
1493
1430
"InnoDB: or the data files are corrupt.\n");
1495
1432
return(DB_ERROR);
1498
1435
if (max_flushed_lsn < (ib_uint64_t) 1000) {
1500
"InnoDB: Cannot initialize created"
1501
" log files because\n"
1502
"InnoDB: data files are corrupt,"
1503
" or new data files were\n"
1504
"InnoDB: created when the database"
1505
" was started previous\n"
1506
"InnoDB: time but the database"
1507
" was not shut down\n"
1508
"InnoDB: normally after that.\n");
1436
drizzled::errmsg_printf(drizzled::error::ERROR,
1437
"InnoDB: Cannot initialize created log files because\n"
1438
"InnoDB: data files are corrupt, or new data files were\n"
1439
"InnoDB: created when the database was started previous\n"
1440
"InnoDB: time but the database was not shut down\n"
1441
"InnoDB: normally after that.\n");
1510
1443
return(DB_ERROR);
1528
1461
if (create_new_db) {
1529
1462
mtr_start(&mtr);
1530
1464
fsp_header_init(0, sum_of_new_sizes, &mtr);
1532
1466
mtr_commit(&mtr);
1468
/* To maintain backward compatibility we create only
1469
the first rollback segment before the double write buffer.
1470
All the remaining rollback segments will be created later,
1471
after the double write buffer has been created. */
1534
1472
trx_sys_create();
1536
1476
srv_startup_is_before_trx_rollback_phase = FALSE;
1538
1478
#ifdef UNIV_LOG_ARCHIVE
1539
1479
} else if (srv_archive_recovery) {
1541
"InnoDB: Starting archive"
1542
" recovery from a backup...\n");
1480
drizzled::errmsg_printf(drizzled::error::INFO,
1481
"InnoDB: Starting archive recovery from a backup...");
1543
1482
err = recv_recovery_from_archive_start(
1544
1483
min_flushed_lsn, srv_archive_recovery_limit_lsn,
1545
1484
min_arch_log_no);
1610
1551
trx_sys_init_at_db_start();
1553
/* Initialize the fsp free limit global variable in the log
1555
fsp_header_get_free_limit();
1557
/* recv_recovery_from_checkpoint_finish needs trx lists which
1558
are initialized in trx_sys_init_at_db_start(). */
1560
recv_recovery_from_checkpoint_finish();
1612
1561
if (srv_force_recovery < SRV_FORCE_NO_IBUF_MERGE) {
1613
1562
/* The following call is necessary for the insert
1614
1563
buffer to work with multiple tablespaces. We must
1624
1573
every table in the InnoDB data dictionary that has
1627
We also determine the maximum tablespace id used.
1629
TODO: We may have incomplete transactions in the
1630
data dictionary tables. Does that harm the scanning of
1631
the data dictionary below? */
1576
We also determine the maximum tablespace id used. */
1633
1578
dict_check_tablespaces_and_store_max_id(
1634
1579
recv_needed_recovery);
1637
1582
srv_startup_is_before_trx_rollback_phase = FALSE;
1639
/* Initialize the fsp free limit global variable in the log
1641
fsp_header_get_free_limit();
1643
/* recv_recovery_from_checkpoint_finish needs trx lists which
1644
are initialized in trx_sys_init_at_db_start(). */
1646
recv_recovery_from_checkpoint_finish();
1583
recv_recovery_rollback_active();
1648
1585
/* It is possible that file_format tag has never
1649
1586
been set. In this case we initialize it to minimum
1692
1629
/* fprintf(stderr, "Max allowed record size %lu\n",
1693
1630
page_get_free_space_of_empty() / 2); */
1695
/* Create the thread which watches the timeouts for lock waits
1696
and prints InnoDB monitor info */
1698
os_thread_create(&srv_lock_timeout_and_monitor_thread, NULL,
1632
if (trx_doublewrite == NULL) {
1633
/* Create the doublewrite buffer to a new tablespace */
1635
trx_sys_create_doublewrite_buf();
1638
/* Here the double write buffer has already been created and so
1639
any new rollback segments will be allocated after the double
1640
write buffer. The default segment should already exist.
1641
We create the new segments only if it's a new database or
1642
the database was shutdown cleanly. */
1644
/* Note: When creating the extra rollback segments during an upgrade
1645
we violate the latching order, even if the change buffer is empty.
1646
We make an exception in sync0sync.c and check srv_is_being_started
1647
for that violation. It cannot create a deadlock because we are still
1648
running in single threaded mode essentially. Only the IO threads
1649
should be running at this stage. */
1651
trx_sys_create_rsegs(TRX_SYS_N_RSEGS - 1);
1653
/* Create the thread which watches the timeouts for lock waits */
1654
os_thread_create(&srv_lock_timeout_thread, NULL,
1699
1655
thread_ids + 2 + SRV_MAX_N_IO_THREADS);
1701
1657
/* Create the thread which warns of long semaphore waits */
1702
1658
os_thread_create(&srv_error_monitor_thread, NULL,
1703
1659
thread_ids + 3 + SRV_MAX_N_IO_THREADS);
1661
/* Create the thread which prints InnoDB monitor info */
1662
os_thread_create(&srv_monitor_thread, NULL,
1663
thread_ids + 4 + SRV_MAX_N_IO_THREADS);
1704
1665
srv_is_being_started = FALSE;
1706
if (trx_doublewrite == NULL) {
1707
/* Create the doublewrite buffer to a new tablespace */
1709
trx_sys_create_doublewrite_buf();
1712
1667
err = dict_create_or_check_foreign_constraint_tables();
1714
1669
if (err != DB_SUCCESS) {
1721
1676
os_thread_create(&srv_master_thread, NULL, thread_ids
1722
1677
+ (1 + SRV_MAX_N_IO_THREADS));
1679
/* Currently we allow only a single purge thread. */
1680
ut_a(srv_n_purge_threads == 0 || srv_n_purge_threads == 1);
1682
/* If the user has requested a separate purge thread then
1683
start the purge thread. */
1684
if (srv_n_purge_threads == 1) {
1685
os_thread_create(&srv_purge_thread, NULL, NULL);
1723
1688
#ifdef UNIV_DEBUG
1724
1689
/* buf_debug_prints = TRUE; */
1725
1690
#endif /* UNIV_DEBUG */
1734
1699
if (!srv_auto_extend_last_data_file
1735
1700
&& sum_of_data_file_sizes != tablespace_size_in_header) {
1738
"InnoDB: Error: tablespace size"
1739
" stored in header is %lu pages, but\n"
1740
"InnoDB: the sum of data file sizes is %lu pages\n",
1741
(ulong) tablespace_size_in_header,
1742
(ulong) sum_of_data_file_sizes);
1702
drizzled::errmsg_printf(drizzled::error::ERROR,
1703
"InnoDB: Error: tablespace size stored in header is %lu pages, but the sum of data file sizes is %lu pages.",
1704
(ulong) tablespace_size_in_header,
1705
(ulong) sum_of_data_file_sizes);
1744
1707
if (srv_force_recovery == 0
1745
1708
&& sum_of_data_file_sizes < tablespace_size_in_header) {
1746
1709
/* This is a fatal error, the tail of a tablespace is
1750
"InnoDB: Cannot start InnoDB."
1751
" The tail of the system tablespace is\n"
1752
"InnoDB: missing. Have you edited"
1753
" innodb_data_file_path in my.cnf in an\n"
1754
"InnoDB: inappropriate way, removing"
1755
" ibdata files from there?\n"
1756
"InnoDB: You can set innodb_force_recovery=1"
1757
" in my.cnf to force\n"
1758
"InnoDB: a startup if you are trying"
1759
" to recover a badly corrupt database.\n");
1712
drizzled::errmsg_printf(drizzled::error::ERROR,
1713
"InnoDB: Cannot start InnoDB. The tail of the system tablespace is "
1714
"missing. Have you edited innodb_data_file_path in my.cnf in an "
1715
"inappropriate way, removing ibdata files from there? "
1716
"You can set innodb_force_recovery=1 in my.cnf to force "
1717
"a startup if you are trying to recover a badly corrupt database.");
1761
1719
return(DB_ERROR);
1765
1723
if (srv_auto_extend_last_data_file
1766
1724
&& sum_of_data_file_sizes < tablespace_size_in_header) {
1769
"InnoDB: Error: tablespace size stored in header"
1770
" is %lu pages, but\n"
1771
"InnoDB: the sum of data file sizes"
1772
" is only %lu pages\n",
1773
(ulong) tablespace_size_in_header,
1774
(ulong) sum_of_data_file_sizes);
1726
drizzled::errmsg_printf(drizzled::error::ERROR,
1727
"InnoDB: Error: tablespace size stored in header is %lu pages, but the sum of data file sizes"
1728
" is only %lu pages\n",
1729
(ulong) tablespace_size_in_header,
1730
(ulong) sum_of_data_file_sizes);
1776
1732
if (srv_force_recovery == 0) {
1779
"InnoDB: Cannot start InnoDB. The tail of"
1780
" the system tablespace is\n"
1781
"InnoDB: missing. Have you edited"
1782
" innodb_data_file_path in my.cnf in an\n"
1783
"InnoDB: inappropriate way, removing"
1784
" ibdata files from there?\n"
1785
"InnoDB: You can set innodb_force_recovery=1"
1786
" in my.cnf to force\n"
1787
"InnoDB: a startup if you are trying to"
1788
" recover a badly corrupt database.\n");
1734
drizzled::errmsg_printf(drizzled::error::ERROR,
1735
"InnoDB: Cannot start InnoDB. The tail of the system tablespace is "
1736
"missing. Have you edited innodb_data_file_path in my.cnf in an "
1737
"inappropriate way, removing ibdata files from there? "
1738
"You can set innodb_force_recovery=1 in my.cnf to force "
1739
"a startup if you are trying to recover a badly corrupt database.\n");
1790
1741
return(DB_ERROR);
1811
1760
os_fast_mutex_free(&srv_os_test_mutex);
1813
1762
if (srv_print_verbose_log) {
1814
ut_print_timestamp(stderr);
1816
" InnoDB Plugin %s started; "
1817
"log sequence number %"PRIu64"\n",
1818
INNODB_VERSION_STR, srv_start_lsn);
1763
drizzled::errmsg_printf(drizzled::error::ERROR,
1764
"InnoDB %s started; log sequence number %"PRIu64"\n",
1765
INNODB_VERSION_STR, srv_start_lsn);
1821
1768
if (srv_force_recovery > 0) {
1823
"InnoDB: !!! innodb_force_recovery"
1824
" is set to %lu !!!\n",
1825
(ulong) srv_force_recovery);
1769
drizzled::errmsg_printf(drizzled::error::ERROR,
1770
"InnoDB: !!! innodb_force_recovery is set to %lu !!!\n",
1771
(ulong) srv_force_recovery);
1830
1774
if (trx_doublewrite_must_reset_space_ids) {
1831
1775
/* Actually, we did not change the undo log format between
1832
1776
4.0 and 4.1.1, and we would not need to run purge to
1841
1785
4.1.1. It is essential that the insert buffer is emptied
1845
"InnoDB: You are upgrading to an"
1846
" InnoDB version which allows multiple\n"
1847
"InnoDB: tablespaces. Wait that purge"
1848
" and insert buffer merge run to\n"
1849
"InnoDB: completion...\n");
1788
drizzled::errmsg_printf(drizzled::error::INFO,
1789
"InnoDB: You are upgrading to an InnoDB version which allows multiple. "
1790
"tablespaces. Wait that purge and insert buffer merge run to completion...");
1851
1792
os_thread_sleep(1000000);
1862
"InnoDB: Full purge and insert buffer merge"
1802
drizzled::errmsg_printf(drizzled::error::INFO,
1803
"InnoDB: Full purge and insert buffer merge completed.");
1865
1805
trx_sys_mark_upgraded_to_multiple_tablespaces();
1868
"InnoDB: You have now successfully upgraded"
1869
" to the multiple tablespaces\n"
1870
"InnoDB: format. You should NOT DOWNGRADE"
1871
" to an earlier version of\n"
1872
"InnoDB: InnoDB! But if you absolutely need to"
1874
"InnoDB: " REFMAN "multiple-tablespaces.html\n"
1875
"InnoDB: for instructions.\n");
1807
drizzled::errmsg_printf(drizzled::error::INFO,
1808
"InnoDB: You have now successfully upgraded"
1809
" to the multiple tablespaces\n"
1810
"InnoDB: format. You should NOT DOWNGRADE"
1811
" to an earlier version of\n"
1812
"InnoDB: InnoDB! But if you absolutely need to"
1814
"InnoDB: " REFMAN "multiple-tablespaces.html\n"
1815
"InnoDB: for instructions.\n");
1878
1818
if (srv_force_recovery == 0) {
1900
1840
/*=============================*/
1904
extern ibool panic_shutdown;
1906
1843
if (!srv_was_started) {
1907
1844
if (srv_is_being_started) {
1908
ut_print_timestamp(stderr);
1910
" InnoDB: Warning: shutting down"
1911
" a not properly started\n"
1912
"InnoDB: or created database!\n");
1845
drizzled::errmsg_printf(drizzled::error::ERROR,
1846
"InnoDB: Warning: shutting down a not properly started or created database!");
1915
1849
return(DB_SUCCESS);
1924
1858
if (srv_fast_shutdown == 2) {
1925
ut_print_timestamp(stderr);
1927
" InnoDB: MySQL has requested a very fast shutdown"
1928
" without flushing "
1929
"the InnoDB buffer pool to data files."
1930
" At the next mysqld startup "
1931
"InnoDB will do a crash recovery!\n");
1859
drizzled::errmsg_printf(drizzled::error::INFO,
1860
"InnoDB: MySQL has requested a very fast shutdown without flushing "
1861
"the InnoDB buffer pool to data files. At the next mysqld startup "
1862
"InnoDB will do a crash recovery!");
1935
if (!panic_shutdown)
1937
logs_empty_and_mark_files_at_shutdown();
1865
logs_empty_and_mark_files_at_shutdown();
1939
1867
if (srv_conc_n_threads != 0) {
1941
"InnoDB: Warning: query counter shows %ld queries"
1943
"InnoDB: inside InnoDB at shutdown\n",
1944
srv_conc_n_threads);
1868
drizzled::errmsg_printf(drizzled::error::WARN,
1869
"InnoDB: Warning: query counter shows %ld queries still InnoDB: inside InnoDB at shutdown.",
1870
srv_conc_n_threads);
1947
1873
/* 2. Make all threads created by InnoDB to exit */
1983
1912
/* All the threads have exited or are just exiting;
1984
1913
NOTE that the threads may not have completed their
1985
1914
exit yet. Should we use pthread_join() to make sure
1986
they have exited? Now we just sleep 0.1 seconds and
1987
hope that is enough! */
1915
they have exited? If we did, we would have to
1916
remove the pthread_detach() from
1917
os_thread_exit(). Now we just sleep 0.1
1918
seconds and hope that is enough! */
1989
1920
os_mutex_exit(os_sync_mutex);
2023
1953
srv_misc_tmpfile = 0;
1956
/* This must be disabled before closing the buffer pool
1957
and closing the data dictionary. */
1958
btr_search_disable();
2026
1964
trx_sys_file_format_close();
2028
1967
mutex_free(&srv_monitor_file_mutex);
2029
1968
mutex_free(&srv_dict_tmpfile_mutex);
2030
1969
mutex_free(&srv_misc_tmpfile_mutex);
1971
btr_search_sys_free();
2032
1973
/* 3. Free all InnoDB's own mutexes and the os_fast_mutexes inside
2036
1980
/* 4. Free the os_conc_mutex and all os_events and os_mutexes */
2039
1982
os_sync_free();
2041
/* Check that all read views are closed except read view owned
2044
if (UT_LIST_GET_LEN(trx_sys->view_list) > 1) {
2046
"InnoDB: Error: all read views were not closed"
2047
" before shutdown:\n"
2048
"InnoDB: %lu read views open \n",
2049
UT_LIST_GET_LEN(trx_sys->view_list) - 1);
2052
/* 5. Free all allocated memory and the os_fast_mutex created in
1984
/* 5. Free all allocated memory */
1988
buf_pool_free(srv_buf_pool_instances);
1991
/* ut_free_all_mem() frees all allocated memory not freed yet
1992
in shutdown, and it will also free the ut_list_mutex, so it
1993
should be the last one for all operation */
2056
1994
ut_free_all_mem();
2058
1996
if (os_thread_count != 0
2059
1997
|| os_event_count != 0
2060
1998
|| os_mutex_count != 0
2061
1999
|| os_fast_mutex_count != 0) {
2063
"InnoDB: Warning: some resources were not"
2064
" cleaned up in shutdown:\n"
2065
"InnoDB: threads %lu, events %lu,"
2066
" os_mutexes %lu, os_fast_mutexes %lu\n",
2067
(ulong) os_thread_count, (ulong) os_event_count,
2068
(ulong) os_mutex_count, (ulong) os_fast_mutex_count);
2000
drizzled::errmsg_printf(drizzled::error::WARN,
2001
"InnoDB: Warning: some resources were not cleaned up in shutdown:\n"
2002
"InnoDB: threads %lu, events %lu, os_mutexes %lu, os_fast_mutexes %lu\n",
2003
(ulong) os_thread_count, (ulong) os_event_count,
2004
(ulong) os_mutex_count, (ulong) os_fast_mutex_count);
2071
2007
if (dict_foreign_err_file) {
2078
2014
if (srv_print_verbose_log) {
2079
ut_print_timestamp(stderr);
2081
" InnoDB: Shutdown completed;"
2082
" log sequence number %"PRIu64"\n",
2015
drizzled::errmsg_printf(drizzled::error::INFO,
2016
"InnoDB: Shutdown completed log sequence number %"PRIu64,
2086
2020
srv_was_started = FALSE;
2021
srv_start_has_been_called = FALSE;
2088
2023
return((int) DB_SUCCESS);
2092
void set_panic_flag_for_netware()
2094
extern ibool panic_shutdown;
2095
panic_shutdown = TRUE;
2097
#endif /* __NETWARE__ */
2098
2025
#endif /* !UNIV_HOTBACKUP */