summaryrefslogtreecommitdiff
path: root/storage/xtradb/include/fil0fil.ic
blob: 1179eea8b8e69d515d402dd547e890415f31ee39 (plain)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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
/*****************************************************************************

Copyright (c) 2015, MariaDB Corporation.

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.,
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA

*****************************************************************************/

/**************************************************//**
@file include/fil0fil.ic
The low-level file system support functions

Created 31/03/2015 Jan Lindström
*******************************************************/

#ifndef fil0fil_ic
#define fil0fil_ic

/*******************************************************************//**
Return space name */
UNIV_INLINE
char*
fil_space_name(
/*===========*/
	fil_space_t*	space)	/*!< in: space */
{
	return (space->name);
}

/*******************************************************************//**
Return space flags */
UNIV_INLINE
ulint
fil_space_flags(
/*===========*/
	fil_space_t*	space)	/*!< in: space */
{
	return (space->flags);
}

/*******************************************************************//**
Return page type name */
UNIV_INLINE
const char*
fil_get_page_type_name(
/*===================*/
	ulint	page_type)	/*!< in: FIL_PAGE_TYPE */
{
	switch(page_type) {
	case FIL_PAGE_PAGE_COMPRESSED:
		return "PAGE_COMPRESSED";
	case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED:
		return "PAGE_COMPRESSED_ENCRYPTED";
	case FIL_PAGE_INDEX:
		return "INDEX";
	case FIL_PAGE_UNDO_LOG:
		return "UNDO LOG";
	case FIL_PAGE_INODE:
		return "INODE";
	case FIL_PAGE_IBUF_FREE_LIST:
		return "IBUF_FREE_LIST";
	case FIL_PAGE_TYPE_ALLOCATED:
		return "ALLOCATED";
	case FIL_PAGE_IBUF_BITMAP:
		return "IBUF_BITMAP";
	case FIL_PAGE_TYPE_SYS:
		return "SYS";
	case FIL_PAGE_TYPE_TRX_SYS:
		return "TRX_SYS";
	case FIL_PAGE_TYPE_FSP_HDR:
		return "FSP_HDR";
	case FIL_PAGE_TYPE_XDES:
		return "XDES";
	case FIL_PAGE_TYPE_BLOB:
		return "BLOB";
	case FIL_PAGE_TYPE_ZBLOB:
		return "ZBLOB";
	case FIL_PAGE_TYPE_ZBLOB2:
		return "ZBLOB2";
	case FIL_PAGE_TYPE_COMPRESSED:
		return "ORACLE PAGE COMPRESSED";
	}

	return "PAGE TYPE CORRUPTED";

}

/****************************************************************//**
Get block size from fil node
@return block size*/
UNIV_INLINE
ulint
fil_node_get_block_size(
/*====================*/
	fil_node_t*     node)		/*!< in: Node where to get block
					size */
{
	return (node->file_block_size);
}

/****************************************************************//**
Validate page type.
@return true if valid, false if not */
UNIV_INLINE
bool
fil_page_type_validate(
	const byte*	page)	/*!< in: page */
{
#ifdef UNIV_DEBUG
	ulint page_type = mach_read_from_2(page + FIL_PAGE_TYPE);

	/* Validate page type */
	if (!((page_type == FIL_PAGE_PAGE_COMPRESSED ||
		page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED ||
		page_type == FIL_PAGE_INDEX ||
		page_type == FIL_PAGE_UNDO_LOG ||
		page_type == FIL_PAGE_INODE ||
		page_type == FIL_PAGE_IBUF_FREE_LIST ||
		page_type == FIL_PAGE_TYPE_ALLOCATED ||
		page_type == FIL_PAGE_IBUF_BITMAP ||
		page_type == FIL_PAGE_TYPE_SYS ||
		page_type == FIL_PAGE_TYPE_TRX_SYS ||
		page_type == FIL_PAGE_TYPE_FSP_HDR ||
		page_type == FIL_PAGE_TYPE_XDES ||
		page_type == FIL_PAGE_TYPE_BLOB ||
		page_type == FIL_PAGE_TYPE_ZBLOB ||
		page_type == FIL_PAGE_TYPE_ZBLOB2 ||
		page_type == FIL_PAGE_TYPE_COMPRESSED))) {

		uint key_version = mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION);
		bool page_compressed = (page_type == FIL_PAGE_PAGE_COMPRESSED);
		bool page_compressed_encrypted = (page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED);
		ulint space = mach_read_from_4(page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
		ulint offset = mach_read_from_4(page + FIL_PAGE_OFFSET);
		ib_uint64_t lsn = mach_read_from_8(page + FIL_PAGE_LSN);
		ulint compressed_len = mach_read_from_2(page + FIL_PAGE_DATA);
		fil_system_enter();
		fil_space_t* rspace = fil_space_get_by_id(space);
		fil_system_exit();


		/* Dump out the page info */
		fprintf(stderr, "InnoDB: Space %lu offset %lu name %s page_type %lu page_type_name %s\n"
			"InnoDB: key_version %u page_compressed %d page_compressed_encrypted %d lsn %llu compressed_len %lu\n",
			space, offset, rspace->name, page_type, fil_get_page_type_name(page_type),
			key_version, page_compressed, page_compressed_encrypted, (ulonglong)lsn, compressed_len);
		fflush(stderr);

		ut_ad(page_type == FIL_PAGE_PAGE_COMPRESSED ||
			page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED ||
			page_type == FIL_PAGE_INDEX ||
			page_type == FIL_PAGE_UNDO_LOG ||
			page_type == FIL_PAGE_INODE ||
			page_type == FIL_PAGE_IBUF_FREE_LIST ||
			page_type == FIL_PAGE_TYPE_ALLOCATED ||
			page_type == FIL_PAGE_IBUF_BITMAP ||
			page_type == FIL_PAGE_TYPE_SYS ||
			page_type == FIL_PAGE_TYPE_TRX_SYS ||
			page_type == FIL_PAGE_TYPE_FSP_HDR ||
			page_type == FIL_PAGE_TYPE_XDES ||
			page_type == FIL_PAGE_TYPE_BLOB ||
			page_type == FIL_PAGE_TYPE_ZBLOB ||
			page_type == FIL_PAGE_TYPE_ZBLOB2 ||
			page_type == FIL_PAGE_TYPE_COMPRESSED);
		return false;
	}

#endif /* UNIV_DEBUG */
	return true;
}

#endif /* fil0fil_ic */