mtr0mtr.h 12.3 KB
Newer Older
osku's avatar
osku committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/******************************************************
Mini-transaction buffer

(c) 1995 Innobase Oy

Created 11/26/1995 Heikki Tuuri
*******************************************************/

#ifndef mtr0mtr_h
#define mtr0mtr_h

#include "univ.i"
#include "mem0mem.h"
#include "dyn0dyn.h"
#include "buf0types.h"
#include "sync0rw.h"
#include "ut0byte.h"
#include "mtr0types.h"
#include "page0types.h"

/* Logging modes for a mini-transaction */
#define MTR_LOG_ALL		21	/* default mode: log all operations
					modifying disk-based data */
#define	MTR_LOG_NONE		22	/* log no operations */
/*#define	MTR_LOG_SPACE	23 */	/* log only operations modifying
					file space page allocation data
					(operations in fsp0fsp.* ) */
#define	MTR_LOG_SHORT_INSERTS	24	/* inserts are logged in a shorter
					form */
30

osku's avatar
osku committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
/* Types for the mlock objects to store in the mtr memo; NOTE that the
first 3 values must be RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */
#define	MTR_MEMO_PAGE_S_FIX	RW_S_LATCH
#define	MTR_MEMO_PAGE_X_FIX	RW_X_LATCH
#define	MTR_MEMO_BUF_FIX	RW_NO_LATCH
#define MTR_MEMO_MODIFY		54
#define	MTR_MEMO_S_LOCK		55
#define	MTR_MEMO_X_LOCK		56

/* Log item types: we have made them to be of the type 'byte'
for the compiler to warn if val and type parameters are switched
in a call to mlog_write_ulint. NOTE! For 1 - 8 bytes, the
flag value must give the length also! */
#define	MLOG_SINGLE_REC_FLAG	128		/* if the mtr contains only
						one log record for one page,
						i.e., write_initial_log_record
						has been called only once,
						this flag is ORed to the type
						of that first log record */
50
#define	MLOG_1BYTE		(1)		/* one byte is written */
51 52 53
#define	MLOG_2BYTES		(2)		/* 2 bytes ... */
#define	MLOG_4BYTES		(4)		/* 4 bytes ... */
#define	MLOG_8BYTES		(8)		/* 8 bytes ... */
osku's avatar
osku committed
54
#define	MLOG_REC_INSERT		((byte)9)	/* record insert */
55
#define	MLOG_REC_CLUST_DELETE_MARK ((byte)10)	/* mark clustered index record
osku's avatar
osku committed
56
						deleted */
57
#define	MLOG_REC_SEC_DELETE_MARK ((byte)11)	/* mark secondary index record
osku's avatar
osku committed
58 59 60 61 62
						deleted */
#define MLOG_REC_UPDATE_IN_PLACE ((byte)13)	/* update of a record,
						preserves record field sizes */
#define MLOG_REC_DELETE		((byte)14)	/* delete a record from a
						page */
63
#define	MLOG_LIST_END_DELETE	((byte)15)	/* delete record list end on
osku's avatar
osku committed
64
						index page */
65
#define	MLOG_LIST_START_DELETE	((byte)16)	/* delete record list start on
osku's avatar
osku committed
66
						index page */
67
#define	MLOG_LIST_END_COPY_CREATED ((byte)17)	/* copy record list end to a
osku's avatar
osku committed
68
						new created index page */
69 70 71
#define	MLOG_PAGE_REORGANIZE	((byte)18)	/* reorganize an index page */
#define MLOG_PAGE_CREATE	((byte)19)	/* create an index page */
#define	MLOG_UNDO_INSERT	((byte)20)	/* insert entry in an undo
osku's avatar
osku committed
72
						log */
73 74
#define MLOG_UNDO_ERASE_END	((byte)21)	/* erase an undo log
						page end */
75
#define	MLOG_UNDO_INIT		((byte)22)	/* initialize a page in an
osku's avatar
osku committed
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
						undo log */
