diff options
Diffstat (limited to 'innobase/trx')
-rw-r--r-- | innobase/trx/trx0purge.c | 37 | ||||
-rw-r--r-- | innobase/trx/trx0rec.c | 47 | ||||
-rw-r--r-- | innobase/trx/trx0roll.c | 32 | ||||
-rw-r--r-- | innobase/trx/trx0rseg.c | 11 | ||||
-rw-r--r-- | innobase/trx/trx0sys.c | 25 | ||||
-rw-r--r-- | innobase/trx/trx0trx.c | 122 | ||||
-rw-r--r-- | innobase/trx/trx0undo.c | 107 | ||||
-rw-r--r-- | innobase/trx/ts/makefile | 16 | ||||
-rw-r--r-- | innobase/trx/ts/tstrx.c | 1663 | ||||
-rw-r--r-- | innobase/trx/ts/tsttrxold.c | 1089 |
10 files changed, 177 insertions, 2972 deletions
diff --git a/innobase/trx/trx0purge.c b/innobase/trx/trx0purge.c index 31223aa280e..558a0825fd7 100644 --- a/innobase/trx/trx0purge.c +++ b/innobase/trx/trx0purge.c @@ -45,7 +45,9 @@ trx_purge_update_undo_must_exist( the undo log still exists in the system */ dulint trx_id) /* in: transaction id */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ if (!read_view_sees_trx_id(purge_sys->view, trx_id)) { @@ -195,9 +197,9 @@ void trx_purge_sys_create(void) /*======================*/ { - com_endpoint_t* com_endpoint; - +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ purge_sys = mem_alloc(sizeof(trx_purge_t)); @@ -219,9 +221,7 @@ trx_purge_sys_create(void) purge_sys->arr = trx_undo_arr_create(); - com_endpoint = (com_endpoint_t*)purge_sys; /* This is a dummy non-NULL - value */ - purge_sys->sess = sess_open(com_endpoint, (byte*)"purge_system", 13); + purge_sys->sess = sess_open(); purge_sys->trx = purge_sys->sess->trx; @@ -262,7 +262,9 @@ trx_purge_add_update_undo_to_history( ut_ad(undo); rseg = undo->rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ rseg_header = trx_rsegf_get(rseg->space, rseg->page_no, mtr); @@ -276,7 +278,7 @@ trx_purge_add_update_undo_to_history( if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", (ulong) undo->id); - ut_a(0); + ut_error; } trx_rsegf_set_nth_undo(rseg_header, undo->id, FIL_NULL, mtr); @@ -295,8 +297,7 @@ trx_purge_add_update_undo_to_history( undo_header + TRX_UNDO_HISTORY_NODE, mtr); /* Write the trx number to the undo log header */ - mlog_write_dulint(undo_header + TRX_UNDO_TRX_NO, trx->no, MLOG_8BYTES, - mtr); + mlog_write_dulint(undo_header + TRX_UNDO_TRX_NO, trx->no, mtr); /* Write information about delete markings to the undo log header */ if (!undo->del_marks) { @@ -338,7 +339,9 @@ trx_purge_free_segment( /* printf("Freeing an update undo log segment\n"); */ +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ loop: mtr_start(&mtr); mutex_enter(&(rseg->mutex)); @@ -434,7 +437,9 @@ trx_purge_truncate_rseg_history( ulint n_removed_logs = 0; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ mtr_start(&mtr); mutex_enter(&(rseg->mutex)); @@ -520,7 +525,9 @@ trx_purge_truncate_history(void) dulint limit_trx_no; dulint limit_undo_no; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ trx_purge_arr_get_biggest(purge_sys->arr, &limit_trx_no, &limit_undo_no); @@ -560,7 +567,9 @@ trx_purge_truncate_if_arr_empty(void) /*=================================*/ /* out: TRUE if array empty */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (purge_sys->arr->n_used == 0) { @@ -589,7 +598,9 @@ trx_purge_rseg_get_next_history_log( ibool del_marks; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(rseg->mutex)); @@ -669,7 +680,9 @@ trx_purge_choose_next_log(void) ulint offset = 0; /* remove warning (??? bug ???) */ mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(purge_sys->next_stored == FALSE); rseg = UT_LIST_GET_FIRST(trx_sys->rseg_list); @@ -770,7 +783,9 @@ trx_purge_get_next_rec( ulint cmpl_info; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(purge_sys->mutex))); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(purge_sys->next_stored); space = purge_sys->rseg->space; @@ -1001,7 +1016,7 @@ trx_purge(void) /* Should not happen */ - ut_a(0); + ut_error; return(0); } @@ -1034,11 +1049,11 @@ trx_purge(void) mutex_enter(&kernel_mutex); - thr = que_fork_start_command(purge_sys->query, SESS_COMM_EXECUTE, 0); + thr = que_fork_start_command(purge_sys->query); ut_ad(thr); -/* thr2 = que_fork_start_command(purge_sys->query, SESS_COMM_EXECUTE, 0); +/* thr2 = que_fork_start_command(purge_sys->query); ut_ad(thr2); */ diff --git a/innobase/trx/trx0rec.c b/innobase/trx/trx0rec.c index a0f500e51d7..bd37a4b506b 100644 --- a/innobase/trx/trx0rec.c +++ b/innobase/trx/trx0rec.c @@ -41,47 +41,6 @@ trx_undof_page_add_undo_rec_log( byte* log_ptr; ulint len; -#ifdef notdefined - ulint i; - byte* prev_rec_ptr; - byte* ptr; - ulint min_len; - - ut_ad(new_free >= old_free + 4); - - i = 0; - ptr = undo_page + old_free + 2; - - if (old_free > mach_read_from_2(undo_page + TRX_UNDO_PAGE_HDR - + TRX_UNDO_PAGE_START)) { - prev_rec_ptr = undo_page + mach_read_from_2(ptr - 4) + 2; - - min_len = ut_min(new_free - old_free - 4, - (undo_page + old_free - 2) - prev_rec_ptr); - for (;;) { - if (i >= min_len) { - - break; - } else if ((*ptr == *prev_rec_ptr) - || ((*ptr == *prev_rec_ptr + 1) - && (ptr + 1 == suffix))) { - i++; - ptr++; - prev_rec_ptr++; - } else { - break; - } - } - } - - mlog_write_initial_log_record(undo_page, MLOG_UNDO_INSERT, mtr); - - mlog_catenate_ulint(mtr, old_free, MLOG_2BYTES); - - mlog_catenate_ulint_compressed(mtr, i); - - mlog_catenate_string(mtr, ptr, new_free - old_free - 2 - i); -#endif log_ptr = mlog_open(mtr, 30 + MLOG_BUF_MARGIN); if (log_ptr == NULL) { @@ -1111,7 +1070,9 @@ trx_undo_report_row_operation( IB__FILE__, __LINE__, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(undo_page, SYNC_TRX_UNDO_PAGE); +#endif /* UNIV_SYNC_DEBUG */ if (op_type == TRX_UNDO_INSERT_OP) { offset = trx_undo_page_report_insert(undo_page, trx, @@ -1238,7 +1199,9 @@ trx_undo_get_undo_rec( trx_undo_rec_t** undo_rec, /* out, own: copy of the record */ mem_heap_t* heap) /* in: memory heap where copied */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ if (!trx_purge_update_undo_must_exist(trx_id)) { @@ -1298,7 +1261,9 @@ trx_undo_prev_version_build( ulint i; char err_buf[1000]; +#ifdef UNIV_SYNC_DEBUG ut_ad(rw_lock_own(&(purge_sys->latch), RW_LOCK_SHARED)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(mtr_memo_contains(index_mtr, buf_block_align(index_rec), MTR_MEMO_PAGE_S_FIX) || mtr_memo_contains(index_mtr, buf_block_align(index_rec), diff --git a/innobase/trx/trx0roll.c b/innobase/trx/trx0roll.c index 1f053aeed89..6a25304c7ef 100644 --- a/innobase/trx/trx0roll.c +++ b/innobase/trx/trx0roll.c @@ -73,8 +73,7 @@ trx_general_rollback_for_mysql( thr = pars_complete_graph_for_exec(roll_node, trx, heap); - ut_a(thr == que_fork_start_command(que_node_get_parent(thr), - SESS_COMM_EXECUTE, 0)); + ut_a(thr == que_fork_start_command(que_node_get_parent(thr))); que_run_threads(thr); mutex_enter(&kernel_mutex); @@ -354,8 +353,7 @@ trx_rollback_or_clean_all_without_sess(void) /* Open a dummy session */ if (!trx_dummy_sess) { - trx_dummy_sess = sess_open(NULL, (byte*)"Dummy sess", - ut_strlen((char *) "Dummy sess")); + trx_dummy_sess = sess_open(); } mutex_exit(&kernel_mutex); @@ -418,7 +416,7 @@ loop: trx->graph = fork; - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); + ut_a(thr == que_fork_start_command(fork)); trx_roll_max_undo_no = ut_conv_dulint_to_longlong(trx->undo_no); trx_roll_progress_printed_pct = 0; @@ -678,8 +676,10 @@ trx_roll_try_truncate( dulint limit; dulint biggest; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); ut_ad(mutex_own(&((trx->rseg)->mutex))); +#endif /* UNIV_SYNC_DEBUG */ trx->pages_undone = 0; @@ -722,7 +722,9 @@ trx_roll_pop_top_rec( trx_undo_rec_t* prev_rec; page_t* prev_rec_page; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); +#endif /* UNIV_SYNC_DEBUG */ undo_page = trx_undo_page_get_s_latched(undo->space, undo->top_page_no, mtr); @@ -946,7 +948,9 @@ trx_rollback( que_thr_t* thr; /* que_thr_t* thr2; */ +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad((trx->undo_no_arr == NULL) || ((trx->undo_no_arr)->n_used == 0)); /* Initialize the rollback field in the transaction */ @@ -981,11 +985,11 @@ trx_rollback( trx->graph = roll_graph; trx->que_state = TRX_QUE_ROLLING_BACK; - thr = que_fork_start_command(roll_graph, SESS_COMM_EXECUTE, 0); + thr = que_fork_start_command(roll_graph); ut_ad(thr); -/* thr2 = que_fork_start_command(roll_graph, SESS_COMM_EXECUTE, 0); +/* thr2 = que_fork_start_command(roll_graph); ut_ad(thr2); */ @@ -1015,7 +1019,9 @@ trx_roll_graph_build( que_thr_t* thr; /* que_thr_t* thr2; */ +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ heap = mem_heap_create(512); fork = que_fork_create(NULL, NULL, QUE_FORK_ROLLBACK, heap); @@ -1042,7 +1048,9 @@ trx_finish_error_processing( trx_sig_t* sig; trx_sig_t* next_sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ sig = UT_LIST_GET_FIRST(trx->signals); @@ -1075,14 +1083,16 @@ trx_finish_partial_rollback_off_kernel( { trx_sig_t* sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ sig = UT_LIST_GET_FIRST(trx->signals); /* Remove the signal from the signal queue and send reply message to it */ - trx_sig_reply(trx, sig, next_thr); + trx_sig_reply(sig, next_thr); trx_sig_remove(trx, sig); trx->que_state = TRX_QUE_RUNNING; @@ -1106,7 +1116,9 @@ trx_finish_rollback_off_kernel( trx_sig_t* sig; trx_sig_t* next_sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_a(trx->undo_no_arr == NULL || trx->undo_no_arr->n_used == 0); @@ -1145,7 +1157,7 @@ trx_finish_rollback_off_kernel( if (sig->type == TRX_SIG_TOTAL_ROLLBACK) { - trx_sig_reply(trx, sig, next_thr); + trx_sig_reply(sig, next_thr); trx_sig_remove(trx, sig); } @@ -1213,7 +1225,7 @@ trx_rollback_step( success = trx_sig_send(thr_get_trx(thr), sig_no, TRX_SIG_SELF, - TRUE, thr, savept, NULL); + thr, savept, NULL); thr->state = QUE_THR_SIG_REPLY_WAIT; diff --git a/innobase/trx/trx0rseg.c b/innobase/trx/trx0rseg.c index b1fb8a9539c..e3885c86def 100644 --- a/innobase/trx/trx0rseg.c +++ b/innobase/trx/trx0rseg.c @@ -60,7 +60,9 @@ trx_rseg_header_create( page_t* page; ut_ad(mtr); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space), MTR_MEMO_X_LOCK)); sys_header = trx_sysf_get(mtr); @@ -81,7 +83,9 @@ trx_rseg_header_create( return(FIL_NULL); } +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_RSEG_HEADER_NEW); +#endif /* UNIV_SYNC_DEBUG */ page_no = buf_frame_get_page_no(page); @@ -132,7 +136,9 @@ trx_rseg_mem_create( fil_addr_t node_addr; ulint sum_of_undo_sizes; - ut_ad(mutex_own(&kernel_mutex)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ rseg = mem_alloc(sizeof(trx_rseg_t)); @@ -173,8 +179,7 @@ trx_rseg_mem_create( + node_addr.boffset; rseg->last_trx_no = mtr_read_dulint( - undo_log_hdr + TRX_UNDO_TRX_NO, - MLOG_8BYTES, mtr); + undo_log_hdr + TRX_UNDO_TRX_NO, mtr); rseg->last_del_marks = mtr_read_ulint( undo_log_hdr + TRX_UNDO_DEL_MARKS, MLOG_2BYTES, mtr); diff --git a/innobase/trx/trx0sys.c b/innobase/trx/trx0sys.c index d9eace5ad9a..57cfcef7d6f 100644 --- a/innobase/trx/trx0sys.c +++ b/innobase/trx/trx0sys.c @@ -134,7 +134,9 @@ trx_sys_mark_upgraded_to_multiple_tablespaces(void) mtr_start(&mtr); page = buf_page_get(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ doublewrite = page + TRX_SYS_DOUBLEWRITE; @@ -177,7 +179,9 @@ start_again: mtr_start(&mtr); page = buf_page_get(TRX_SYS_SPACE, TRX_SYS_PAGE_NO, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ doublewrite = page + TRX_SYS_DOUBLEWRITE; @@ -187,7 +191,7 @@ start_again: just read in some numbers */ trx_doublewrite_init(doublewrite); - + mtr_commit(&mtr); } else { fprintf(stderr, @@ -211,7 +215,9 @@ start_again: /* fseg_create acquires a second latch on the page, therefore we must declare it: */ +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page2, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ if (page2 == NULL) { fprintf(stderr, @@ -254,7 +260,9 @@ start_again: new_page = buf_page_get(TRX_SYS_SPACE, page_no, RW_X_LATCH, &mtr); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(new_page, SYNC_NO_ORDER_CHECK); +#endif /* UNIV_SYNC_DEBUG */ /* Make a dummy change to the page to ensure it will be written to disk in a flush */ @@ -510,7 +518,9 @@ trx_in_trx_list( { trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ trx = UT_LIST_GET_FIRST(trx_sys->trx_list); @@ -537,14 +547,16 @@ trx_sys_flush_max_trx_id(void) trx_sysf_t* sys_header; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ mtr_start(&mtr); sys_header = trx_sysf_get(&mtr); mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE, - trx_sys->max_trx_id, MLOG_8BYTES, &mtr); + trx_sys->max_trx_id, &mtr); mtr_commit(&mtr); } @@ -736,7 +748,9 @@ trx_sysf_rseg_find_free( ulint page_no; ulint i; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(kernel_mutex))); +#endif /* UNIV_SYNC_DEBUG */ sys_header = trx_sysf_get(mtr); @@ -782,13 +796,15 @@ trx_sysf_create( mtr); ut_a(buf_frame_get_page_no(page) == TRX_SYS_PAGE_NO); +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(page, SYNC_TRX_SYS_HEADER); +#endif /* UNIV_SYNC_DEBUG */ sys_header = trx_sysf_get(mtr); /* Start counting transaction ids from number 1 up */ mlog_write_dulint(sys_header + TRX_SYS_TRX_ID_STORE, - ut_dulint_create(0, 1), MLOG_8BYTES, mtr); + ut_dulint_create(0, 1), mtr); /* Reset the rollback segment slots */ for (i = 0; i < TRX_SYS_N_RSEGS; i++) { @@ -843,8 +859,7 @@ trx_sys_init_at_db_start(void) trx_sys->max_trx_id = ut_dulint_add( ut_dulint_align_up( mtr_read_dulint(sys_header - + TRX_SYS_TRX_ID_STORE, - MLOG_8BYTES, &mtr), + + TRX_SYS_TRX_ID_STORE, &mtr), TRX_SYS_TRX_ID_WRITE_MARGIN), 2 * TRX_SYS_TRX_ID_WRITE_MARGIN); diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c index 3926cfa03c5..54358ad3d4c 100644 --- a/innobase/trx/trx0trx.c +++ b/innobase/trx/trx0trx.c @@ -73,7 +73,9 @@ trx_create( { trx_t* trx; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ trx = mem_alloc(sizeof(trx_t)); @@ -171,8 +173,7 @@ trx_allocate_for_mysql(void) /* Open a dummy session */ if (!trx_dummy_sess) { - trx_dummy_sess = sess_open(NULL, (byte*)"Dummy sess", - ut_strlen((char *) "Dummy sess")); + trx_dummy_sess = sess_open(); } trx = trx_create(trx_dummy_sess); @@ -205,8 +206,7 @@ trx_allocate_for_background(void) /* Open a dummy session */ if (!trx_dummy_sess) { - trx_dummy_sess = sess_open(NULL, (byte*)"Dummy sess", - ut_strlen("Dummy sess")); + trx_dummy_sess = sess_open(); } trx = trx_create(trx_dummy_sess); @@ -241,7 +241,9 @@ trx_free( { char err_buf[1000]; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (trx->declared_to_be_inside_innodb) { ut_print_timestamp(stderr); @@ -347,7 +349,9 @@ trx_list_insert_ordered( { trx_t* trx2; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ trx2 = UT_LIST_GET_FIRST(trx_sys->trx_list); @@ -509,7 +513,9 @@ trx_assign_rseg(void) { trx_rseg_t* rseg = trx_sys->latest_rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ loop: /* Get next rseg in a round-robin fashion */ @@ -546,7 +552,9 @@ trx_start_low( { trx_rseg_t* rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->rseg == NULL); if (trx->type == TRX_PURGE) { @@ -621,7 +629,9 @@ trx_commit_off_kernel( ibool must_flush_log = FALSE; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ rseg = trx->rseg; @@ -650,29 +660,6 @@ trx_commit_off_kernel( if (undo) { mutex_enter(&kernel_mutex); -#ifdef notdefined - /* !!!!!!!!! There is a bug here: purge and rollback - need the whole stack of old record versions even if no - consistent read would need them!! This is because they - decide on the basis of the old versions when we can - remove delete marked secondary index records! */ - - if (!undo->del_marks && (undo->size == 1) - && (UT_LIST_GET_LEN(trx_sys->view_list) == 1)) { - - /* There is no need to save the update undo - log: discard it; note that &mtr gets committed - while we must hold the kernel mutex and - therefore this optimization may add to the - contention of the kernel mutex. */ - - lsn = trx_undo_update_cleanup_by_discard(trx, - &mtr); - mutex_exit(&(rseg->mutex)); - - goto shortcut; - } -#endif trx->no = trx_sys_get_new_trx_no(); mutex_exit(&kernel_mutex); @@ -714,11 +701,13 @@ trx_commit_off_kernel( TRX_SYS_MYSQL_MASTER_LOG_INFO, &mtr); } - /* If we did not take the shortcut, the following call - commits the mini-transaction, making the whole transaction - committed in the file-based world at this log sequence number; - otherwise, we get the commit lsn from the call of - trx_undo_update_cleanup_by_discard above. + /* The following call commits the mini-transaction, making the + whole transaction committed in the file-based world, at this + log sequence number. The transaction becomes 'durable' when + we write the log to disk, but in the logical sense the commit + in the file-based data structures (undo logs etc.) happens + here. + NOTE that transaction numbers, which are assigned only to transactions with an update undo log, do not necessarily come in exactly the same order as commit lsn's, if the transactions @@ -738,7 +727,9 @@ trx_commit_off_kernel( } ut_ad(trx->conc_state == TRX_ACTIVE); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ /* The following assignment makes the transaction committed in memory and makes its changes to data visible to other transactions. @@ -827,7 +818,7 @@ trx_commit_off_kernel( log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE); } else { - ut_a(0); + ut_error; } trx->commit_lsn = lsn; @@ -918,7 +909,9 @@ trx_handle_commit_sig_off_kernel( trx_sig_t* sig; trx_sig_t* next_sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ trx->que_state = TRX_QUE_COMMITTING; @@ -936,7 +929,7 @@ trx_handle_commit_sig_off_kernel( if (sig->type == TRX_SIG_COMMIT) { - trx_sig_reply(trx, sig, next_thr); + trx_sig_reply(sig, next_thr); trx_sig_remove(trx, sig); } @@ -958,7 +951,9 @@ trx_end_lock_wait( { que_thr_t* thr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->que_state == TRX_QUE_LOCK_WAIT); thr = UT_LIST_GET_FIRST(trx->wait_thrs); @@ -985,7 +980,9 @@ trx_lock_wait_to_suspended( { que_thr_t* thr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->que_state == TRX_QUE_LOCK_WAIT); thr = UT_LIST_GET_FIRST(trx->wait_thrs); @@ -1013,7 +1010,9 @@ trx_sig_reply_wait_to_suspended( trx_sig_t* sig; que_thr_t* thr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ sig = UT_LIST_GET_FIRST(trx->reply_signals); @@ -1025,7 +1024,6 @@ trx_sig_reply_wait_to_suspended( thr->state = QUE_THR_SUSPENDED; sig->receiver = NULL; - sig->reply = FALSE; UT_LIST_REMOVE(reply_signals, trx->reply_signals, sig); @@ -1047,7 +1045,9 @@ trx_sig_is_compatible( { trx_sig_t* sig; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (UT_LIST_GET_LEN(trx->signals) == 0) { @@ -1119,13 +1119,9 @@ trx_sig_send( ulint type, /* in: signal type */ ulint sender, /* in: TRX_SIG_SELF or TRX_SIG_OTHER_SESS */ - ibool reply, /* in: TRUE if the sender of the signal - wants reply after the operation induced - by the signal is completed; if type - is TRX_SIG_END_WAIT, this must be - FALSE */ que_thr_t* receiver_thr, /* in: query thread which wants the - reply, or NULL */ + reply, or NULL; if type is + TRX_SIG_END_WAIT, this must be NULL */ trx_savept_t* savept, /* in: possible rollback savepoint, or NULL */ que_thr_t** next_thr) /* in/out: next query thread to run; @@ -1139,16 +1135,16 @@ trx_sig_send( trx_t* receiver_trx; ut_ad(trx); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (!trx_sig_is_compatible(trx, type, sender)) { /* The signal is not compatible with the other signals in the queue: do nothing */ - ut_a(0); + ut_error; - /* sess_raise_error_low(trx, 0, 0, NULL, NULL, NULL, NULL, - "Incompatible signal"); */ return(FALSE); } @@ -1171,7 +1167,6 @@ trx_sig_send( sig->type = type; sig->state = TRX_SIG_WAITING; sig->sender = sender; - sig->reply = reply; sig->receiver = receiver_thr; if (savept) { @@ -1196,10 +1191,7 @@ trx_sig_send( signal to the end of the queue, if the session is not yet in the error state: */ - ut_a(0); - - sess_raise_error_low(trx, 0, 0, NULL, NULL, NULL, NULL, - (char *) "Signal from another session, or a break execution signal"); + ut_error; } /* If there were no other signals ahead in the queue, try to start @@ -1224,7 +1216,9 @@ trx_end_signal_handling( /*====================*/ trx_t* trx) /* in: trx */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ ut_ad(trx->handling_signals == TRUE); trx->handling_signals = FALSE; @@ -1258,7 +1252,9 @@ loop: we can process immediately */ ut_ad(trx); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ if (trx->handling_signals && (UT_LIST_GET_LEN(trx->signals) == 0)) { @@ -1333,7 +1329,7 @@ loop: } else if (type == TRX_SIG_BREAK_EXECUTION) { - trx_sig_reply(trx, sig, next_thr); + trx_sig_reply(sig, next_thr); trx_sig_remove(trx, sig); } else { ut_error; @@ -1349,7 +1345,6 @@ handled. */ void trx_sig_reply( /*==========*/ - trx_t* trx, /* in: trx handle */ trx_sig_t* sig, /* in: signal */ que_thr_t** next_thr) /* in/out: next query thread to run; if the value which is passed in is @@ -1359,11 +1354,12 @@ trx_sig_reply( { trx_t* receiver_trx; - ut_ad(trx && sig); + ut_ad(sig); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ - if (sig->reply && (sig->receiver != NULL)) { - + if (sig->receiver != NULL) { ut_ad((sig->receiver)->state == QUE_THR_SIG_REPLY_WAIT); receiver_trx = thr_get_trx(sig->receiver); @@ -1374,18 +1370,8 @@ trx_sig_reply( que_thr_end_wait(sig->receiver, next_thr); - sig->reply = FALSE; - sig->receiver = NULL; - - } else if (sig->reply) { - /* In this case the reply should be sent to the client of - the session of the transaction */ - - sig->reply = FALSE; sig->receiver = NULL; - sess_srv_msg_send_simple(trx->sess, SESS_SRV_SUCCESS, - SESS_NOT_RELEASE_KERNEL); } } @@ -1399,9 +1385,10 @@ trx_sig_remove( trx_sig_t* sig) /* in, own: signal */ { ut_ad(trx && sig); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ - ut_ad(sig->reply == FALSE); ut_ad(sig->receiver == NULL); UT_LIST_REMOVE(signals, trx->signals, sig); @@ -1463,8 +1450,7 @@ trx_commit_step( /* Send the commit signal to the transaction */ success = trx_sig_send(thr_get_trx(thr), TRX_SIG_COMMIT, - TRX_SIG_SELF, TRUE, thr, NULL, - &next_thr); + TRX_SIG_SELF, thr, NULL, &next_thr); mutex_exit(&kernel_mutex); @@ -1550,7 +1536,7 @@ trx_commit_complete_for_mysql( log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE); } else { - ut_a(0); + ut_error; } trx->op_info = (char*)""; diff --git a/innobase/trx/trx0undo.c b/innobase/trx/trx0undo.c index f3f93734a49..0a47134c163 100644 --- a/innobase/trx/trx0undo.c +++ b/innobase/trx/trx0undo.c @@ -391,7 +391,9 @@ trx_undo_seg_create( ibool success; ut_ad(mtr && id && rseg_hdr); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ /* if (type == TRX_UNDO_INSERT) { printf("Creating insert undo log segment\n"); @@ -431,7 +433,9 @@ trx_undo_seg_create( return(NULL); } +#ifdef UNIV_SYNC_DEBUG buf_page_dbg_add_level(undo_page, SYNC_TRX_UNDO_PAGE); +#endif /* UNIV_SYNC_DEBUG */ page_hdr = undo_page + TRX_UNDO_PAGE_HDR; seg_hdr = undo_page + TRX_UNDO_SEG_HDR; @@ -737,13 +741,14 @@ trx_undo_add_page( ulint n_reserved; ibool success; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); ut_ad(!mutex_own(&kernel_mutex)); + ut_ad(mutex_own(&(trx->rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ rseg = trx->rseg; - ut_ad(mutex_own(&(rseg->mutex))); - if (rseg->curr_size == rseg->max_size) { return(FIL_NULL); @@ -813,8 +818,10 @@ trx_undo_free_page( UT_NOT_USED(hdr_offset); ut_a(hdr_page_no != page_no); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ undo_page = trx_undo_page_get(space, page_no, mtr); @@ -861,7 +868,9 @@ trx_undo_free_page_in_rollback( ulint last_page_no; ut_ad(undo->hdr_page_no != page_no); +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); +#endif /* UNIV_SYNC_DEBUG */ last_page_no = trx_undo_free_page(undo->rseg, FALSE, undo->space, undo->hdr_page_no, undo->hdr_offset, @@ -915,12 +924,13 @@ trx_undo_truncate_end( trx_rseg_t* rseg; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); + ut_ad(mutex_own(&(trx->rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ rseg = trx->rseg; - ut_ad(mutex_own(&(rseg->mutex))); - for (;;) { mtr_start(&mtr); @@ -994,7 +1004,9 @@ trx_undo_truncate_start( ulint page_no; mtr_t mtr; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (0 == ut_dulint_cmp(limit, ut_dulint_zero)) { @@ -1060,8 +1072,9 @@ trx_undo_seg_free( while (!finished) { mtr_start(&mtr); - +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(rseg->mutex)); seg_header = trx_undo_page_get(undo->space, undo->hdr_page_no, @@ -1117,7 +1130,7 @@ trx_undo_mem_create_at_db_start( if (id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", (ulong) id); - ut_a(0); + ut_error; } undo_page = trx_undo_page_get(rseg->space, page_no, mtr); @@ -1134,8 +1147,7 @@ trx_undo_mem_create_at_db_start( undo_header = undo_page + offset; - trx_id = mtr_read_dulint(undo_header + TRX_UNDO_TRX_ID, MLOG_8BYTES, - mtr); + trx_id = mtr_read_dulint(undo_header + TRX_UNDO_TRX_ID, mtr); mutex_enter(&(rseg->mutex)); undo = trx_undo_mem_create(rseg, id, type, trx_id, page_no, offset); @@ -1145,8 +1157,7 @@ trx_undo_mem_create_at_db_start( undo->dict_operation = mtr_read_ulint( undo_header + TRX_UNDO_DICT_OPERATION, MLOG_2BYTES, mtr); - undo->table_id = mtr_read_dulint(undo_header + TRX_UNDO_TABLE_ID, - MLOG_8BYTES, mtr); + undo->table_id = mtr_read_dulint(undo_header + TRX_UNDO_TABLE_ID, mtr); undo->state = state; undo->size = flst_get_len(seg_header + TRX_UNDO_PAGE_LIST, mtr); @@ -1270,12 +1281,14 @@ trx_undo_mem_create( { trx_undo_t* undo; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", (ulong) id); - ut_a(0); + ut_error; } undo = mem_alloc(sizeof(trx_undo_t)); @@ -1314,14 +1327,16 @@ trx_undo_mem_init_for_reuse( is created */ ulint offset) /* in: undo log header byte offset on page */ { +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&((undo->rseg)->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", (ulong) undo->id); mem_analyze_corruption((byte*)undo); - ut_a(0); + ut_error; } undo->state = TRX_UNDO_ACTIVE; @@ -1345,7 +1360,7 @@ trx_undo_mem_free( if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", (ulong) undo->id); - ut_a(0); + ut_error; } mem_free(undo); @@ -1373,7 +1388,9 @@ trx_undo_create( trx_undo_t* undo; page_t* undo_page; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (rseg->curr_size == rseg->max_size) { @@ -1424,7 +1441,9 @@ trx_undo_reuse_cached( page_t* undo_page; ulint offset; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); +#endif /* UNIV_SYNC_DEBUG */ if (type == TRX_UNDO_INSERT) { @@ -1448,13 +1467,12 @@ trx_undo_reuse_cached( } ut_ad(undo->size == 1); - ut_ad(undo->hdr_page_no == undo->top_page_no); if (undo->id >= TRX_RSEG_N_SLOTS) { fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", (ulong) undo->id); mem_analyze_corruption((byte*)undo); - ut_a(0); + ut_error; } undo_page = trx_undo_page_get(undo->space, undo->hdr_page_no, mtr); @@ -1495,7 +1513,7 @@ trx_undo_mark_as_dict_operation( trx->dict_operation, MLOG_2BYTES, mtr); mlog_write_dulint(hdr_page + undo->hdr_offset + TRX_UNDO_TABLE_ID, - trx->table_id, MLOG_8BYTES, mtr); + trx->table_id, mtr); undo->dict_operation = trx->dict_operation; undo->table_id = trx->table_id; @@ -1522,11 +1540,15 @@ trx_undo_assign_undo( rseg = trx->rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(trx->undo_mutex))); +#endif /* UNIV_SYNC_DEBUG */ mtr_start(&mtr); +#ifdef UNIV_SYNC_DEBUG ut_ad(!mutex_own(&kernel_mutex)); +#endif /* UNIV_SYNC_DEBUG */ mutex_enter(&(rseg->mutex)); undo = trx_undo_reuse_cached(rseg, type, trx->id, &mtr); @@ -1587,7 +1609,7 @@ trx_undo_set_state_at_finish( fprintf(stderr, "InnoDB: Error: undo->id is %lu\n", (ulong) undo->id); mem_analyze_corruption((byte*)undo); - ut_a(0); + ut_error; } undo_page = trx_undo_page_get(undo->space, undo->hdr_page_no, mtr); @@ -1632,8 +1654,9 @@ trx_undo_update_cleanup( undo = trx->update_undo; rseg = trx->rseg; +#ifdef UNIV_SYNC_DEBUG ut_ad(mutex_own(&(rseg->mutex))); - +#endif /* UNIV_SYNC_DEBUG */ trx_purge_add_update_undo_to_history(trx, undo_page, mtr); UT_LIST_REMOVE(undo_list, rseg->update_undo_list, undo); @@ -1650,54 +1673,6 @@ trx_undo_update_cleanup( } } -/************************************************************************** -Discards an undo log and puts the segment to the list of cached update undo -log segments. This optimized function is called if there is no need to keep -the update undo log because there exist no read views and the transaction -made no delete markings, which would make purge necessary. We restrict this -to undo logs of size 1 to make things simpler. */ - -dulint -trx_undo_update_cleanup_by_discard( -/*===============================*/ - /* out: log sequence number at which mtr is - committed */ - trx_t* trx, /* in: trx owning the update undo log */ - mtr_t* mtr) /* in: mtr */ -{ - trx_rseg_t* rseg; - trx_undo_t* undo; - page_t* undo_page; - - undo = trx->update_undo; - rseg = trx->rseg; - - ut_ad(mutex_own(&(rseg->mutex))); - ut_ad(mutex_own(&kernel_mutex)); - ut_ad(undo->size == 1); - ut_ad(undo->del_marks == FALSE); - ut_ad(UT_LIST_GET_LEN(trx_sys->view_list) == 1); - - /* NOTE: we must hold the kernel mutex, because we must prevent - creation of new read views before mtr gets committed! */ - - undo_page = trx_undo_page_get(undo->space, undo->hdr_page_no, mtr); - - trx_undo_discard_latest_update_undo(undo_page, mtr); - - undo->state = TRX_UNDO_CACHED; - - UT_LIST_REMOVE(undo_list, rseg->update_undo_list, undo); - - trx->update_undo = NULL; - - UT_LIST_ADD_FIRST(undo_list, rseg->update_undo_cached, undo); - - mtr_commit(mtr); - - return(mtr->end_lsn); -} - /********************************************************************** Frees or caches an insert undo log after a transaction commit or rollback. Knowledge of inserts is not needed after a commit or rollback, therefore diff --git a/innobase/trx/ts/makefile b/innobase/trx/ts/makefile deleted file mode 100644 index 48e4befcb27..00000000000 --- a/innobase/trx/ts/makefile +++ /dev/null @@ -1,16 +0,0 @@ - - - -include ..\..\makefile.i - -tstrx: ..\trx.lib tstrx.c - $(CCOM) $(CFL) -I.. -I..\.. ..\trx.lib ..\..\pars.lib ..\..\que.lib ..\..\lock.lib ..\..\row.lib ..\..\read.lib ..\..\srv.lib ..\..\com.lib ..\..\usr.lib ..\..\thr.lib ..\..\btr.lib ..\..\fut.lib ..\..\fsp.lib ..\..\page.lib ..\..\dyn.lib ..\..\mtr.lib ..\..\log.lib ..\..\rem.lib ..\..\fil.lib ..\..\buf.lib ..\..\dict.lib ..\..\data.lib ..\..\mach.lib ..\..\ha.lib ..\..\ut.lib ..\..\sync.lib ..\..\mem.lib ..\..\os.lib tstrx.c $(LFL) - - - - - - - - - diff --git a/innobase/trx/ts/tstrx.c b/innobase/trx/ts/tstrx.c deleted file mode 100644 index f69c02dd51e..00000000000 --- a/innobase/trx/ts/tstrx.c +++ /dev/null @@ -1,1663 +0,0 @@ -/************************************************************************ -Test for the transaction system - -(c) 1994-1997 Innobase Oy - -Created 2/16/1996 Heikki Tuuri -*************************************************************************/ - -#include "sync0sync.h" -#include "ut0mem.h" -#include "mem0mem.h" -#include "data0data.h" -#include "data0type.h" -#include "dict0dict.h" -#include "buf0buf.h" -#include "os0file.h" -#include "fil0fil.h" -#include "fsp0fsp.h" -#include "rem0rec.h" -#include "rem0cmp.h" -#include "mtr0mtr.h" -#include "log0log.h" -#include "page0page.h" -#include "page0cur.h" -#include "trx0trx.h" -#include "dict0boot.h" -#include "trx0sys.h" -#include "dict0crea.h" -#include "btr0btr.h" -#include "btr0pcur.h" -#include "rem0rec.h" -#include "srv0srv.h" -#include "que0que.h" -#include "com0com.h" -#include "usr0sess.h" -#include "lock0lock.h" -#include "trx0roll.h" -#include "row0ins.h" -#include "row0upd.h" - -os_file_t files[1000]; - -mutex_t ios_mutex; -ulint ios; -ulint n[10]; - -mutex_t incs_mutex; -ulint incs; - -byte bigbuf[1000000]; - -#define N_SPACES 1 -#define N_FILES 1 -#define FILE_SIZE 1024 /* must be > 512 */ -#define POOL_SIZE 512 -#define COUNTER_OFFSET 1500 - -#define LOOP_SIZE 150 -#define N_THREADS 5 - - -ulint zero = 0; - -buf_block_t* bl_arr[POOL_SIZE]; - -/************************************************************************ -Io-handler thread function. */ - -ulint -handler_thread( -/*===========*/ - void* arg) -{ - ulint segment; - void* mess; - ulint i; - bool ret; - - segment = *((ulint*)arg); - - printf("Io handler thread %lu starts\n", segment); - - for (i = 0;; i++) { - ret = fil_aio_wait(segment, &mess); - ut_a(ret); - - buf_page_io_complete((buf_block_t*)mess); - - mutex_enter(&ios_mutex); - ios++; - mutex_exit(&ios_mutex); - - } - - return(0); -} - -/************************************************************************* -Creates the files for the file system test and inserts them to -the file system. */ - -void -create_files(void) -/*==============*/ -{ - bool ret; - ulint i, k; - char name[20]; - os_thread_t thr[5]; - os_thread_id_t id[5]; - - printf("--------------------------------------------------------\n"); - printf("Create or open database files\n"); - - strcpy(name, "tsfile00"); - - for (k = 0; k < N_SPACES; k++) { - for (i = 0; i < N_FILES; i++) { - - name[6] = (char)((ulint)'0' + k); - name[7] = (char)((ulint)'0' + i); - - files[i] = os_file_create(name, OS_FILE_CREATE, - OS_FILE_TABLESPACE, &ret); - - if (ret == FALSE) { - ut_a(os_file_get_last_error() == - OS_FILE_ALREADY_EXISTS); - - files[i] = os_file_create( - name, OS_FILE_OPEN, - OS_FILE_TABLESPACE, &ret); - - ut_a(ret); - } else { - ut_a(os_file_set_size(files[i], 8192 * FILE_SIZE, 0)); - } - - ret = os_file_close(files[i]); - ut_a(ret); - - if (i == 0) { - fil_space_create(name, k, OS_FILE_TABLESPACE); - } - - ut_a(fil_validate()); - - fil_node_create(name, FILE_SIZE, k); - } - } - - ios = 0; - - mutex_create(&ios_mutex); - - for (i = 0; i < 5; i++) { - n[i] = i; - - thr[i] = os_thread_create(handler_thread, n + i, id + i); - } -} - -/************************************************************************ -Inits space header of space 0. */ - -void -init_space(void) -/*============*/ -{ - mtr_t mtr; - - printf("Init space header\n"); - - mtr_start(&mtr); - - fsp_header_init(0, FILE_SIZE * N_FILES, &mtr); - - mtr_commit(&mtr); -} - -/********************************************************************* -Test for table creation. */ - -ulint -test1( -/*==*/ - void* arg) -{ - sess_t* sess; - com_endpoint_t* com_endpoint; - mem_heap_t* heap; - dict_index_t* index; - dict_table_t* table; - que_fork_t* fork; - que_thr_t* thr; - trx_t* trx; - - UT_NOT_USED(arg); - - printf("-------------------------------------------------\n"); - printf("TEST 1. CREATE TABLE WITH 3 COLUMNS AND WITH 3 INDEXES\n"); - - heap = mem_heap_create(512); - - com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL - value */ - mutex_enter(&kernel_mutex); - - sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); - - trx = sess->trx; - - mutex_exit(&kernel_mutex); - - ut_a(trx_start(trx, ULINT_UNDEFINED)); - - table = dict_mem_table_create("TS_TABLE1", 0, 3); - - dict_mem_table_add_col(table, "COL1", DATA_VARCHAR, - DATA_ENGLISH, 10, 0); - dict_mem_table_add_col(table, "COL2", DATA_VARCHAR, - DATA_ENGLISH, 10, 0); - dict_mem_table_add_col(table, "COL3", DATA_VARCHAR, - DATA_ENGLISH, 100, 0); - /*------------------------------------*/ - /* CREATE TABLE */ - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = tab_create_graph_create(fork, thr, table, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - -/* dict_table_print_by_name("SYS_TABLES"); - dict_table_print_by_name("SYS_COLUMNS"); */ - /*-------------------------------------*/ - /* CREATE CLUSTERED INDEX */ - - index = dict_mem_index_create("TS_TABLE1", "IND1", 0, DICT_CLUSTERED, - 2); - dict_mem_index_add_field(index, "COL1", 0); - dict_mem_index_add_field(index, "COL2", 0); - - ut_a(mem_heap_validate(index->heap)); - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = ind_create_graph_create(fork, thr, index, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - -/* dict_table_print_by_name("SYS_INDEXES"); - dict_table_print_by_name("SYS_FIELDS"); */ - - /*-------------------------------------*/ - /* CREATE SECONDARY INDEX */ - - index = dict_mem_index_create("TS_TABLE1", "IND2", 0, 0, 2); - - dict_mem_index_add_field(index, "COL2", 0); - dict_mem_index_add_field(index, "COL1", 0); - - ut_a(mem_heap_validate(index->heap)); - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = ind_create_graph_create(fork, thr, index, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - -/* dict_table_print_by_name("SYS_INDEXES"); - dict_table_print_by_name("SYS_FIELDS"); */ - - /*-------------------------------------*/ - /* CREATE ANOTHER SECONDARY INDEX */ - - index = dict_mem_index_create("TS_TABLE1", "IND3", 0, 0, 2); - - dict_mem_index_add_field(index, "COL2", 0); - dict_mem_index_add_field(index, "COL1", 0); - - ut_a(mem_heap_validate(index->heap)); - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = ind_create_graph_create(fork, thr, index, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - -/* dict_table_print_by_name("SYS_INDEXES"); - dict_table_print_by_name("SYS_FIELDS"); */ - - return(0); -} - -/********************************************************************* -Another test for table creation. */ - -ulint -test1_5( -/*====*/ - void* arg) -{ - sess_t* sess; - com_endpoint_t* com_endpoint; - mem_heap_t* heap; - dict_index_t* index; - dict_table_t* table; - que_fork_t* fork; - que_thr_t* thr; - trx_t* trx; - - UT_NOT_USED(arg); - - printf("-------------------------------------------------\n"); - printf("TEST 1.5. CREATE TABLE WITH 3 COLUMNS AND WITH 1 INDEX\n"); - - heap = mem_heap_create(512); - - com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL - value */ - mutex_enter(&kernel_mutex); - - sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); - - trx = sess->trx; - - mutex_exit(&kernel_mutex); - - ut_a(trx_start(trx, ULINT_UNDEFINED)); - - table = dict_mem_table_create("TS_TABLE2", 0, 3); - - dict_mem_table_add_col(table, "COL1", DATA_VARCHAR, - DATA_ENGLISH, 10, 0); - dict_mem_table_add_col(table, "COL2", DATA_VARCHAR, - DATA_ENGLISH, 10, 0); - dict_mem_table_add_col(table, "COL3", DATA_VARCHAR, - DATA_ENGLISH, 100, 0); - /*------------------------------------*/ - /* CREATE TABLE */ - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = tab_create_graph_create(fork, thr, table, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - -/* dict_table_print_by_name("SYS_TABLES"); - dict_table_print_by_name("SYS_COLUMNS"); */ - /*-------------------------------------*/ - /* CREATE CLUSTERED INDEX */ - - index = dict_mem_index_create("TS_TABLE2", "IND1", 0, DICT_CLUSTERED, - 2); - dict_mem_index_add_field(index, "COL1", 0); - dict_mem_index_add_field(index, "COL2", 0); - - ut_a(mem_heap_validate(index->heap)); - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = ind_create_graph_create(fork, thr, index, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - -/* dict_table_print_by_name("SYS_INDEXES"); - dict_table_print_by_name("SYS_FIELDS"); */ - - return(0); -} - -/********************************************************************* -Another test for table creation. */ - -ulint -test1_6( -/*====*/ - void* arg) -{ - sess_t* sess; - com_endpoint_t* com_endpoint; - mem_heap_t* heap; - dict_index_t* index; - dict_table_t* table; - que_fork_t* fork; - que_thr_t* thr; - trx_t* trx; - - UT_NOT_USED(arg); - - printf("-------------------------------------------------\n"); - printf("TEST 1.5. CREATE TABLE WITH 3 COLUMNS AND WITH 1 INDEX\n"); - - heap = mem_heap_create(512); - - com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL - value */ - mutex_enter(&kernel_mutex); - - sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); - - trx = sess->trx; - - mutex_exit(&kernel_mutex); - - ut_a(trx_start(trx, ULINT_UNDEFINED)); - - table = dict_mem_table_create("TS_TABLE3", 0, 3); - - dict_mem_table_add_col(table, "COL1", DATA_VARCHAR, - DATA_ENGLISH, 10, 0); - dict_mem_table_add_col(table, "COL2", DATA_VARCHAR, - DATA_ENGLISH, 10, 0); - dict_mem_table_add_col(table, "COL3", DATA_VARCHAR, - DATA_ENGLISH, 100, 0); - /*------------------------------------*/ - /* CREATE TABLE */ - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = tab_create_graph_create(fork, thr, table, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - -/* dict_table_print_by_name("SYS_TABLES"); - dict_table_print_by_name("SYS_COLUMNS"); */ - /*-------------------------------------*/ - /* CREATE CLUSTERED INDEX */ - - index = dict_mem_index_create("TS_TABLE3", "IND1", 0, DICT_CLUSTERED, - 2); - dict_mem_index_add_field(index, "COL1", 0); - dict_mem_index_add_field(index, "COL2", 0); - - ut_a(mem_heap_validate(index->heap)); - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = ind_create_graph_create(fork, thr, index, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - -/* dict_table_print_by_name("SYS_INDEXES"); - dict_table_print_by_name("SYS_FIELDS"); */ - - return(0); -} - -/********************************************************************* -Test for inserts. */ - -ulint -test2( -/*==*/ - void* arg) -{ - ulint tm, oldtm; - sess_t* sess; - com_endpoint_t* com_endpoint; - mem_heap_t* heap; - que_fork_t* fork; - dict_table_t* table; - que_thr_t* thr; - trx_t* trx; - ulint i; - ulint rnd; - dtuple_t* row; - byte buf[100]; - ulint count = 0; - ins_node_t* node; - - printf("-------------------------------------------------\n"); - printf("TEST 2. MASSIVE INSERT\n"); - - heap = mem_heap_create(512); - - com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL - value */ - mutex_enter(&kernel_mutex); - - sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); - - trx = sess->trx; - - mutex_exit(&kernel_mutex); -loop: - ut_a(trx_start(trx, ULINT_UNDEFINED)); - - /*-------------------------------------*/ - /* MASSIVE INSERT */ - fork = que_fork_create(NULL, NULL, QUE_FORK_INSERT, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - table = dict_table_get("TS_TABLE1", trx); - - row = dtuple_create(heap, 3 + DATA_N_SYS_COLS); - - dict_table_copy_types(row, table); - - node = ins_node_create(fork, thr, row, table, heap); - - thr->child = node; - - row_ins_init_sys_fields_at_sql_compile(node->row, node->table, heap); - row_ins_init_sys_fields_at_sql_prepare(node->row, node->table, trx); - - node->init_all_sys_fields = FALSE; - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - mutex_exit(&kernel_mutex); - - rnd = 0; - - mem_print_info(); - - oldtm = ut_clock(); - - for (i = 0; i < *((ulint*)arg); i++) { - - rnd = (rnd + 1) % 200000; - - dtuple_gen_test_tuple3(row, rnd, DTUPLE_TEST_FIXED30, buf); - - mutex_enter(&kernel_mutex); - - ut_a( - thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - } - - tm = ut_clock(); - printf("Wall time for %lu inserts %lu milliseconds\n", i, tm - oldtm); - - mem_print_info(); - -/* dict_table_print_by_name("TS_TABLE1"); */ - /*-------------------------------------*/ - /* ROLLBACK */ -#ifdef notdefined - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = roll_node_create(fork, thr, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - oldtm = ut_clock(); - - que_run_threads(thr); - - tm = ut_clock(); - printf("Wall time for rollback of %lu inserts %lu milliseconds\n", - i, tm - oldtm); - /*-------------------------------------*/ -#endif - /* COMMIT */ - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = commit_node_create(fork, thr, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - oldtm = ut_clock(); - - que_run_threads(thr); - - tm = ut_clock(); - printf("Wall time for commit %lu milliseconds\n", tm - oldtm); - - /*-------------------------------------*/ - count++; - - if (count < 1) { - goto loop; - } - return(0); -} - -/********************************************************************* -Test for updates. */ - -ulint -test3( -/*==*/ - void* arg) -{ - ulint tm, oldtm; - sess_t* sess; - com_endpoint_t* com_endpoint; - mem_heap_t* heap; - que_fork_t* fork; - dict_table_t* table; - que_thr_t* thr; - trx_t* trx; - ulint i; - ulint rnd; - dtuple_t* row; - dtuple_t* entry; - byte buf[100]; - ulint count = 0; - btr_pcur_t pcur; - upd_t* update; - upd_field_t* ufield; - dict_tree_t* tree; - dict_index_t* index; - mtr_t mtr; - upd_node_t* node; - byte* ptr; - ulint len; - ulint err; - - UT_NOT_USED(arg); - - printf("-------------------------------------------------\n"); - printf("TEST 3. UPDATES\n"); - - heap = mem_heap_create(512); - - com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL - value */ - mutex_enter(&kernel_mutex); - - sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); - - trx = sess->trx; - - mutex_exit(&kernel_mutex); -loop: - ut_a(trx_start(trx, ULINT_UNDEFINED)); - - /*-------------------------------------*/ - /* INSERT */ - fork = que_fork_create(NULL, NULL, QUE_FORK_INSERT, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - table = dict_table_get("TS_TABLE1", trx); - - row = dtuple_create(heap, 3 + DATA_N_SYS_COLS); - - dict_table_copy_types(row, table); - - thr->child = ins_node_create(fork, thr, row, table, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - mutex_exit(&kernel_mutex); - - rnd = 0; - - oldtm = ut_clock(); - - for (i = 0; i < 3; i++) { - - dtuple_gen_test_tuple3(row, i, DTUPLE_TEST_FIXED30, buf); - - mutex_enter(&kernel_mutex); - - ut_a( - thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - } - - tm = ut_clock(); - printf("Wall time for %lu inserts %lu milliseconds\n", i, tm - oldtm); - - /*-------------------------------------*/ - /* COMMIT */ - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = commit_node_create(fork, thr, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - oldtm = ut_clock(); - - que_run_threads(thr); - - tm = ut_clock(); - printf("Wall time for commit %lu milliseconds\n", tm - oldtm); - - dict_table_print_by_name("TS_TABLE1"); - /*-------------------------------------*/ - /* UPDATE ROWS */ - ut_a(trx_start(trx, ULINT_UNDEFINED)); - - fork = que_fork_create(NULL, NULL, QUE_FORK_UPDATE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - table = dict_table_get("TS_TABLE1", trx); - - row = dtuple_create(heap, 3 + DATA_N_SYS_COLS); - - dict_table_copy_types(row, table); - - update = upd_create(1, heap); - - node = upd_node_create(fork, thr, table, &pcur, update, heap); - thr->child = node; - - node->cmpl_info = 0; - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - mutex_exit(&kernel_mutex); - - dtuple_gen_test_tuple3(row, 1, DTUPLE_TEST_FIXED30, buf); - entry = dtuple_create(heap, 2); - dfield_copy(dtuple_get_nth_field(entry, 0), - dtuple_get_nth_field(row, 0)); - dfield_copy(dtuple_get_nth_field(entry, 1), - dtuple_get_nth_field(row, 1)); - - index = dict_table_get_first_index(table); - tree = dict_index_get_tree(index); - - btr_pcur_set_mtr(&pcur, &mtr); - - mtr_start(&mtr); - - btr_pcur_open(tree, entry, PAGE_CUR_G, BTR_SEARCH_LEAF, &pcur, &mtr); - - btr_pcur_store_position(&pcur, &mtr); - - err = lock_clust_rec_read_check_and_lock(0, btr_pcur_get_rec(&pcur), - index, LOCK_X, thr); - ut_a(err == DB_SUCCESS); - - btr_pcur_commit(&pcur); - - ufield = upd_get_nth_field(update, 0); - - ufield->col_no = 2; - dfield_set_data(&(ufield->new_val), "updated field", 14); - - mutex_enter(&kernel_mutex); - - ut_a( - thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - - mtr_start(&mtr); - - ut_a(btr_pcur_restore_position(BTR_SEARCH_LEAF, &pcur, &mtr)); - - ptr = rec_get_nth_field(btr_pcur_get_rec(&pcur), 5, &len); - - ut_a(ut_memcmp(ptr, "updated field", 14) == 0); - - btr_pcur_commit(&pcur); - - dict_table_print_by_name("TS_TABLE1"); - - ufield = upd_get_nth_field(update, 0); - - ufield->col_no = 0; - dfield_set_data(&(ufield->new_val), "31415926", 9); - - mutex_enter(&kernel_mutex); - - ut_a( - thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - - dict_table_print_by_name("TS_TABLE1"); - /*-------------------------------------*/ - /* ROLLBACK */ -#ifdef notdefined - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = roll_node_create(fork, thr, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - oldtm = ut_clock(); - - que_run_threads(thr); - - tm = ut_clock(); - printf("Wall time for rollback of %lu updates %lu milliseconds\n", - i, tm - oldtm); - /*-------------------------------------*/ - /* COMMIT */ - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = commit_node_create(fork, thr, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - oldtm = ut_clock(); - - que_run_threads(thr); - - tm = ut_clock(); - printf("Wall time for commit %lu milliseconds\n", tm - oldtm); - - /*-------------------------------------*/ -#endif - dict_table_print_by_name("TS_TABLE1"); - count++; - - if (count < 1) { - goto loop; - } - return(0); -} - -/********************************************************************* -Test for massive updates. */ - -ulint -test4( -/*==*/ - void* arg) -{ - ulint tm, oldtm; - sess_t* sess; - com_endpoint_t* com_endpoint; - mem_heap_t* heap; - que_fork_t* fork; - dict_table_t* table; - que_thr_t* thr; - trx_t* trx; - ulint i; - ulint j; - ulint rnd; - dtuple_t* row; - dtuple_t* entry; - byte buf[100]; - ulint count = 0; - btr_pcur_t pcur; - upd_t* update; - upd_field_t* ufield; - dict_tree_t* tree; - dict_index_t* index; - mtr_t mtr; - upd_node_t* node; - byte* ptr; - ulint len; - ulint err; - - printf("-------------------------------------------------\n"); - printf("TEST 4. MASSIVE UPDATES\n"); - - heap = mem_heap_create(512); - - com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL - value */ - mutex_enter(&kernel_mutex); - - sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); - - trx = sess->trx; - - mutex_exit(&kernel_mutex); -loop: - ut_a(trx_start(trx, ULINT_UNDEFINED)); - - /*-------------------------------------*/ - /* INSERT */ - fork = que_fork_create(NULL, NULL, QUE_FORK_INSERT, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - table = dict_table_get("TS_TABLE1", trx); - - row = dtuple_create(heap, 3 + DATA_N_SYS_COLS); - - dict_table_copy_types(row, table); - - thr->child = ins_node_create(fork, thr, row, table, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - mutex_exit(&kernel_mutex); - - rnd = 0; - - oldtm = ut_clock(); - - for (i = 0; i < *((ulint*)arg); i++) { - - dtuple_gen_test_tuple3(row, i, DTUPLE_TEST_FIXED30, buf); - - mutex_enter(&kernel_mutex); - - ut_a( - thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - } - - tm = ut_clock(); - printf("Wall time for %lu inserts %lu milliseconds\n", i, tm - oldtm); - -#ifdef notdefined - /*-------------------------------------*/ - /* COMMIT */ - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = commit_node_create(fork, thr, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - oldtm = ut_clock(); - - que_run_threads(thr); - - tm = ut_clock(); - printf("Wall time for commit %lu milliseconds\n", tm - oldtm); - - dict_table_print_by_name("TS_TABLE1"); - /*-------------------------------------*/ - /* UPDATE ROWS */ - ut_a(trx_start(trx, ULINT_UNDEFINED)); -#endif - fork = que_fork_create(NULL, NULL, QUE_FORK_UPDATE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - table = dict_table_get("TS_TABLE1", trx); - - row = dtuple_create(heap, 3 + DATA_N_SYS_COLS); - - dict_table_copy_types(row, table); - - update = upd_create(1, heap); - - node = upd_node_create(fork, thr, table, &pcur, update, heap); - thr->child = node; - - node->cmpl_info = 0; - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - mutex_exit(&kernel_mutex); - - for (j = 0; j < 2; j++) { - for (i = 0; i < *((ulint*)arg); i++) { - - dtuple_gen_test_tuple3(row, i, DTUPLE_TEST_FIXED30, buf); - entry = dtuple_create(heap, 2); - dfield_copy(dtuple_get_nth_field(entry, 0), - dtuple_get_nth_field(row, 0)); - dfield_copy(dtuple_get_nth_field(entry, 1), - dtuple_get_nth_field(row, 1)); - - index = dict_table_get_first_index(table); - tree = dict_index_get_tree(index); - - btr_pcur_set_mtr(&pcur, &mtr); - - mtr_start(&mtr); - - btr_pcur_open(tree, entry, PAGE_CUR_G, BTR_SEARCH_LEAF, &pcur, &mtr); - - btr_pcur_store_position(&pcur, &mtr); - - err = lock_clust_rec_read_check_and_lock(0, btr_pcur_get_rec(&pcur), - index, LOCK_X, thr); - ut_a(err == DB_SUCCESS); - - btr_pcur_commit(&pcur); - - ufield = upd_get_nth_field(update, 0); - - ufield->col_no = 2; - dfield_set_data(&(ufield->new_val), "updated field", 14); - - mutex_enter(&kernel_mutex); - - ut_a( - thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - - } /* for (i = ... */ - } - mtr_start(&mtr); - - ut_a(btr_pcur_restore_position(BTR_SEARCH_LEAF, &pcur, &mtr)); - - ptr = rec_get_nth_field(btr_pcur_get_rec(&pcur), 5, &len); - - ut_a(ut_memcmp(ptr, "updated field", 14) == 0); - - btr_pcur_commit(&pcur); - - dict_table_print_by_name("TS_TABLE1"); - - ufield = upd_get_nth_field(update, 0); - - ufield->col_no = 0; - dfield_set_data(&(ufield->new_val), "31415926", 9); - - mutex_enter(&kernel_mutex); - - ut_a( - thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - - dict_table_print_by_name("TS_TABLE1"); - /*-------------------------------------*/ - /* ROLLBACK */ - - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = roll_node_create(fork, thr, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - oldtm = ut_clock(); - - que_run_threads(thr); - - tm = ut_clock(); - printf("Wall time for rollback of %lu updates %lu milliseconds\n", - i, tm - oldtm); -#ifdef notdefined - /*-------------------------------------*/ - /* COMMIT */ - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = commit_node_create(fork, thr, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - oldtm = ut_clock(); - - que_run_threads(thr); - - tm = ut_clock(); - printf("Wall time for commit %lu milliseconds\n", tm - oldtm); - - /*-------------------------------------*/ -#endif - dict_table_print_by_name("TS_TABLE1"); - count++; - - if (count < 1) { - goto loop; - } - return(0); -} - -/********************************************************************* -Init TS_TABLE2 for TPC-A transaction. */ - -ulint -test4_5( -/*====*/ - void* arg) -{ - sess_t* sess; - com_endpoint_t* com_endpoint; - mem_heap_t* heap; - que_fork_t* fork; - dict_table_t* table; - que_thr_t* thr; - trx_t* trx; - ulint i; - dtuple_t* row; - byte buf[100]; - - arg = arg; - - printf("-------------------------------------------------\n"); - printf("TEST 4_5. INIT FOR TPC-A\n"); - - heap = mem_heap_create(512); - - com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL - value */ - mutex_enter(&kernel_mutex); - - sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); - - trx = sess->trx; - - mutex_exit(&kernel_mutex); - - ut_a(trx_start(trx, ULINT_UNDEFINED)); - - /*-------------------------------------*/ - /* INSERT INTO TABLE TO UPDATE */ - - for (i = 0; i < 100; i++) { - fork = que_fork_create(NULL, NULL, QUE_FORK_INSERT, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - table = dict_table_get("TS_TABLE2", trx); - - row = dtuple_create(heap, 3 + DATA_N_SYS_COLS); - - dict_table_copy_types(row, table); - - thr->child = ins_node_create(fork, thr, row, table, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - mutex_exit(&kernel_mutex); - - dtuple_gen_test_tuple3(row, i, DTUPLE_TEST_FIXED30, buf); - - mutex_enter(&kernel_mutex); - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - - } -/* dict_table_print_by_name("TS_TABLE2"); */ - - /*-------------------------------------*/ - /* COMMIT */ - fork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - fork->trx = trx; - - thr = que_thr_create(fork, fork, heap); - - thr->child = commit_node_create(fork, thr, heap); - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork, trx->sess); - - trx->graph = fork; - - ut_a(thr == que_fork_start_command(fork, SESS_COMM_EXECUTE, 0)); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - - /*-----------------------------------*/ - - return(0); -} - -/********************************************************************* -Test for TPC-A transaction. */ - -ulint -test5( -/*==*/ - void* arg) -{ - ulint tm, oldtm; - sess_t* sess; - com_endpoint_t* com_endpoint; - mem_heap_t* heap; - que_fork_t* fork1; - que_fork_t* fork2; - que_fork_t* cfork; - dict_table_t* table; - dict_table_t* table2; - que_thr_t* thr; - trx_t* trx; - ulint i; - dtuple_t* row; - dtuple_t* entry; - byte buf[100]; - ulint count = 0; - btr_pcur_t pcur; - upd_t* update; - upd_field_t* ufield; - dict_tree_t* tree; - dict_index_t* index; - mtr_t mtr; - upd_node_t* node; - ulint err; - ins_node_t* inode; - - arg = arg; - - printf("-------------------------------------------------\n"); - printf("TEST 5. TPC-A %lu \n", *((ulint*)arg)); - - oldtm = ut_clock(); - - heap = mem_heap_create(512); - - com_endpoint = (com_endpoint_t*)heap; /* This is a dummy non-NULL - value */ - mutex_enter(&kernel_mutex); - - sess = sess_open(ut_dulint_zero, com_endpoint, (byte*)"user1", 6); - - trx = sess->trx; - - mutex_exit(&kernel_mutex); - - ut_a(trx_start(trx, ULINT_UNDEFINED)); - /*-----------------------------------*/ - - fork1 = que_fork_create(NULL, NULL, QUE_FORK_INSERT, heap); - fork1->trx = trx; - - thr = que_thr_create(fork1, fork1, heap); - - table = dict_table_get("TS_TABLE3", trx); - - row = dtuple_create(heap, 3 + DATA_N_SYS_COLS); - - dict_table_copy_types(row, table); - - inode = ins_node_create(fork1, thr, row, table, heap); - - thr->child = inode; - - row_ins_init_sys_fields_at_sql_compile(inode->row, inode->table, heap); - row_ins_init_sys_fields_at_sql_prepare(inode->row, inode->table, trx); - - inode->init_all_sys_fields = FALSE; - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork1, trx->sess); - - trx->graph = fork1; - - mutex_exit(&kernel_mutex); - - fork2 = que_fork_create(NULL, NULL, QUE_FORK_UPDATE, heap); - fork2->trx = trx; - - thr = que_thr_create(fork2, fork2, heap); - - table2 = dict_table_get("TS_TABLE2", trx); - - update = upd_create(1, heap); - - entry = dtuple_create(heap, 2); - dfield_copy(dtuple_get_nth_field(entry, 0), - dtuple_get_nth_field(row, 0)); - dfield_copy(dtuple_get_nth_field(entry, 1), - dtuple_get_nth_field(row, 1)); - - node = upd_node_create(fork2, thr, table2, &pcur, update, heap); - thr->child = node; - - node->cmpl_info = UPD_NODE_NO_ORD_CHANGE | UPD_NODE_NO_SIZE_CHANGE; - - mutex_enter(&kernel_mutex); - - que_graph_publish(fork2, trx->sess); - - trx->graph = fork2; - - mutex_exit(&kernel_mutex); - - cfork = que_fork_create(NULL, NULL, QUE_FORK_EXECUTE, heap); - cfork->trx = trx; - - thr = que_thr_create(cfork, cfork, heap); - - thr->child = commit_node_create(cfork, thr, heap); - - oldtm = ut_clock(); -loop: - /*-------------------------------------*/ - /* INSERT */ - -/* printf("Trx %lu %lu starts, thr %lu\n", - ut_dulint_get_low(trx->id), - (ulint)trx, - *((ulint*)arg)); */ - - dtuple_gen_test_tuple3(row, count, DTUPLE_TEST_FIXED30, buf); - - mutex_enter(&kernel_mutex); - - thr = que_fork_start_command(fork1, SESS_COMM_EXECUTE, 0); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - - /*-------------------------------------*/ - /* 3 UPDATES */ - - for (i = 0; i < 3; i++) { - - dtuple_gen_search_tuple3(entry, *((ulint*)arg), buf); - - index = dict_table_get_first_index(table2); - tree = dict_index_get_tree(index); - - btr_pcur_set_mtr(&pcur, &mtr); - - mtr_start(&mtr); - - btr_pcur_open(tree, entry, PAGE_CUR_G, BTR_MODIFY_LEAF, &pcur, &mtr); - -/* btr_pcur_store_position(&pcur, &mtr); */ - - err = lock_clust_rec_read_check_and_lock(0, btr_pcur_get_rec(&pcur), - index, LOCK_X, thr); - ut_a(err == DB_SUCCESS); - - ufield = upd_get_nth_field(update, 0); - - ufield->col_no = 2; - dfield_set_data(&(ufield->new_val), - "updated field1234567890123456", 30); - - mutex_enter(&kernel_mutex); - - thr = que_fork_start_command(fork2, SESS_COMM_EXECUTE, 0); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - - } /* for (i = ... */ - - /*-------------------------------------*/ - /* COMMIT */ -#ifdef notdefined - mutex_enter(&kernel_mutex); - - thr = que_fork_start_command(cfork, SESS_COMM_EXECUTE, 0); - - mutex_exit(&kernel_mutex); - - que_run_threads(thr); - -/* printf("Trx %lu %lu committed\n", ut_dulint_get_low(trx->id), - (ulint)trx); */ -#endif - count++; - - if (count < 1000) { - ut_a(trx_start(trx, ULINT_UNDEFINED)); - - goto loop; - } - - tm = ut_clock(); - printf("Wall time for TPC-A %lu trxs %lu milliseconds\n", - count, tm - oldtm); - - /*-------------------------------------*/ -/* dict_table_print_by_name("TS_TABLE2"); - dict_table_print_by_name("TS_TABLE3"); */ - - return(0); -} - -/******************************************************************** -Main test function. */ - -void -main(void) -/*======*/ -{ - ulint tm, oldtm; - os_thread_id_t id[5]; - ulint n1000[5]; - ulint i; - ulint n5000 = 500; - - srv_boot("initfile"); - os_aio_init(160, 5); - fil_init(25); - buf_pool_init(POOL_SIZE, POOL_SIZE); - fsp_init(); - log_init(); - - create_files(); - init_space(); - - sess_sys_init_at_db_start(); - - trx_sys_create(); - - lock_sys_create(1024); - - dict_create(); - - oldtm = ut_clock(); - - ut_rnd_set_seed(19); - - test1(NULL); - test1_5(NULL); - test1_6(NULL); - test4_5(NULL); - - for (i = 1; i < 5; i++) { - n1000[i] = i; - id[i] = id[i]; -/* os_thread_create(test5, n1000 + i, id + i); */ - } - -/* mem_print_info(); */ - -/* test2(&n5000); */ - - n5000 = 30; - - test5(&n5000); - - n5000 = 30; -/* test5(&n5000); */ - -/* mem_print_info(); */ - -/* dict_table_print_by_name("TS_TABLE1"); */ - - tm = ut_clock(); - printf("Wall time for test %lu milliseconds\n", tm - oldtm); - printf("TESTS COMPLETED SUCCESSFULLY!\n"); -} diff --git a/innobase/trx/ts/tsttrxold.c b/innobase/trx/ts/tsttrxold.c deleted file mode 100644 index 13faa7ac79f..00000000000 --- a/innobase/trx/ts/tsttrxold.c +++ /dev/null @@ -1,1089 +0,0 @@ -/************************************************************************ -Test for the transaction system - -(c) 1994-1997 Innobase Oy - -Created 2/16/1996 Heikki Tuuri -*************************************************************************/ - -#include "sync0sync.h" -#include "ut0mem.h" -#include "mem0mem.h" -#include "data0data.h" -#include "data0type.h" -#include "dict0dict.h" -#include "buf0buf.h" -#include "os0file.h" -#include "fil0fil.h" -#include "fsp0fsp.h" -#include "rem0rec.h" -#include "rem0cmp.h" -#include "mtr0mtr.h" -#include "log0log.h" -#include "page0page.h" -#include "page0cur.h" -#include "trx0trx.h" -#include "dict0boot.h" -#include "trx0sys.h" -#include "dict0crea.h" -#include "btr0btr.h" -#include "btr0pcur.h" -#include "rem0rec.h" - -os_file_t files[1000]; - -mutex_t ios_mutex; -ulint ios; -ulint n[10]; - -mutex_t incs_mutex; -ulint incs; - -byte bigbuf[1000000]; - -#define N_SPACES 1 -#define N_FILES 1 -#define FILE_SIZE 4000 /* must be > 512 */ -#define POOL_SIZE 1000 -#define COUNTER_OFFSET 1500 - -#define LOOP_SIZE 150 -#define N_THREADS 5 - - -ulint zero = 0; - -buf_block_t* bl_arr[POOL_SIZE]; - -/************************************************************************ -Io-handler thread function. */ - -ulint -handler_thread( -/*===========*/ - void* arg) -{ - ulint segment; - void* mess; - ulint i; - bool ret; - - segment = *((ulint*)arg); - - printf("Io handler thread %lu starts\n", segment); - - for (i = 0;; i++) { - ret = fil_aio_wait(segment, &mess); - ut_a(ret); - - buf_page_io_complete((buf_block_t*)mess); - - mutex_enter(&ios_mutex); - ios++; - mutex_exit(&ios_mutex); - - } - - return(0); -} - -/************************************************************************* -Creates the files for the file system test and inserts them to -the file system. */ - -void -create_files(void) -/*==============*/ -{ - bool ret; - ulint i, k; - char name[20]; - os_thread_t thr[5]; - os_thread_id_t id[5]; - - printf("--------------------------------------------------------\n"); - printf("Create or open database files\n"); - - strcpy(name, "tsfile00"); - - for (k = 0; k < N_SPACES; k++) { - for (i = 0; i < N_FILES; i++) { - - name[6] = (char)((ulint)'0' + k); - name[7] = (char)((ulint)'0' + i); - - files[i] = os_file_create(name, OS_FILE_CREATE, - OS_FILE_TABLESPACE, &ret); - - if (ret == FALSE) { - ut_a(os_file_get_last_error() == - OS_FILE_ALREADY_EXISTS); - - files[i] = os_file_create( - name, OS_FILE_OPEN, - OS_FILE_TABLESPACE, &ret); - - ut_a(ret); - } - - ret = os_file_close(files[i]); - ut_a(ret); - - if (i == 0) { - fil_space_create(name, k, OS_FILE_TABLESPACE); - } - - ut_a(fil_validate()); - - fil_node_create(name, FILE_SIZE, k); - } - } - - ios = 0; - - mutex_create(&ios_mutex); - - for (i = 0; i < 5; i++) { - n[i] = i; - - thr[i] = os_thread_create(handler_thread, n + i, id + i); - } -} - -/************************************************************************ -Inits space header of space 0. */ - -void -init_space(void) -/*============*/ -{ - mtr_t mtr; - - printf("Init space header\n"); - - mtr_start(&mtr); - - fsp_header_init(0, FILE_SIZE * N_FILES, &mtr); - - mtr_commit(&mtr); -} - -#ifdef notdefined - -/********************************************************************* -Test for index page. */ - -void -test1(void) -/*=======*/ -{ - dtuple_t* tuple; - mem_heap_t* heap; - mem_heap_t* heap2; - ulint rnd = 0; - dict_index_t* index; - dict_table_t* table; - byte buf[16]; - ulint i, j; - ulint tm, oldtm; - trx_t* trx; -/* dict_tree_t* tree;*/ - btr_pcur_t pcur; - btr_pcur_t pcur2; - mtr_t mtr; - mtr_t mtr2; - byte* field; - ulint len; - dtuple_t* search_tuple; - dict_tree_t* index_tree; - rec_t* rec; - - UT_NOT_USED(len); - UT_NOT_USED(field); - UT_NOT_USED(pcur2); -/* - printf("\n\n\nPress 2 x enter to start test\n"); - - while (EOF == getchar()) { - - } - - getchar(); -*/ - printf("-------------------------------------------------\n"); - printf("TEST 1. CREATE TABLE WITH 3 COLUMNS AND WITH 3 INDEXES\n"); - - heap = mem_heap_create(1024); - heap2 = mem_heap_create(1024); - - trx = trx_start(ULINT_UNDEFINED); - - table = dict_mem_table_create("TS_TABLE1", 0, 3); - - dict_mem_table_add_col(table, "COL1", DATA_VARCHAR, - DATA_ENGLISH, 10, 0); - dict_mem_table_add_col(table, "COL2", DATA_VARCHAR, - DATA_ENGLISH, 10, 0); - dict_mem_table_add_col(table, "COL3", DATA_VARCHAR, - DATA_ENGLISH, 100, 0); - - ut_a(TRUE == dict_create_table(table, trx)); - - index = dict_mem_index_create("TS_TABLE1", "IND1", 75046, - DICT_CLUSTERED, 2); - - dict_mem_index_add_field(index, "COL1", 0); - dict_mem_index_add_field(index, "COL2", 0); - - ut_a(mem_heap_validate(index->heap)); - - ut_a(TRUE == dict_create_index(index, trx)); - - trx_commit(trx); - - trx = trx_start(ULINT_UNDEFINED); - - index = dict_mem_index_create("TS_TABLE1", "IND2", 0, DICT_UNIQUE, 1); - - dict_mem_index_add_field(index, "COL2", 0); - - ut_a(mem_heap_validate(index->heap)); - - ut_a(TRUE == dict_create_index(index, trx)); - - trx_commit(trx); - - trx = trx_start(ULINT_UNDEFINED); - - index = dict_mem_index_create("TS_TABLE1", "IND3", 0, DICT_UNIQUE, 1); - - dict_mem_index_add_field(index, "COL2", 0); - - ut_a(mem_heap_validate(index->heap)); - - ut_a(TRUE == dict_create_index(index, trx)); - - trx_commit(trx); -/* - tree = dict_index_get_tree(dict_table_get_first_index(table)); - - btr_print_tree(tree, 10); -*/ - dict_table_print(table); - - /*---------------------------------------------------------*/ -/* - printf("\n\n\nPress 2 x enter to continue test\n"); - - while (EOF == getchar()) { - - } - getchar(); -*/ - printf("-------------------------------------------------\n"); - printf("TEST 2. INSERT 1 ROW TO THE TABLE\n"); - - trx = trx_start(ULINT_UNDEFINED); - - tuple = dtuple_create(heap, 3); - - table = dict_table_get("TS_TABLE1", trx); - - dtuple_gen_test_tuple3(tuple, 0, buf); - tcur_insert(tuple, table, heap2, trx); - - trx_commit(trx); -/* - tree = dict_index_get_tree(dict_table_get_first_index(table)); - - btr_print_tree(tree, 10); -*/ -/* - printf("\n\n\nPress 2 x enter to continue test\n"); - - while (EOF == getchar()) { - - } - getchar(); -*/ - printf("-------------------------------------------------\n"); - printf("TEST 3. INSERT MANY ROWS TO THE TABLE IN A SINGLE TRX\n"); - - rnd = 0; - oldtm = ut_clock(); - - trx = trx_start(ULINT_UNDEFINED); - for (i = 0; i < 300 * UNIV_DBC * UNIV_DBC; i++) { - - if (i % 5000 == 0) { - /* dict_table_print(table); - buf_print(); - buf_LRU_print(); - printf("%lu rows inserted\n", i); */ - } - - table = dict_table_get("TS_TABLE1", trx); - - if (i == 2180) { - rnd = rnd % 200000; - } - - rnd = (rnd + 1) % 200000; - - dtuple_gen_test_tuple3(tuple, rnd, buf); - - tcur_insert(tuple, table, heap2, trx); - - mem_heap_empty(heap2); - - if (i % 4 == 3) { - } - } - trx_commit(trx); - - tm = ut_clock(); - printf("Wall time for test %lu milliseconds\n", tm - oldtm); - printf("%lu rows inserted\n", i); -/* - printf("\n\n\nPress 2 x enter to continue test\n"); - - while (EOF == getchar()) { - - } - getchar(); -*/ - printf("-------------------------------------------------\n"); - printf("TEST 4. PRINT PART OF CONTENTS OF EACH INDEX TREE\n"); - -/* - mem_print_info(); -*/ - -/* - tree = dict_index_get_tree(dict_table_get_first_index(table)); - - btr_print_tree(tree, 10); - - tree = dict_index_get_tree(dict_table_get_next_index( - dict_table_get_first_index(table))); - - btr_print_tree(tree, 5); -*/ -/* - printf("\n\n\nPress 2 x enter to continue test\n"); - - while (EOF == getchar()) { - - } - getchar(); -*/ -/* mem_print_info(); */ - - os_thread_sleep(5000000); - - for (j = 0; j < 5; j++) { - printf("-------------------------------------------------\n"); - printf("TEST 5. CALCULATE THE JOIN OF THE TABLE WITH ITSELF\n"); - - i = 0; - - oldtm = ut_clock(); - - mtr_start(&mtr); - - index_tree = dict_index_get_tree(UT_LIST_GET_FIRST(table->indexes)); - - search_tuple = dtuple_create(heap, 2); - - dtuple_gen_search_tuple3(search_tuple, i, buf); - - btr_pcur_open(index_tree, search_tuple, PAGE_CUR_GE, - BTR_SEARCH_LEAF, &pcur, &mtr); - - ut_a(btr_pcur_move_to_next(&pcur, &mtr)); - - while (!btr_pcur_is_after_last_in_tree(&pcur, &mtr)) { - - if (i % 20000 == 0) { - printf("%lu rows joined\n", i); - } - - index_tree = dict_index_get_tree( - UT_LIST_GET_FIRST(table->indexes)); - - rec = btr_pcur_get_rec(&pcur); - - rec_copy_prefix_to_dtuple(search_tuple, rec, 2, heap2); - - mtr_start(&mtr2); - - btr_pcur_open(index_tree, search_tuple, PAGE_CUR_GE, - BTR_SEARCH_LEAF, &pcur2, &mtr2); - - btr_pcur_move_to_next(&pcur2, &mtr2); - - rec = btr_pcur_get_rec(&pcur2); - - field = rec_get_nth_field(rec, 1, &len); - - ut_a(len == 8); - - ut_a(ut_memcmp(field, dfield_get_data( - dtuple_get_nth_field(search_tuple, 1)), - len) == 0); - - btr_pcur_close(&pcur2, &mtr); - - mem_heap_empty(heap2); - - mtr_commit(&mtr2); - - btr_pcur_store_position(&pcur, &mtr); - mtr_commit(&mtr); - - mtr_start(&mtr); - - btr_pcur_restore_position(BTR_SEARCH_LEAF, &pcur, &mtr); - - btr_pcur_move_to_next(&pcur, &mtr); - i++; - } - - btr_pcur_close(&pcur, &mtr); - mtr_commit(&mtr); - - tm = ut_clock(); - printf("Wall time for test %lu milliseconds\n", tm - oldtm); - printf("%lu rows joined\n", i); - } - - oldtm = ut_clock(); - -/* - printf("\n\n\nPress 2 x enter to continue test\n"); - - while (EOF == getchar()) { - - } - getchar(); -*/ - printf("-------------------------------------------------\n"); - printf("TEST 6. INSERT MANY ROWS TO THE TABLE IN SEPARATE TRXS\n"); - - rnd = 200000; - - for (i = 0; i < 350; i++) { - - if (i % 4 == 0) { - } - trx = trx_start(ULINT_UNDEFINED); - - table = dict_table_get("TS_TABLE1", trx); - - if (i == 2180) { - rnd = rnd % 200000; - } - - rnd = (rnd + 1) % 200000; - - dtuple_gen_test_tuple3(tuple, rnd, buf); - - tcur_insert(tuple, table, heap2, trx); - - trx_commit(trx); - - mem_heap_empty(heap2); - if (i % 4 == 3) { - } - } - - tm = ut_clock(); - printf("Wall time for test %lu milliseconds\n", tm - oldtm); - printf("%lu rows inserted in %lu transactions\n", i, i); -/* - printf("\n\n\nPress 2 x enter to continue test\n"); - - while (EOF == getchar()) { - - } - getchar(); -*/ - printf("-------------------------------------------------\n"); - printf("TEST 7. PRINT MEMORY ALLOCATION INFO\n"); - - mem_print_info(); -/* - printf("\n\n\nPress 2 x enter to continue test\n"); - - while (EOF == getchar()) { - - } - getchar(); -*/ - printf("-------------------------------------------------\n"); - printf("TEST 8. PRINT SEMAPHORE INFO\n"); - - sync_print(); - -#endif - -#ifdef notdefined - rnd = 90000; - - oldtm = ut_clock(); - - for (i = 0; i < 1000 * UNIV_DBC * UNIV_DBC; i++) { - - mtr_start(&mtr); - - if (i == 50000) { - rnd = rnd % 200000; - } - - rnd = (rnd + 595659561) % 200000; - - dtuple_gen_test_tuple3(tuple, rnd, buf); - - btr_pcur_open(tree, tuple, PAGE_CUR_GE, - BTR_SEARCH_LEAF, &cursor, &mtr); - - mtr_commit(&mtr); - } - - tm = ut_clock(); - printf("Wall time for test %lu milliseconds\n", tm - oldtm); - - rnd = 0; - - oldtm = ut_clock(); - - for (i = 0; i < 1000 * UNIV_DBC * UNIV_DBC; i++) { - - mtr_start(&mtr); - - rnd = (rnd + 35608971) % 200000 + 1; - - dtuple_gen_test_tuple3(tuple, rnd, buf); - - mtr_commit(&mtr); - } - - tm = ut_clock(); - printf("Wall time for test %lu milliseconds\n", tm - oldtm); - -/* btr_print_tree(tree, 3); */ - -#endif -/* - mem_heap_free(heap); -} -*/ - -#ifdef notdefined - - mtr_start(&mtr); - - block = buf_page_create(0, 5, &mtr); - buf_page_x_lock(block, &mtr); - - frame = buf_block_get_frame(block); - - page = page_create(frame, &mtr); - - for (i = 0; i < 512; i++) { - - rnd = (rnd + 534671) % 512; - - if (i % 27 == 0) { - ut_a(page_validate(page, index)); - } - - dtuple_gen_test_tuple(tuple, rnd); - -/* dtuple_print(tuple);*/ - - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); - - ut_a(rec); - - rec_validate(rec); -/* page_print_list(page, 151); */ - } - -/* page_print_list(page, 151); */ - - ut_a(page_validate(page, index)); - ut_a(page_get_n_recs(page) == 512); - - for (i = 0; i < 512; i++) { - - rnd = (rnd + 7771) % 512; - - if (i % 27 == 0) { - ut_a(page_validate(page, index)); - } - - dtuple_gen_test_tuple(tuple, rnd); - -/* dtuple_print(tuple);*/ - - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - page_cur_delete_rec(&cursor, &mtr); - - ut_a(rec); - - rec_validate(rec); -/* page_print_list(page, 151); */ - } - - ut_a(page_get_n_recs(page) == 0); - - ut_a(page_validate(page, index)); - page = page_create(frame, &mtr); - - rnd = 311; - - for (i = 0; i < 512; i++) { - - rnd = (rnd + 1) % 512; - - if (i % 27 == 0) { - ut_a(page_validate(page, index)); - } - - dtuple_gen_test_tuple(tuple, rnd); - -/* dtuple_print(tuple);*/ - - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); - - ut_a(rec); - - rec_validate(rec); -/* page_print_list(page, 151); */ - } - - ut_a(page_validate(page, index)); - ut_a(page_get_n_recs(page) == 512); - - rnd = 217; - - for (i = 0; i < 512; i++) { - - rnd = (rnd + 1) % 512; - - if (i % 27 == 0) { - ut_a(page_validate(page, index)); - } - - dtuple_gen_test_tuple(tuple, rnd); - -/* dtuple_print(tuple);*/ - - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - page_cur_delete_rec(&cursor, &mtr); - - ut_a(rec); - - rec_validate(rec); -/* page_print_list(page, 151); */ - } - - ut_a(page_validate(page, index)); - ut_a(page_get_n_recs(page) == 0); - page = page_create(frame, &mtr); - - rnd = 291; - - for (i = 0; i < 512; i++) { - - rnd = (rnd - 1) % 512; - - if (i % 27 == 0) { - ut_a(page_validate(page, index)); - } - - dtuple_gen_test_tuple(tuple, rnd); - -/* dtuple_print(tuple);*/ - - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); - - ut_a(rec); - - rec_validate(rec); -/* page_print_list(page, 151); */ - } - - ut_a(page_validate(page, index)); - ut_a(page_get_n_recs(page) == 512); - - rnd = 277; - - for (i = 0; i < 512; i++) { - - rnd = (rnd - 1) % 512; - - if (i % 27 == 0) { - ut_a(page_validate(page, index)); - } - - dtuple_gen_test_tuple(tuple, rnd); - -/* dtuple_print(tuple);*/ - - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - page_cur_delete_rec(&cursor, &mtr); - - ut_a(rec); - - rec_validate(rec); -/* page_print_list(page, 151); */ - } - - ut_a(page_validate(page, index)); - ut_a(page_get_n_recs(page) == 0); - - mtr_commit(&mtr); - mem_heap_free(heap); -} - -/********************************************************************* -Test for index page. */ - -void -test2(void) -/*=======*/ -{ - page_t* page; - dtuple_t* tuple; - mem_heap_t* heap; - ulint i, j; - ulint rnd = 0; - rec_t* rec; - page_cur_t cursor; - dict_index_t* index; - dict_table_t* table; - buf_block_t* block; - buf_frame_t* frame; - ulint tm, oldtm; - byte buf[8]; - mtr_t mtr; - - printf("-------------------------------------------------\n"); - printf("TEST 2. Speed test\n"); - - oldtm = ut_clock(); - - for (i = 0; i < 1000 * UNIV_DBC * UNIV_DBC; i++) { - ut_memcpy(bigbuf, bigbuf + 800, 800); - } - - tm = ut_clock(); - printf("Wall time for %lu mem copys of 800 bytes %lu millisecs\n", - i, tm - oldtm); - - oldtm = ut_clock(); - - rnd = 0; - for (i = 0; i < 1000 * UNIV_DBC * UNIV_DBC; i++) { - ut_memcpy(bigbuf + rnd, bigbuf + rnd + 800, 800); - rnd += 1600; - if (rnd > 995000) { - rnd = 0; - } - } - - tm = ut_clock(); - printf("Wall time for %lu mem copys of 800 bytes %lu millisecs\n", - i, tm - oldtm); - - heap = mem_heap_create(0); - - table = dict_table_create("TS_TABLE2", 2); - - dict_table_add_col(table, "COL1", DATA_VARCHAR, DATA_ENGLISH, 10, 0); - dict_table_add_col(table, "COL2", DATA_VARCHAR, DATA_ENGLISH, 10, 0); - - ut_a(0 == dict_table_publish(table)); - - index = dict_index_create("TS_TABLE2", "IND2", 0, 2, 0); - - dict_index_add_field(index, "COL1", 0); - dict_index_add_field(index, "COL2", 0); - - ut_a(0 == dict_index_publish(index)); - - index = dict_index_get("TS_TABLE2", "IND2"); - ut_a(index); - - tuple = dtuple_create(heap, 2); - - oldtm = ut_clock(); - - rnd = 677; - for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { - - mtr_start(&mtr); - - block = buf_page_create(0, 5, &mtr); - buf_page_x_lock(block, &mtr); - - frame = buf_block_get_frame(block); - - page = page_create(frame, &mtr); - - for (j = 0; j < 250; j++) { - rnd = (rnd + 54841) % 1000; - dtuple_gen_test_tuple2(tuple, rnd, buf); - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); - ut_a(rec); - } - mtr_commit(&mtr); - } - - tm = ut_clock(); - printf("Wall time for insertion of %lu recs %lu milliseconds\n", - i * j, tm - oldtm); - - mtr_start(&mtr); - - block = buf_page_get(0, 5, &mtr); - buf_page_s_lock(block, &mtr); - - page = buf_block_get_frame(block); - ut_a(page_validate(page, index)); - mtr_commit(&mtr); - - oldtm = ut_clock(); - - rnd = 677; - for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { - mtr_start(&mtr); - - block = buf_page_create(0, 5, &mtr); - buf_page_x_lock(block, &mtr); - - frame = buf_block_get_frame(block); - - page = page_create(frame, &mtr); - - for (j = 0; j < 250; j++) { - rnd = (rnd + 54841) % 1000; - dtuple_gen_test_tuple2(tuple, rnd, buf); - } - mtr_commit(&mtr); - } - - tm = ut_clock(); - printf( - "Wall time for %lu empty loops with page create %lu milliseconds\n", - i * j, tm - oldtm); - - oldtm = ut_clock(); - - for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { - - mtr_start(&mtr); - - block = buf_page_create(0, 5, &mtr); - buf_page_x_lock(block, &mtr); - - frame = buf_block_get_frame(block); - - page = page_create(frame, &mtr); - - rnd = 100; - for (j = 0; j < 250; j++) { - rnd = (rnd + 1) % 1000; - dtuple_gen_test_tuple2(tuple, rnd, buf); - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); - ut_a(rec); - } - mtr_commit(&mtr); - } - - tm = ut_clock(); - printf( - "Wall time for sequential insertion of %lu recs %lu milliseconds\n", - i * j, tm - oldtm); - - - oldtm = ut_clock(); - - for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { - mtr_start(&mtr); - - block = buf_page_create(0, 5, &mtr); - buf_page_x_lock(block, &mtr); - - frame = buf_block_get_frame(block); - - page = page_create(frame, &mtr); - - rnd = 500; - for (j = 0; j < 250; j++) { - rnd = (rnd - 1) % 1000; - dtuple_gen_test_tuple2(tuple, rnd, buf); - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); - ut_a(rec); - } - mtr_commit(&mtr); - } - - tm = ut_clock(); - printf( - "Wall time for descend. seq. insertion of %lu recs %lu milliseconds\n", - i * j, tm - oldtm); - - oldtm = ut_clock(); - - for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { - mtr_start(&mtr); - - block = buf_page_create(0, 5, &mtr); - buf_page_x_lock(block, &mtr); - - frame = buf_block_get_frame(block); - - page = page_create(frame, &mtr); - - rnd = 677; - - for (j = 0; j < 250; j++) { - rnd = (rnd + 54841) % 1000; - dtuple_gen_test_tuple2(tuple, rnd, buf); - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); - ut_a(rec); - } - - rnd = 677; - for (j = 0; j < 250; j++) { - rnd = (rnd + 54841) % 1000; - dtuple_gen_test_tuple2(tuple, rnd, buf); - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - page_cur_delete_rec(&cursor, &mtr); - } - ut_a(page_get_n_recs(page) == 0); - - mtr_commit(&mtr); - } - - tm = ut_clock(); - printf("Wall time for insert and delete of %lu recs %lu milliseconds\n", - i * j, tm - oldtm); - - mtr_start(&mtr); - - block = buf_page_create(0, 5, &mtr); - buf_page_x_lock(block, &mtr); - - frame = buf_block_get_frame(block); - - page = page_create(frame, &mtr); - - rnd = 677; - - for (j = 0; j < 250; j++) { - rnd = (rnd + 54841) % 1000; - dtuple_gen_test_tuple2(tuple, rnd, buf); - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - - rec = page_cur_insert_rec(&cursor, tuple, NULL, &mtr); - ut_a(rec); - } - ut_a(page_validate(page, index)); - mtr_print(&mtr); - - oldtm = ut_clock(); - - for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { - rnd = 677; - for (j = 0; j < 250; j++) { - rnd = (rnd + 54841) % 1000; - dtuple_gen_test_tuple2(tuple, rnd, buf); - page_cur_search(page, tuple, PAGE_CUR_G, &cursor); - } - } - - tm = ut_clock(); - printf("Wall time for search of %lu recs %lu milliseconds\n", - i * j, tm - oldtm); - - oldtm = ut_clock(); - - for (i = 0; i < 4 * UNIV_DBC * UNIV_DBC; i++) { - rnd = 677; - for (j = 0; j < 250; j++) { - rnd = (rnd + 54841) % 1000; - dtuple_gen_test_tuple2(tuple, rnd, buf); - } - } - - tm = ut_clock(); - printf("Wall time for %lu empty loops %lu milliseconds\n", - i * j, tm - oldtm); - mtr_commit(&mtr); -} - -#endif - -/******************************************************************** -Main test function. */ - -void -main(void) -/*======*/ -{ - ulint tm, oldtm; - mtr_t mtr; - - sync_init(); - mem_init(); - os_aio_init(160, 5); - fil_init(25); - buf_pool_init(POOL_SIZE, POOL_SIZE); - fsp_init(); - log_init(); - - create_files(); - init_space(); - - mtr_start(&mtr); - - trx_sys_create(&mtr); - dict_create(&mtr); - - mtr_commit(&mtr); - - - oldtm = ut_clock(); - - ut_rnd_set_seed(19); - - test1(); - -/* mem_print_info(); */ - - tm = ut_clock(); - printf("Wall time for test %lu milliseconds\n", tm - oldtm); - printf("TESTS COMPLETED SUCCESSFULLY!\n"); -} |