Commit 758c03a7 authored by unknown's avatar unknown

Merge lgrimmer@bk-internal.mysql.com:/home/bk/mysql-5.0

into mysql.com:/space/my/mysql-5.0

parents dabc073c 5e3cb16c
......@@ -1776,6 +1776,15 @@ buf_page_create(
buf_flush_free_margin();
frame = block->frame;
/* Reset to zero the file flush lsn field in the page; if the first
page of an ibdata file is 'created' in this function into the buffer
pool then we lose the original contents of the file flush lsn stamp.
Then InnoDB could in a crash recovery print a big, false, corruption
warning if the stamp contains an lsn bigger than the ib_logfile lsn. */
memset(frame + FIL_PAGE_FILE_FLUSH_LSN, 0, 8);
#ifdef UNIV_DEBUG
buf_dbg_counter++;
......
......@@ -68,7 +68,6 @@ void
read_view_print(
/*============*/
read_view_t* view); /* in: read view */
/*************************************************************************
Create a consistent cursor view for mysql to be used in cursors. In this
consistent read view modifications done by the creating transaction or future
......@@ -78,10 +77,9 @@ cursor_view_t*
read_cursor_view_create_for_mysql(
/*==============================*/
trx_t* cr_trx);/* in: trx where cursor view is created */
/*************************************************************************
Close a given consistent cursor view for and restore global read view
back to a transaction. */
Close a given consistent cursor view for mysql and restore global read view
back to a transaction read view. */
void
read_cursor_view_close_for_mysql(
......@@ -90,7 +88,7 @@ read_cursor_view_close_for_mysql(
cursor_view_t* curview); /* in: cursor view to be closed */
/*************************************************************************
This function sets a given consistent cursor view to a transaction
read view if given consistent cursor view is not null. Otherwice, function
read view if given consistent cursor view is not NULL. Otherwise, function
restores a global read view to a transaction read view. */
void
......
......@@ -606,14 +606,13 @@ struct trx_struct{
/* memory heap for the global read
view */
read_view_t* global_read_view;
/* consistent read view used in the
transaction is stored here if
transaction is using a consistent
read view associated to a cursor */
/* consistent read view associated
to a transaction or NULL */
read_view_t* read_view; /* consistent read view used in the
transaction or NULL, this read view
can be normal read view associated
to a transaction or read view
if defined can be normal read view
associated to a transaction (i.e.
same as global_read_view) or read view
associated to a cursor */
/*------------------------------*/
UT_LIST_BASE_NODE_T(trx_named_savept_t)
......
......@@ -347,8 +347,8 @@ read_cursor_view_create_for_mysql(
}
/*************************************************************************
Close a given consistent cursor view for and restore global read view
back to a transaction. */
Close a given consistent cursor view for mysql and restore global read view
back to a transaction read view. */
void
read_cursor_view_close_for_mysql(
......@@ -372,7 +372,7 @@ read_cursor_view_close_for_mysql(
/*************************************************************************
This function sets a given consistent cursor view to a transaction
read view if given consistent cursor view is not null. Otherwice, function
read view if given consistent cursor view is not NULL. Otherwise, function
restores a global read view to a transaction read view. */
void
......
......@@ -3100,6 +3100,13 @@ row_search_for_mysql(
"http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n"
"InnoDB: how you can resolve the problem.\n",
prebuilt->table->name);
/* Restore a global read view back to a transaction. This
forces MySQL always to set a cursor view before fetch from
a cursor. */
trx->read_view = trx->global_read_view;
return(DB_ERROR);
}
......@@ -4091,8 +4098,9 @@ normal_return:
}
func_exit:
/* Restore a global read view back to transaction. This forces
MySQL always to set cursor view before fetch if it is used. */
/* Restore a global read view back to a transaction. This
forces MySQL always to set a cursor view before fetch from
a cursor. */
trx->read_view = trx->global_read_view;
......
......@@ -1711,6 +1711,10 @@ srv_printf_innodb_monitor(
fprintf(file, "%ld queries inside InnoDB, %lu queries in queue\n",
(long) srv_conc_n_threads,
(ulong) srv_conc_n_waiting_threads);
fprintf(file, "%lu read views open inside InnoDB\n",
UT_LIST_GET_LEN(trx_sys->view_list));
n_reserved = fil_space_get_n_reserved_extents(0);
if (n_reserved > 0) {
fprintf(file,
......
......@@ -1833,6 +1833,16 @@ innobase_shutdown_for_mysql(void)
srv_free();
os_sync_free();
/* Check that all read views are closed except read view owned
by a purge. */
if (UT_LIST_GET_LEN(trx_sys->view_list) > 1) {
fprintf(stderr,
"InnoDB: Error: all read views were not closed before shutdown:\n"
"InnoDB: %lu read views open \n",
UT_LIST_GET_LEN(trx_sys->view_list) - 1);
}
/* 5. Free all allocated memory and the os_fast_mutex created in
ut0mem.c */
......
......@@ -833,26 +833,14 @@ trx_commit_off_kernel(
lock_release_off_kernel(trx);
if (trx->read_view) {
/* If transaction has a global read view this case
means that transaction has been using a consistent
read view associated to a cursor. Only the global
read view associated to a transaction is closed
and read view is then removed from the transaction.
If read view associated to a cursor is still used
it must be re-registered to another transaction. */
if (UNIV_LIKELY_NULL(trx->global_read_view)) {
trx->read_view = trx->global_read_view;
}
read_view_close(trx->read_view);
if (trx->global_read_view) {
read_view_close(trx->global_read_view);
mem_heap_empty(trx->global_read_view_heap);
trx->read_view = NULL;
trx->global_read_view = NULL;
}
trx->read_view = NULL;
if (must_flush_log) {
mutex_exit(&kernel_mutex);
......
......@@ -538,7 +538,7 @@ innobase_mysql_prepare_print_arbitrary_thd(void)
}
/*****************************************************************
Relases the mutex reserved by innobase_mysql_prepare_print_arbitrary_thd().
Releases the mutex reserved by innobase_mysql_prepare_print_arbitrary_thd().
NOTE that /mysql/innobase/lock/lock0lock.c must contain the prototype for this
function! */
extern "C"
......@@ -1700,7 +1700,7 @@ innobase_store_binlog_offset_and_flush_log(
/* Commits the mini-transaction */
mtr_commit(&mtr);
/* Syncronous flush of the log buffer to disk */
/* Synchronous flush of the log buffer to disk */
log_buffer_flush_to_disk();
}
#endif
......@@ -2132,15 +2132,34 @@ innobase_savepoint(
/*********************************************************************
Frees a possible InnoDB trx object associated with the current THD. */
static int
static
int
innobase_close_connection(
/*======================*/
/* out: 0 or error number */
THD* thd) /* in: handle to the MySQL thread of the user
whose resources should be free'd */
{
trx_free_for_mysql((trx_t*)thd->ha_data[innobase_hton.slot]);
trx_t* trx;
trx = (trx_t*)thd->ha_data[innobase_hton.slot];
ut_a(trx);
if (trx->conc_state != TRX_NOT_STARTED) {
ut_print_timestamp(stderr);
fprintf(stderr,
" InnoDB: Warning: MySQL is closing a connection"
"InnoDB: that has an active InnoDB transaction. We roll back that\n"
"InnoDB: transaction. %lu row modifications to roll back.\n",
(ulong)trx->undo_no.low);
}
innobase_rollback_trx(trx);
trx_free_for_mysql(trx);
return(0);
}
......@@ -2834,7 +2853,7 @@ ha_innobase::store_key_val_for_row(
/* All indexes on BLOB and TEXT are column prefix
indexes, and we may need to truncate the data to be
stored in the kay value: */
stored in the key value: */
if (blob_len > key_part->length) {
blob_len = key_part->length;
......@@ -7117,7 +7136,7 @@ int
innobase_rollback_by_xid(
/*=====================*/
/* out: 0 or error number */
XID *xid) /* in: X/Open XA transaction idenfification */
XID *xid) /* in: X/Open XA transaction identification */
{
trx_t* trx;
......@@ -7131,9 +7150,10 @@ innobase_rollback_by_xid(
}
/***********************************************************************
This function creates a consistent view for a cursor and start a transaction
if it has not been started. This consistent view is then used inside of MySQL
when accesing records using a cursor. */
Create a consistent view for a cursor based on current transaction
which is created if the corresponding MySQL thread still lacks one.
This consistent view is then used inside of MySQL when accessing records
using a cursor. */
void*
innobase_create_cursor_view(void)
......@@ -7145,9 +7165,9 @@ innobase_create_cursor_view(void)
}
/***********************************************************************
This function closes the given consistent cursor view. Note that
global read view is restored to a transaction and a transaction is
started if it has not been started. */
Close the given consistent cursor view of a transaction and restore
global read view to a transaction read view. Transaction is created if the
corresponding MySQL thread still lacks one. */
void
innobase_close_cursor_view(
......@@ -7159,13 +7179,15 @@ innobase_close_cursor_view(
}
/***********************************************************************
This function sets the given consistent cursor view to a transaction.
If a transaction does not exist, transaction is started. */
Set the given consistent cursor view to a transaction which is created
if the corresponding MySQL thread still lacks one. If the given
consistent cursor view is NULL global read view of a transaction is
restored to a transaction read view. */
void
innobase_set_cursor_view(
/*=====================*/
void* curview)/* in: Consistent cursor view to be closed */
void* curview)/* in: Consistent cursor view to be set */
{
read_cursor_set_for_mysql(check_trx_exists(current_thd),
(cursor_view_t*) curview);
......
......@@ -302,7 +302,7 @@ which is in the prepared state */
int innobase_rollback_by_xid(
/* out: 0 or error number */
XID *xid); /* in : X/Open XA Transaction Idenfification */
XID *xid); /* in : X/Open XA Transaction Identification */
int innobase_xa_end(THD *thd);
......@@ -312,9 +312,10 @@ int innobase_repl_report_sent_binlog(THD *thd, char *log_file_name,
my_off_t end_offset);
/***********************************************************************
This function creates a consistent view for a cursor and start a transaction
if it has not been started. This consistent view is then used inside of MySQL
when accesing records using a cursor. */
Create a consistent view for a cursor based on current transaction
which is created if the corresponding MySQL thread still lacks one.
This consistent view is then used inside of MySQL when accessing records
using a cursor. */
void*
innobase_create_cursor_view(void);
......@@ -322,9 +323,9 @@ innobase_create_cursor_view(void);
/* out: Pointer to cursor view or NULL */
/***********************************************************************
This function closes the given consistent cursor view. Note that
global read view is restored to a transaction and a transaction is
started if it has not been started. */
Close the given consistent cursor view of a transaction and restore
global read view to a transaction read view. Transaction is created if the
corresponding MySQL thread still lacks one. */
void
innobase_close_cursor_view(
......@@ -332,8 +333,10 @@ innobase_close_cursor_view(
void* curview); /* in: Consistent read view to be closed */
/***********************************************************************
This function sets the given consistent cursor view to a transaction.
If a transaction does not exist, transaction is started. */
Set the given consistent cursor view to a transaction which is created
if the corresponding MySQL thread still lacks one. If the given
consistent cursor view is NULL global read view of a transaction is
restored to a transaction read view. */
void
innobase_set_cursor_view(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment