diff options
Diffstat (limited to 'storage/xtradb/srv/srv0srv.cc')
-rw-r--r-- | storage/xtradb/srv/srv0srv.cc | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/storage/xtradb/srv/srv0srv.cc b/storage/xtradb/srv/srv0srv.cc index a12a8b197fb..16df97edd64 100644 --- a/storage/xtradb/srv/srv0srv.cc +++ b/storage/xtradb/srv/srv0srv.cc @@ -515,7 +515,12 @@ UNIV_INTERN ulong srv_log_checksum_algorithm = SRV_CHECKSUM_ALGORITHM_INNODB; /*-------------------------------------------*/ +#ifdef HAVE_MEMORY_BARRIER +/* No idea to wait long with memory barriers */ +UNIV_INTERN ulong srv_n_spin_wait_rounds = 15; +#else UNIV_INTERN ulong srv_n_spin_wait_rounds = 30; +#endif UNIV_INTERN ulong srv_spin_wait_delay = 6; UNIV_INTERN ibool srv_priority_boost = TRUE; @@ -671,6 +676,9 @@ current_time % 5 != 0. */ ? thd_lock_wait_timeout((trx)->mysql_thd) \ : 0) +/** Simulate compression failures. */ +UNIV_INTERN uint srv_simulate_comp_failures = 0; + /* IMPLEMENTATION OF THE SERVER MAIN PROGRAM ========================================= @@ -798,7 +806,9 @@ static const ulint SRV_MASTER_SLOT = 0; UNIV_INTERN os_event_t srv_checkpoint_completed_event; -UNIV_INTERN os_event_t srv_redo_log_thread_finished_event; +UNIV_INTERN os_event_t srv_redo_log_tracked_event; + +UNIV_INTERN bool srv_redo_log_thread_started = false; /*********************************************************************//** Prints counters for work done by srv_master_thread. */ @@ -1152,7 +1162,10 @@ srv_init(void) srv_checkpoint_completed_event = os_event_create(); - srv_redo_log_thread_finished_event = os_event_create(); + if (srv_track_changed_pages) { + srv_redo_log_tracked_event = os_event_create(); + os_event_set(srv_redo_log_tracked_event); + } UT_LIST_INIT(srv_sys->tasks); } @@ -2164,9 +2177,10 @@ loop: /* Try to track a strange bug reported by Harald Fuchs and others, where the lsn seems to decrease at times */ - new_lsn = log_get_lsn(); + /* We have to use nowait to ensure we don't block */ + new_lsn= log_get_lsn_nowait(); - if (new_lsn < old_lsn) { + if (new_lsn && new_lsn < old_lsn) { ut_print_timestamp(stderr); fprintf(stderr, " InnoDB: Error: old log sequence number " LSN_PF @@ -2178,7 +2192,8 @@ loop: ut_ad(0); } - old_lsn = new_lsn; + if (new_lsn) + old_lsn = new_lsn; if (difftime(time(NULL), srv_last_monitor_time) > 60) { /* We referesh InnoDB Monitor values so that averages are @@ -2391,6 +2406,7 @@ DECLARE_THREAD(srv_redo_log_follow_thread)( #endif my_thread_init(); + srv_redo_log_thread_started = true; do { os_event_wait(srv_checkpoint_completed_event); @@ -2410,13 +2426,15 @@ DECLARE_THREAD(srv_redo_log_follow_thread)( "stopping log tracking thread!\n"); break; } + os_event_set(srv_redo_log_tracked_event); } } while (srv_shutdown_state < SRV_SHUTDOWN_LAST_PHASE); srv_track_changed_pages = FALSE; log_online_read_shutdown(); - os_event_set(srv_redo_log_thread_finished_event); + os_event_set(srv_redo_log_tracked_event); + srv_redo_log_thread_started = false; /* Defensive, not required */ my_thread_end(); os_thread_exit(NULL); |