#define MLOG_UNDO_HDR_DISCARD	((byte)23)	/* discard an update undo log
						header */
#define	MLOG_UNDO_HDR_REUSE	((byte)24)	/* reuse an insert undo log
						header */
#define MLOG_UNDO_HDR_CREATE	((byte)25)	/* create an undo log header */
#define MLOG_REC_MIN_MARK	((byte)26)	/* mark an index record as the
						predefined minimum record */
#define MLOG_IBUF_BITMAP_INIT	((byte)27)	/* initialize an ibuf bitmap
						page */
/*#define	MLOG_FULL_PAGE	((byte)28)	full contents of a page */
#define MLOG_INIT_FILE_PAGE	((byte)29)	/* this means that a file page
						is taken into use and the prior
						contents of the page should be
						ignored: in recovery we must
						not trust the lsn values stored
						to the file page */
#define MLOG_WRITE_STRING	((byte)30)	/* write a string to a page */
#define	MLOG_MULTI_REC_END	((byte)31)	/* if a single mtr writes
						log records for several pages,
						this log record ends the
						sequence of these records */
#define MLOG_DUMMY_RECORD	((byte)32)	/* dummy log record used to
						pad a log block full */
#define MLOG_FILE_CREATE	((byte)33)	/* log record about an .ibd
						file creation */
#define MLOG_FILE_RENAME	((byte)34)	/* log record about an .ibd
						file rename */
#define MLOG_FILE_DELETE	((byte)35)	/* log record about an .ibd
						file deletion */
#define MLOG_COMP_REC_MIN_MARK	((byte)36)	/* mark a compact index record
						as the predefined minimum
						record */
#define MLOG_COMP_PAGE_CREATE	((byte)37)	/* create a compact
						index page */
#define MLOG_COMP_REC_INSERT	((byte)38)	/* compact record insert */
#define MLOG_COMP_REC_CLUST_DELETE_MARK ((byte)39)
						/* mark compact clustered index
						record deleted */
#define MLOG_COMP_REC_SEC_DELETE_MARK ((byte)40)/* mark compact secondary index
						record deleted; this log
						record type is redundant, as
						MLOG_REC_SEC_DELETE_MARK is
						independent of the record
						format. */
#define MLOG_COMP_REC_UPDATE_IN_PLACE ((byte)41)/* update of a compact record,
						preserves record field sizes */
#define MLOG_COMP_REC_DELETE	((byte)42)	/* delete a compact record
						from a page */
#define MLOG_COMP_LIST_END_DELETE ((byte)43)	/* delete compact record list
						end on index page */
#define MLOG_COMP_LIST_START_DELETE ((byte)44)	/* delete compact record list
						start on index page */
#define MLOG_COMP_LIST_END_COPY_CREATED ((byte)45)
						/* copy compact record list end
						to a new created index page */
#define MLOG_COMP_PAGE_REORGANIZE ((byte)46)	/* reorganize an index page */
133 134 135
#define MLOG_ZIP_FILE_CREATE	((byte)47)	/* log record about creating a
						compressed .ibd file */
#define MLOG_ZIP_WRITE_NODE_PTR	((byte)48)	/* write the node pointer of
136 137
						a record on a compressed
						non-leaf B-tree page */
138
#define MLOG_ZIP_WRITE_BLOB_PTR	((byte)49)	/* write the BLOB pointer
139 140
						of an externally stored column
						on a compressed page */
141
#define MLOG_ZIP_WRITE_HEADER	((byte)50)	/* write to compressed page
142
						header */
143 144
#define MLOG_ZIP_PAGE_COMPRESS	((byte)51)	/* compress an index page */
#define MLOG_BIGGEST_TYPE	((byte)51)	/* biggest value (used in
osku's avatar
osku committed
145
						asserts) */
146

