srv0start.c, ut0mem.c, ut0dbg.c, ut0dbg.h, srv0start.h:

  Changes for NetWare to exit the InnoDB gracefully instead of crashing the server (patch by PRam@novell.com, polished a little by Heikki Tuuri)
mysqld.cc, ha_innodb.cc:
  Changes for NetWare to exit the InnoDB gracefully instead of crashing the server (patch by PRam@novell.com, polished a little by Heikki Tuuri) 
parent 32f905f7
...@@ -63,11 +63,13 @@ innobase_start_or_create_for_mysql(void); ...@@ -63,11 +63,13 @@ innobase_start_or_create_for_mysql(void);
/* out: DB_SUCCESS or error code */ /* out: DB_SUCCESS or error code */
/******************************************************************** /********************************************************************
Shuts down the Innobase database. */ Shuts down the Innobase database. */
int int
innobase_shutdown_for_mysql(void); innobase_shutdown_for_mysql(void);
/*=============================*/ /*=============================*/
/* out: DB_SUCCESS or error code */ /* out: DB_SUCCESS or error code */
#ifdef __NETWARE__
void set_panic_flag_for_netware(void);
#endif
extern ulint srv_sizeof_trx_t_in_ha_innodb_cc; extern ulint srv_sizeof_trx_t_in_ha_innodb_cc;
......
...@@ -22,7 +22,38 @@ extern ulint* ut_dbg_null_ptr; ...@@ -22,7 +22,38 @@ extern ulint* ut_dbg_null_ptr;
extern const char* ut_dbg_msg_assert_fail; extern const char* ut_dbg_msg_assert_fail;
extern const char* ut_dbg_msg_trap; extern const char* ut_dbg_msg_trap;
extern const char* ut_dbg_msg_stop; extern const char* ut_dbg_msg_stop;
/* Have a graceful exit on NetWare rather than a segfault to avoid abends */
#ifdef __NETWARE__
extern ibool panic_shutdown;
#define ut_a(EXPR) do {\
if (!((ulint)(EXPR) + ut_dbg_zero)) {\
ut_print_timestamp(stderr);\
fprintf(stderr, ut_dbg_msg_assert_fail,\
os_thread_pf(os_thread_get_curr_id()), __FILE__,\
(ulint)__LINE__);\
fputs("InnoDB: Failing assertion: " #EXPR "\n", stderr);\
fputs(ut_dbg_msg_trap, stderr);\
ut_dbg_stop_threads = TRUE;\
if (ut_dbg_stop_threads) {\
fprintf(stderr, ut_dbg_msg_stop,\
os_thread_pf(os_thread_get_curr_id()), __FILE__, (ulint)__LINE__);\
}\
if(!panic_shutdown){\
panic_shutdown = TRUE;\
innobase_shutdown_for_mysql();}\
exit(1);\
}\
} while (0)
#define ut_error do {\
ut_print_timestamp(stderr);\
fprintf(stderr, ut_dbg_msg_assert_fail,\
os_thread_pf(os_thread_get_curr_id()), __FILE__, (ulint)__LINE__);\
fprintf(stderr, ut_dbg_msg_trap);\
ut_dbg_stop_threads = TRUE;\
if(!panic_shutdown){panic_shutdown = TRUE;\
innobase_shutdown_for_mysql();}\
} while (0)
#else
#define ut_a(EXPR) do {\ #define ut_a(EXPR) do {\
if (!((ulint)(EXPR) + ut_dbg_zero)) {\ if (!((ulint)(EXPR) + ut_dbg_zero)) {\
ut_print_timestamp(stderr);\ ut_print_timestamp(stderr);\
...@@ -49,6 +80,7 @@ extern const char* ut_dbg_msg_stop; ...@@ -49,6 +80,7 @@ extern const char* ut_dbg_msg_stop;
ut_dbg_stop_threads = TRUE;\ ut_dbg_stop_threads = TRUE;\
if (*(ut_dbg_null_ptr)) ut_dbg_null_ptr = NULL;\ if (*(ut_dbg_null_ptr)) ut_dbg_null_ptr = NULL;\
} while (0) } while (0)
#endif
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
# define ut_ad(EXPR) ut_a(EXPR) # define ut_ad(EXPR) ut_a(EXPR)
......
...@@ -1079,6 +1079,7 @@ NetWare. */ ...@@ -1079,6 +1079,7 @@ NetWare. */
for (i = 0; i < srv_n_file_io_threads; i++) { for (i = 0; i < srv_n_file_io_threads; i++) {
n[i] = i; n[i] = i;
os_thread_create(io_handler_thread, n + i, thread_ids + i); os_thread_create(io_handler_thread, n + i, thread_ids + i);
} }
...@@ -1440,7 +1441,6 @@ NetWare. */ ...@@ -1440,7 +1441,6 @@ NetWare. */
} }
fflush(stderr); fflush(stderr);
return((int) DB_SUCCESS); return((int) DB_SUCCESS);
} }
...@@ -1453,7 +1453,9 @@ innobase_shutdown_for_mysql(void) ...@@ -1453,7 +1453,9 @@ innobase_shutdown_for_mysql(void)
/* out: DB_SUCCESS or error code */ /* out: DB_SUCCESS or error code */
{ {
ulint i; ulint i;
#ifdef __NETWARE__
extern ibool panic_shutdown;
#endif
if (!srv_was_started) { if (!srv_was_started) {
if (srv_is_being_started) { if (srv_is_being_started) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
...@@ -1471,8 +1473,11 @@ innobase_shutdown_for_mysql(void) ...@@ -1471,8 +1473,11 @@ innobase_shutdown_for_mysql(void)
The step 1 is the real InnoDB shutdown. The remaining steps The step 1 is the real InnoDB shutdown. The remaining steps
just free data structures after the shutdown. */ just free data structures after the shutdown. */
#ifdef __NETWARE__
if(!panic_shutdown)
#endif
logs_empty_and_mark_files_at_shutdown(); logs_empty_and_mark_files_at_shutdown();
if (srv_conc_n_threads != 0) { if (srv_conc_n_threads != 0) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Warning: query counter shows %ld queries still\n" "InnoDB: Warning: query counter shows %ld queries still\n"
...@@ -1540,12 +1545,11 @@ innobase_shutdown_for_mysql(void) ...@@ -1540,12 +1545,11 @@ innobase_shutdown_for_mysql(void)
mem_free(srv_monitor_file_name); mem_free(srv_monitor_file_name);
} }
} }
mutex_free(&srv_monitor_file_mutex); mutex_free(&srv_monitor_file_mutex);
/* 3. Free all InnoDB's own mutexes and the os_fast_mutexes inside /* 3. Free all InnoDB's own mutexes and the os_fast_mutexes inside
them */ them */
sync_close(); sync_close();
/* 4. Free the os_conc_mutex and all os_events and os_mutexes */ /* 4. Free the os_conc_mutex and all os_events and os_mutexes */
...@@ -1556,7 +1560,7 @@ innobase_shutdown_for_mysql(void) ...@@ -1556,7 +1560,7 @@ innobase_shutdown_for_mysql(void)
/* 5. Free all allocated memory and the os_fast_mutex created in /* 5. Free all allocated memory and the os_fast_mutex created in
ut0mem.c */ ut0mem.c */
ut_free_all_mem(); ut_free_all_mem();
if (os_thread_count != 0 if (os_thread_count != 0
|| os_event_count != 0 || os_event_count != 0
...@@ -1583,3 +1587,11 @@ innobase_shutdown_for_mysql(void) ...@@ -1583,3 +1587,11 @@ innobase_shutdown_for_mysql(void)
return((int) DB_SUCCESS); return((int) DB_SUCCESS);
} }
#ifdef __NETWARE__
void set_panic_flag_for_netware()
{
extern ibool panic_shutdown;
panic_shutdown = TRUE;
}
#endif
...@@ -14,7 +14,12 @@ ulint ut_dbg_zero = 0; ...@@ -14,7 +14,12 @@ ulint ut_dbg_zero = 0;
/* If this is set to TRUE all threads will stop into the next assertion /* If this is set to TRUE all threads will stop into the next assertion
and assert */ and assert */
ibool ut_dbg_stop_threads = FALSE; ibool ut_dbg_stop_threads = FALSE;
#ifdef __NETWARE__
ibool panic_shutdown = FALSE; /* This is set to TRUE when on NetWare there
happens an InnoDB assertion failure or other
fatal error condition that requires an
immediate shutdown. */
#endif
/* Null pointer used to generate memory trap */ /* Null pointer used to generate memory trap */
ulint* ut_dbg_null_ptr = NULL; ulint* ut_dbg_null_ptr = NULL;
......
...@@ -106,7 +106,13 @@ ut_malloc_low( ...@@ -106,7 +106,13 @@ ut_malloc_low(
/* Make an intentional seg fault so that we get a stack /* Make an intentional seg fault so that we get a stack
trace */ trace */
/* Intentional segfault on NetWare causes an abend. Avoid this
by graceful exit handling in ut_a(). */
#if (!defined __NETWARE__)
if (*ut_mem_null_ptr) ut_mem_null_ptr = 0; if (*ut_mem_null_ptr) ut_mem_null_ptr = 0;
#else
ut_a(0);
#endif
} }
if (set_to_zero) { if (set_to_zero) {
......
...@@ -121,6 +121,10 @@ char innodb_dummy_stmt_trx_handle = 'D'; ...@@ -121,6 +121,10 @@ char innodb_dummy_stmt_trx_handle = 'D';
static HASH innobase_open_tables; static HASH innobase_open_tables;
#ifdef __NETWARE__ /* some special cleanup for NetWare */
bool nw_panic = FALSE;
#endif
static mysql_byte* innobase_get_key(INNOBASE_SHARE *share,uint *length, static mysql_byte* innobase_get_key(INNOBASE_SHARE *share,uint *length,
my_bool not_used __attribute__((unused))); my_bool not_used __attribute__((unused)));
static INNOBASE_SHARE *get_share(const char *table_name); static INNOBASE_SHARE *get_share(const char *table_name);
...@@ -950,6 +954,11 @@ innobase_end(void) ...@@ -950,6 +954,11 @@ innobase_end(void)
DBUG_ENTER("innobase_end"); DBUG_ENTER("innobase_end");
#ifdef __NETWARE__ /* some special cleanup for NetWare */
if (nw_panic) {
set_panic_flag_for_netware();
}
#endif
err = innobase_shutdown_for_mysql(); err = innobase_shutdown_for_mysql();
hash_free(&innobase_open_tables); hash_free(&innobase_open_tables);
my_free(internal_innobase_data_file_path,MYF(MY_ALLOW_ZERO_PTR)); my_free(internal_innobase_data_file_path,MYF(MY_ALLOW_ZERO_PTR));
......
...@@ -1547,6 +1547,8 @@ void registerwithneb() ...@@ -1547,6 +1547,8 @@ void registerwithneb()
ulong neb_event_callback(struct EventBlock *eblock) ulong neb_event_callback(struct EventBlock *eblock)
{ {
EventChangeVolStateEnter_s *voldata; EventChangeVolStateEnter_s *voldata;
extern bool nw_panic;
voldata= (EventChangeVolStateEnter_s *)eblock->EBEventData; voldata= (EventChangeVolStateEnter_s *)eblock->EBEventData;
/* Deactivation of a volume */ /* Deactivation of a volume */
...@@ -1559,6 +1561,7 @@ ulong neb_event_callback(struct EventBlock *eblock) ...@@ -1559,6 +1561,7 @@ ulong neb_event_callback(struct EventBlock *eblock)
if (!memcmp(&voldata->volID, &datavolid, sizeof(VolumeID_t))) if (!memcmp(&voldata->volID, &datavolid, sizeof(VolumeID_t)))
{ {
consoleprintf("MySQL data volume is deactivated, shutting down MySQL Server \n"); consoleprintf("MySQL data volume is deactivated, shutting down MySQL Server \n");
nw_panic = TRUE;
kill_server(0); kill_server(0);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment