mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	From r5995 to r6043 Detailed revision comments: r5995 | marko | 2009-09-28 03:52:25 -0500 (Mon, 28 Sep 2009) | 17 lines branches/zip: Do not write to PAGE_INDEX_ID after page creation, not even when restoring an uncompressed page after a compression failure. btr_page_reorganize_low(): On compression failure, do not restore those page header fields that should not be affected by the reorganization. Instead, compare the fields. page_zip_decompress(): Add the parameter ibool all, for copying all page header fields. Pass the parameter all=TRUE on block read completion, redo log application, and page_zip_validate(); pass all=FALSE in all other cases. page_zip_reorganize(): Do not restore the uncompressed page on failure. It will be restored (to pre-modification state) by the caller anyway. rb://167, Issue #346 r5996 | marko | 2009-09-28 07:46:02 -0500 (Mon, 28 Sep 2009) | 4 lines branches/zip: Address Issue #350 in comments. lock_rec_queue_validate(), lock_rec_queue_validate(): Note that this debug code may violate the latching order and cause deadlocks. r5997 | marko | 2009-09-28 08:03:58 -0500 (Mon, 28 Sep 2009) | 12 lines branches/zip: Remove an assertion failure when the InnoDB data dictionary is inconsistent with the MySQL .frm file. ha_innobase::index_read(): When the index cannot be found, return an error. ha_innobase::change_active_index(): When prebuilt->index == NULL, set also prebuilt->index_usable = FALSE. This is not needed for correctness, because prebuilt->index_usable is only checked by row_search_for_mysql(), which requires prebuilt->index != NULL. This addresses Issue #349. Approved by Heikki Tuuri over IM. r6005 | vasil | 2009-09-29 03:09:52 -0500 (Tue, 29 Sep 2009) | 4 lines branches/zip: ChangeLog: wrap around 78th column, not earlier. r6006 | vasil | 2009-09-29 05:15:25 -0500 (Tue, 29 Sep 2009) | 4 lines branches/zip: Add ChangeLog entry for the release of 1.0.4. r6007 | vasil | 2009-09-29 08:19:59 -0500 (Tue, 29 Sep 2009) | 6 lines branches/zip: Fix the year, should be 2009. Pointed by: Calvin r6026 | marko | 2009-09-30 02:18:24 -0500 (Wed, 30 Sep 2009) | 1 line branches/zip: Add some debug assertions for checking FSEG_MAGIC_N. r6028 | marko | 2009-09-30 08:55:23 -0500 (Wed, 30 Sep 2009) | 3 lines branches/zip: recv_no_log_write: New debug flag for tracking down Mantis Issue #347. No modifications should be made to the database while recv_apply_hashed_log_recs() is about to complete. r6029 | calvin | 2009-09-30 15:32:02 -0500 (Wed, 30 Sep 2009) | 4 lines branches/zip: non-functional changes Fix typo. r6031 | marko | 2009-10-01 06:24:33 -0500 (Thu, 01 Oct 2009) | 49 lines branches/zip: Clean up after a crash during DROP INDEX. When InnoDB crashes while dropping an index, ensure that the index will be completely dropped during crash recovery. row_merge_drop_index(): Before dropping an index, rename the index to start with TEMP_INDEX_PREFIX_STR and commit the change, so that row_merge_drop_temp_indexes() will drop the index after crash recovery if the server crashes while dropping the index. fseg_inode_try_get(): New function, forked from fseg_inode_get(). Return NULL if the file segment index node is free. fseg_inode_get(): Assert that the file segment index node is not free. fseg_free_step(): If the file segment index node is already free, print a diagnostic message and return TRUE. fsp_free_seg_inode(): Write a nonzero number to FSEG_MAGIC_N, so that allocated-and-freed file segment index nodes can be better distinguished from uninitialized ones. This is rb://174, addressing Issue #348. Tested by restarting mysqld upon the completion of the added log_write_up_to() invocation below, during DROP INDEX. The index was dropped after crash recovery, and re-issuing the DROP INDEX did not crash the server. Index: btr/btr0btr.c =================================================================== --- btr/btr0btr.c (revision 6026) +++ btr/btr0btr.c (working copy) @@ -42,6 +42,7 @@ Created 6/2/1994 Heikki Tuuri #include "ibuf0ibuf.h" #include "trx0trx.h" +#include "log0log.h" /* Latching strategy of the InnoDB B-tree -------------------------------------- @@ -873,6 +874,8 @@ leaf_loop: goto leaf_loop; } + + log_write_up_to(mtr.end_lsn, LOG_WAIT_ALL_GROUPS, TRUE); top_loop: mtr_start(&mtr); r6033 | calvin | 2009-10-01 15:19:46 -0500 (Thu, 01 Oct 2009) | 4 lines branches/zip: fix a typo in error message Reported as bug#47763. r6043 | inaam | 2009-10-05 09:45:35 -0500 (Mon, 05 Oct 2009) | 12 lines branches/zip rb://176 Do not invalidate buffer pool while an LRU batch is active. Added code to buf_pool_invalidate() to wait for the running batches to finish. This patch also resets the state of buf_pool struct at invalidation. This addresses the concern where buf_pool->freed_page_clock becomes non-zero because we read in a system tablespace page for file format info at startup. Approved by: Marko
		
			
				
	
	
		
			157 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*****************************************************************************
 | 
						|
 | 
						|
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
 | 
						|
 | 
						|
This program is free software; you can redistribute it and/or modify it under
 | 
						|
the terms of the GNU General Public License as published by the Free Software
 | 
						|
Foundation; version 2 of the License.
 | 
						|
 | 
						|
This program is distributed in the hope that it will be useful, but WITHOUT
 | 
						|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 | 
						|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 | 
						|
 | 
						|
You should have received a copy of the GNU General Public License along with
 | 
						|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 | 
						|
Place, Suite 330, Boston, MA 02111-1307 USA
 | 
						|
 | 
						|
*****************************************************************************/
 | 
						|
 | 
						|
/**************************************************//**
 | 
						|
@file include/row0ins.h
 | 
						|
Insert into a table
 | 
						|
 | 
						|
Created 4/20/1996 Heikki Tuuri
 | 
						|
*******************************************************/
 | 
						|
 | 
						|
#ifndef row0ins_h
 | 
						|
#define row0ins_h
 | 
						|
 | 
						|
#include "univ.i"
 | 
						|
#include "data0data.h"
 | 
						|
#include "que0types.h"
 | 
						|
#include "dict0types.h"
 | 
						|
#include "trx0types.h"
 | 
						|
#include "row0types.h"
 | 
						|
 | 
						|
/***************************************************************//**
 | 
						|
Checks if foreign key constraint fails for an index entry. Sets shared locks
 | 
						|
which lock either the success or the failure of the constraint. NOTE that
 | 
						|
the caller must have a shared latch on dict_foreign_key_check_lock.
 | 
						|
@return DB_SUCCESS, DB_LOCK_WAIT, DB_NO_REFERENCED_ROW, or
 | 
						|
DB_ROW_IS_REFERENCED */
 | 
						|
UNIV_INTERN
 | 
						|
ulint
 | 
						|
row_ins_check_foreign_constraint(
 | 
						|
/*=============================*/
 | 
						|
	ibool		check_ref,/*!< in: TRUE If we want to check that
 | 
						|
				the referenced table is ok, FALSE if we
 | 
						|
				want to check the foreign key table */
 | 
						|
	dict_foreign_t*	foreign,/*!< in: foreign constraint; NOTE that the
 | 
						|
				tables mentioned in it must be in the
 | 
						|
				dictionary cache if they exist at all */
 | 
						|
	dict_table_t*	table,	/*!< in: if check_ref is TRUE, then the foreign
 | 
						|
				table, else the referenced table */
 | 
						|
	dtuple_t*	entry,	/*!< in: index entry for index */
 | 
						|
	que_thr_t*	thr);	/*!< in: query thread */
 | 
						|
/*********************************************************************//**
 | 
						|
Creates an insert node struct.
 | 
						|
@return	own: insert node struct */
 | 
						|
UNIV_INTERN
 | 
						|
ins_node_t*
 | 
						|
ins_node_create(
 | 
						|
/*============*/
 | 
						|
	ulint		ins_type,	/*!< in: INS_VALUES, ... */
 | 
						|
	dict_table_t*	table,		/*!< in: table where to insert */
 | 
						|
	mem_heap_t*	heap);		/*!< in: mem heap where created */
 | 
						|
/*********************************************************************//**
 | 
						|
Sets a new row to insert for an INS_DIRECT node. This function is only used
 | 
						|
if we have constructed the row separately, which is a rare case; this
 | 
						|
function is quite slow. */
 | 
						|
UNIV_INTERN
 | 
						|
void
 | 
						|
ins_node_set_new_row(
 | 
						|
/*=================*/
 | 
						|
	ins_node_t*	node,	/*!< in: insert node */
 | 
						|
	dtuple_t*	row);	/*!< in: new row (or first row) for the node */
 | 
						|
/***************************************************************//**
 | 
						|
Inserts an index entry to index. Tries first optimistic, then pessimistic
 | 
						|
descent down the tree. If the entry matches enough to a delete marked record,
 | 
						|
performs the insert by updating or delete unmarking the delete marked
 | 
						|
record.
 | 
						|
@return	DB_SUCCESS, DB_LOCK_WAIT, DB_DUPLICATE_KEY, or some other error code */
 | 
						|
UNIV_INTERN
 | 
						|
ulint
 | 
						|
row_ins_index_entry(
 | 
						|
/*================*/
 | 
						|
	dict_index_t*	index,	/*!< in: index */
 | 
						|
	dtuple_t*	entry,	/*!< in: index entry to insert */
 | 
						|
	ulint		n_ext,	/*!< in: number of externally stored columns */
 | 
						|
	ibool		foreign,/*!< in: TRUE=check foreign key constraints */
 | 
						|
	que_thr_t*	thr);	/*!< in: query thread */
 | 
						|
/***********************************************************//**
 | 
						|
Inserts a row to a table. This is a high-level function used in
 | 
						|
SQL execution graphs.
 | 
						|
@return	query thread to run next or NULL */
 | 
						|
UNIV_INTERN
 | 
						|
que_thr_t*
 | 
						|
row_ins_step(
 | 
						|
/*=========*/
 | 
						|
	que_thr_t*	thr);	/*!< in: query thread */
 | 
						|
/***********************************************************//**
 | 
						|
Creates an entry template for each index of a table. */
 | 
						|
UNIV_INTERN
 | 
						|
void
 | 
						|
ins_node_create_entry_list(
 | 
						|
/*=======================*/
 | 
						|
	ins_node_t*	node);	/*!< in: row insert node */
 | 
						|
 | 
						|
/* Insert node structure */
 | 
						|
 | 
						|
struct ins_node_struct{
 | 
						|
	que_common_t	common;	/*!< node type: QUE_NODE_INSERT */
 | 
						|
	ulint		ins_type;/* INS_VALUES, INS_SEARCHED, or INS_DIRECT */
 | 
						|
	dtuple_t*	row;	/*!< row to insert */
 | 
						|
	dict_table_t*	table;	/*!< table where to insert */
 | 
						|
	sel_node_t*	select;	/*!< select in searched insert */
 | 
						|
	que_node_t*	values_list;/* list of expressions to evaluate and
 | 
						|
				insert in an INS_VALUES insert */
 | 
						|
	ulint		state;	/*!< node execution state */
 | 
						|
	dict_index_t*	index;	/*!< NULL, or the next index where the index
 | 
						|
				entry should be inserted */
 | 
						|
	dtuple_t*	entry;	/*!< NULL, or entry to insert in the index;
 | 
						|
				after a successful insert of the entry,
 | 
						|
				this should be reset to NULL */
 | 
						|
	UT_LIST_BASE_NODE_T(dtuple_t)
 | 
						|
			entry_list;/* list of entries, one for each index */
 | 
						|
	byte*		row_id_buf;/* buffer for the row id sys field in row */
 | 
						|
	trx_id_t	trx_id;	/*!< trx id or the last trx which executed the
 | 
						|
				node */
 | 
						|
	byte*		trx_id_buf;/* buffer for the trx id sys field in row */
 | 
						|
	mem_heap_t*	entry_sys_heap;
 | 
						|
				/* memory heap used as auxiliary storage;
 | 
						|
				entry_list and sys fields are stored here;
 | 
						|
				if this is NULL, entry list should be created
 | 
						|
				and buffers for sys fields in row allocated */
 | 
						|
	ulint		magic_n;
 | 
						|
};
 | 
						|
 | 
						|
#define	INS_NODE_MAGIC_N	15849075
 | 
						|
 | 
						|
/* Insert node types */
 | 
						|
#define INS_SEARCHED	0	/* INSERT INTO ... SELECT ... */
 | 
						|
#define INS_VALUES	1	/* INSERT INTO ... VALUES ... */
 | 
						|
#define INS_DIRECT	2	/* this is for internal use in dict0crea:
 | 
						|
				insert the row directly */
 | 
						|
 | 
						|
/* Node execution states */
 | 
						|
#define	INS_NODE_SET_IX_LOCK	1	/* we should set an IX lock on table */
 | 
						|
#define INS_NODE_ALLOC_ROW_ID	2	/* row id should be allocated */
 | 
						|
#define	INS_NODE_INSERT_ENTRIES 3	/* index entries should be built and
 | 
						|
					inserted */
 | 
						|
 | 
						|
#ifndef UNIV_NONINL
 | 
						|
#include "row0ins.ic"
 | 
						|
#endif
 | 
						|
 | 
						|
#endif
 |