osku's avatar
osku committed
147
/*******************************************************************
148
Starts a mini-transaction and creates a mini-transaction handle
osku's avatar
osku committed
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
and buffer in the memory buffer given by the caller. */
UNIV_INLINE
mtr_t*
mtr_start(
/*======*/
			/* out: mtr buffer which also acts as
			the mtr handle */
	mtr_t*	mtr);	/* in: memory buffer for the mtr buffer */
/*******************************************************************
Commits a mini-transaction. */

void
mtr_commit(
/*=======*/
	mtr_t*	mtr);	/* in: mini-transaction */
/**************************************************************
Sets and returns a savepoint in mtr. */
UNIV_INLINE
ulint
mtr_set_savepoint(
/*==============*/
			/* out: savepoint */
	mtr_t*	mtr);	/* in: mtr */
/**************************************************************
Releases the latches stored in an mtr memo down to a savepoint.
NOTE! The mtr must not have made changes to buffer pages after the
savepoint, as these can be handled only by mtr_commit. */

void
mtr_rollback_to_savepoint(
/*======================*/
	mtr_t*	mtr,		/* in: mtr */
	ulint	savepoint);	/* in: savepoint */
/**************************************************************
Releases the (index tree) s-latch stored in an mtr memo after a
savepoint. */
UNIV_INLINE
void
mtr_release_s_latch_at_savepoint(
/*=============================*/
	mtr_t*		mtr,		/* in: mtr */
	ulint		savepoint,	/* in: savepoint */
191
	rw_lock_t*	lock);		/* in: latch to release */
osku's avatar
osku committed
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
/*******************************************************************
Gets the logging mode of a mini-transaction. */
UNIV_INLINE
ulint
mtr_get_log_mode(
/*=============*/
			/* out: logging mode: MTR_LOG_NONE, ... */
	mtr_t*	mtr);	/* in: mtr */
/*******************************************************************
Changes the logging mode of a mini-transaction. */
UNIV_INLINE
ulint
mtr_set_log_mode(
/*=============*/
			/* out: old mode */
	mtr_t*	mtr,	/* in: mtr */
	ulint	mode);	/* in: logging mode: MTR_LOG_NONE, ... */
/************************************************************
Reads 1 - 4 bytes from a file page buffered in the buffer pool. */

ulint
mtr_read_ulint(
/*===========*/
215 216 217 218
				/* out: value read */
	const byte*	ptr,	/* in: pointer from where to read */
	ulint		type,	/* in: MLOG_1BYTE, MLOG_2BYTES, MLOG_4BYTES */
	mtr_t*		mtr);	/* in: mini-transaction handle */
osku's avatar
osku committed
219 220 221 222 223
/************************************************************
Reads 8 bytes from a file page buffered in the buffer pool. */

dulint
mtr_read_dulint(
224
/*============*/
225 226 227
				/* out: value read */
	const byte*	ptr,	/* in: pointer from where to read */
	mtr_t*		mtr);	/* in: mini-transaction handle */
osku's avatar
osku committed
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
/*************************************************************************
This macro locks an rw-lock in s-mode. */
#define mtr_s_lock(B, MTR)	mtr_s_lock_func((B), __FILE__, __LINE__,\
						(MTR))
/*************************************************************************
This macro locks an rw-lock in x-mode. */
#define mtr_x_lock(B, MTR)	mtr_x_lock_func((B), __FILE__, __LINE__,\
						(MTR))
/*************************************************************************
NOTE! Use the macro above!
Locks a lock in s-mode. */
UNIV_INLINE
void
mtr_s_lock_func(
/*============*/
	rw_lock_t*	lock,	/* in: rw-lock */
	const char*	file,	/* in: file name */
	ulint		line,	/* in: line number */
	mtr_t*		mtr);	/* in: mtr */
/*************************************************************************
NOTE! Use the macro above!
Locks a lock in x-mode. */
UNIV_INLINE
void
mtr_x_lock_func(
/*============*/
	rw_lock_t*	lock,	/* in: rw-lock */
	const char*	file,	/* in: file name */
	ulint		line,	/* in: line number */
	mtr_t*		mtr);	/* in: mtr */

/*******************************************************
Releases an object in the memo stack. */

void
mtr_memo_release(
/*=============*/
	mtr_t*	mtr,	/* in: mtr */
	void*	object,	/* in: object */
	ulint	type);	/* in: object type: MTR_MEMO_S_LOCK, ... */
268
#ifdef UNIV_DEBUG
osku's avatar
osku committed
269 270 271 272 273 274
/**************************************************************
Checks if memo contains the given item. */
UNIV_INLINE
ibool
mtr_memo_contains(
/*==============*/
275 276 277 278
				/* out: TRUE if contains */
	mtr_t*		mtr,	/* in: mtr */
	const void*	object,	/* in: object to search */
	ulint		type);	/* in: type of object */
279 280 281 282 283 284 285

/**************************************************************
Checks if memo contains the given page. */

ibool
mtr_memo_contains_page(
/*===================*/
286 287 288 289
				/* out: TRUE if contains */
	mtr_t*		mtr,	/* in: mtr */
	const byte*	ptr,	/* in: pointer to buffer frame */
	ulint		type);	/* in: type of object */
osku's avatar
osku committed
290 291 292 293 294 295 296
/*************************************************************
Prints info of an mtr handle. */

void
mtr_print(
/*======*/
	mtr_t*	mtr);	/* in: mtr */
297
#endif /* UNIV_DEBUG */
osku's avatar
osku committed
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
/*######################################################################*/

#define	MTR_BUF_MEMO_SIZE	200	/* number of slots in memo */

/*******************************************************************
Returns the log object of a mini-transaction buffer. */
UNIV_INLINE
dyn_array_t*
mtr_get_log(
/*========*/
			/* out: log */
	mtr_t*	mtr);	/* in: mini-transaction */
/*******************************************************
Pushes an object to an mtr memo stack. */
UNIV_INLINE
void
mtr_memo_push(
/*==========*/
	mtr_t*	mtr,	/* in: mtr */
	void*	object,	/* in: object */
	ulint	type);	/* in: object type: MTR_MEMO_S_LOCK, ... */


/* Type definition of a mini-transaction memo stack slot. */
typedef	struct mtr_memo_slot_struct	mtr_memo_slot_t;
struct mtr_memo_slot_struct{
	ulint	type;	/* type of the stored object (MTR_MEMO_S_LOCK, ...) */
	void*	object;	/* pointer to the object */
};

/* Mini-transaction handle and buffer */
struct mtr_struct{
marko's avatar
marko committed
330
#ifdef UNIV_DEBUG
osku's avatar
osku committed
331
	ulint		state;	/* MTR_ACTIVE, MTR_COMMITTING, MTR_COMMITTED */
marko's avatar
marko committed
332
#endif
osku's avatar
osku committed
333 334 335 336 337 338 339 340 341 342
	dyn_array_t	memo;	/* memo stack for locks etc. */
	dyn_array_t	log;	/* mini-transaction log */
	ibool		modifications;
				/* TRUE if the mtr made modifications to
				buffer pool pages */
	ulint		n_log_recs;
				/* count of how many page initial log records
				have been written to the mtr log */
	ulint		log_mode; /* specifies which operations should be
				logged; default value MTR_LOG_ALL */
343
	ib_uint64_t	start_lsn;/* start lsn of the possible log entry for
osku's avatar
osku committed
344
				this mtr */
345
	ib_uint64_t	end_lsn;/* end lsn of the possible log entry for
osku's avatar
osku committed
346 347 348 349 350 351 352 353 354
				this mtr */
	ulint		magic_n;
};

#define	MTR_MAGIC_N		54551

#define MTR_ACTIVE		12231
#define MTR_COMMITTING		56456
#define MTR_COMMITTED		34676
355

osku's avatar
osku committed
356 357 358 359 360
#ifndef UNIV_NONINL
#include "mtr0mtr.ic"
#endif

#endif