MySQL 8.0.37
Source Code Documentation
fil0fil.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 1995, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/fil0fil.h
29 The low-level file system
30
31 Created 10/25/1995 Heikki Tuuri
32 *******************************************************/
33
34#ifndef fil0fil_h
35#define fil0fil_h
36
37#include "univ.i"
38
39#include "dict0types.h"
40#include "fil0types.h"
41#include "log0recv.h"
42#include "page0size.h"
43#ifndef UNIV_HOTBACKUP
44#include "ibuf0types.h"
45#endif /* !UNIV_HOTBACKUP */
46#include "ut0new.h"
47
48#include "m_ctype.h"
49#include "sql/dd/object_id.h"
50
51#include <atomic>
52#include <cstdint>
53#include <list>
54#include <vector>
55
56extern ulong srv_fast_shutdown;
57
58/** Maximum number of tablespaces to be scanned by a thread while scanning
59for available tablespaces during server startup. This is a hard maximum.
60If the number of files to be scanned is more than
61FIL_SCAN_MAX_TABLESPACES_PER_THREAD,
62then additional threads will be spawned to scan the additional files in
63parallel. */
65
66/** Maximum number of threads that will be used for scanning the tablespace
67files. This can be further adjusted depending on the number of available
68cores. */
69constexpr size_t FIL_SCAN_MAX_THREADS = 16;
70
71/** Number of threads per core. */
72constexpr size_t FIL_SCAN_THREADS_PER_CORE = 2;
73
74/** Calculate the number of threads that can be spawned to scan the given
75number of files taking into the consideration, number of cores available
76on the machine.
77@param[in] num_files Number of files to be scanned
78@return number of threads to be spawned for scanning the files */
79size_t fil_get_scan_threads(size_t num_files);
80
81/** This tablespace name is used internally during file discovery to open a
82general tablespace before the data dictionary is recovered and available. */
83static constexpr char general_space_name[] = "innodb_general";
84
85/** This tablespace name is used as the prefix for implicit undo tablespaces
86and during file discovery to open an undo tablespace before the DD is
87recovered and available. */
88static constexpr char undo_space_name[] = "innodb_undo";
89
90extern volatile bool recv_recovery_on;
91
92/** Initial size of an UNDO tablespace when it is created new
93or truncated under low load.
94page size | FSP_EXTENT_SIZE | Initial Size | Pages
95----------+------------------+--------------+-------
96 4 KB | 256 pages = 1 MB | 16 MB | 4096
97 8 KB | 128 pages = 1 MB | 16 MB | 2048
98 16 KB | 64 pages = 1 MB | 16 MB | 1024
99 32 KB | 64 pages = 2 MB | 16 MB | 512
100 64 KB | 64 pages = 4 MB | 16 MB | 256 */
101constexpr uint32_t UNDO_INITIAL_SIZE = 16 * 1024 * 1024;
102#define UNDO_INITIAL_SIZE_IN_PAGES \
103 os_offset_t { UNDO_INITIAL_SIZE / srv_page_size }
104
105#ifdef UNIV_HOTBACKUP
106#include <unordered_set>
107using Dir_set = std::unordered_set<std::string>;
108extern Dir_set rem_gen_ts_dirs;
109extern bool replay_in_datadir;
110#endif /* UNIV_HOTBACKUP */
111
112// Forward declaration
113struct trx_t;
114class page_id_t;
115
116using Filenames = std::vector<std::string, ut::allocator<std::string>>;
117using Space_ids = std::vector<space_id_t, ut::allocator<space_id_t>>;
118
119/** File types */
120enum fil_type_t : uint8_t {
121 /** temporary tablespace (temporary undo log or tables) */
123 /** a tablespace that is being imported (no logging until finished) */
125 /** persistent tablespace (for system, undo log or tables) */
127};
128
129/** Result of comparing a path. */
130enum class Fil_state {
131 /** The path matches what was found during the scan. */
132 MATCHES,
133
134 /** No MLOG_FILE_DELETE record and the file could not be found. */
135 MISSING,
136
137 /** A MLOG_FILE_DELETE was found, file was deleted. */
138 DELETED,
139
140 /** Space ID matches but the paths don't match. */
141 MOVED,
142
143 /** Tablespace and/or filename was renamed. The DDL log will handle
144 this case. */
145 RENAMED
146};
147
148struct fil_space_t;
149
150/** File node of a tablespace or the log data space */
152 /** Returns true if the file can be closed. */
153 bool can_be_closed() const;
154 /** Returns true if the file is flushed. */
155 bool is_flushed() const {
158 }
159 /** Sets file to flushed state. */
161
163
164 /** tablespace containing this file */
166
167 /** file name; protected by Fil_shard::m_mutex and log_sys->mutex. */
168 char *name;
169
170 /** whether this file is open. Note: We set the is_open flag after
171 we increase the write the MLOG_FILE_OPEN record to redo log. Therefore
172 we increment the in_use reference count before setting the OPEN flag. */
174
175 /** file handle (valid if is_open) */
177
178 /** event that groups and serializes calls to fsync */
180
181 /** whether the file actually is a raw device or disk partition */
183
184 /** size of the file in database pages (0 if not known yet);
185 the possible last incomplete megabyte may be ignored
186 if space->id == 0 */
188
189 /** Size of the file when last flushed, used to force the flush when file
190 grows to keep the filesystem metadata synced when using O_DIRECT_NO_FSYNC */
192
193 /** initial size of the file in database pages;
194 FIL_IBD_FILE_INITIAL_SIZE by default */
196
197 /** maximum size of the file in database pages */
199
200 /** count of pending I/O's; is_open must be true if nonzero */
202
203 /** count of pending flushes; is_open must be true if nonzero */
205
206 /** Set to true when a file is being extended. */
208
209 /** number of writes to the file since the system was started */
211
212 /** the modification_counter of the latest flush to disk */
214
215 /** link to the fil_system->LRU list (keeping track of open files) */
217
218 /** whether the file system of this file supports PUNCH HOLE */
220
221 /** block size to use for punching holes */
223
224 /** whether atomic write is enabled for this file */
226
227 /** FIL_NODE_MAGIC_N */
228 size_t magic_n;
229};
230
231/** Tablespace or log data space */
234 using Files = std::vector<fil_node_t, ut::allocator<fil_node_t>>;
235
236 /** Release the reserved free extents.
237 @param[in] n_reserved number of reserved extents */
238 void release_free_extents(ulint n_reserved);
239
240 /** @return true if the instance is queued for deletion. Guarantees the space
241 is not deleted as long as the fil_shard mutex is not released. */
242 bool is_deleted() const;
243
244 /** @return true if the instance was not queued for deletion. It does not
245 guarantee it is not queued for deletion at the moment. */
246 bool was_not_deleted() const;
247
248 /** Marks the space object for deletion. It will bump the space object version
249 and cause all pages in buffer pool that reference to the current space
250 object version to be stale and be freed on first encounter. */
251 void set_deleted();
252
253#ifndef UNIV_HOTBACKUP
254 /** Returns current version of the space object. It is being bumped when the
255 space is truncated or deleted. Guarantees the version returned is up to date
256 as long as fil_shard mutex is not released.*/
257 uint32_t get_current_version() const;
258
259 /** Returns current version of the space object. It is being bumped when the
260 space is truncated or deleted. It does not guarantee the version is current
261 one.*/
262 uint32_t get_recent_version() const;
263
264 /** Bumps the space object version and cause all pages in buffer pool that
265 reference the current space object version to be stale and be freed on
266 first encounter. */
267 void bump_version();
268
269 /** @return true if this space does not have any more references. Guarantees
270 the result only if true was returned. */
271 bool has_no_references() const;
272
273 /** @return Current number of references to the space. This method
274 should be called only while shutting down the server. Only when there is no
275 background nor user session activity the returned value will be valid. */
276 size_t get_reference_count() const;
277
278 /** Increment the page reference count. */
279 void inc_ref() noexcept {
280 /* We assume space is protected from being removed either through
281 n_pending_ops or m_n_ref_count already bumped, OR MDL latch is
282 protecting it, OR it is a private space. Bumping the n_pending_ops
283 can be done only under fil shard mutex and stopping new bumps is also
284 done under this mutex */
285 const auto o = m_n_ref_count.fetch_add(1);
286 ut_a(o != std::numeric_limits<size_t>::max());
287 }
288
289 /** Decrement the page reference count. */
290 void dec_ref() noexcept {
291 const auto o = m_n_ref_count.fetch_sub(1);
292 ut_a(o >= 1);
293 }
294#endif /* !UNIV_HOTBACKUP */
295
296#ifdef UNIV_DEBUG
297 /** Print the extent descriptor pages of this tablespace into
298 the given output stream.
299 @param[in] out the output stream.
300 @return the output stream. */
301 std::ostream &print_xdes_pages(std::ostream &out) const;
302
303 /** Print the extent descriptor pages of this tablespace into
304 the given file.
305 @param[in] filename the output file name. */
306 void print_xdes_pages(const char *filename) const;
307#endif /* UNIV_DEBUG */
308
309 public:
311 using Flush_observers = std::vector<Observer *, ut::allocator<Observer *>>;
312
313 /** When the tablespace was extended last. */
315
316 /** Extend undo tablespaces by so many pages. */
318
319 /** When an undo tablespace has been initialized with required header pages,
320 that size is recorded here. Auto-truncation happens when the file size
321 becomes bigger than both this and srv_max_undo_log_size. */
323
324 /** Tablespace name */
325 char *name{};
326
327 /** Tablespace ID */
329
330 /** Initializes fields. This could be replaced by a constructor if SunPro is
331 compiling it correctly. */
332 void initialize() noexcept {
334 new (&files) fil_space_t::Files();
335
336#ifndef UNIV_HOTBACKUP
337 new (&m_version) std::atomic<uint32_t>;
338 new (&m_n_ref_count) std::atomic_size_t;
339 new (&m_deleted) std::atomic<bool>;
340#endif /* !UNIV_HOTBACKUP */
341 }
342
343 private:
344#ifndef UNIV_HOTBACKUP
345 /** All pages in the buffer pool that reference this fil_space_t instance with
346 version before this version can be lazily freed or reused as free pages.
347 They should be rejected if there is an attempt to write them to disk.
348
349 Writes to m_version are guarded by the exclusive MDL/table lock latches
350 acquired by the caller, as stated in docs. Note that the Fil_shard mutex seems
351 to be latched in 2 of 3 usages only, so is not really an alternative.
352
353 Existence of the space object during reads is assured during these operations:
354 1. when read by the buf_page_init_low on page read/creation - the caller must
355 have acquired shared MDL/table lock latches.
356 2. when read on buf_page_t::is_stale() on page access for a query or for purge
357 operation. The caller must have acquired shared MDL/table lock latches.
358 3. when read on buf_page_t::is_stale() on page access from LRU list, flush
359 list or whatever else. Here, the fact that the page has latched the space
360 using the reference counting system is what guards the space existence.
361
362 When reading the value for the page being created with buf_page_init_low we
363 have the MDL latches on table that is in tablespace or the tablespace alone,
364 so we won't be able to bump m_version until they are released, so we will
365 read the current value of the version. When reading the value for the page
366 validation with buf_page_t::is_stale(), we will either:
367 a) have the MDL latches required in at least S mode in case we need to be
368 certain if the page is stale, to use it in a query or in purge operation, or
369 b) in case we don't not have the MDL latches, we may read an outdated value.
370 This happens for pages that are seen during for example LRU or flush page
371 scans. These pages are not needed for the query itself. The read is to decide
372 if the page can be safely discarded. Reading incorrect value can lead to no
373 action being executed. Reading incorrect value can't lead to page being
374 incorrectly evicted.
375 */
376 std::atomic<uint32_t> m_version{};
377
378 /** Number of buf_page_t entries that point to this instance.
379
380 This field is guarded by the Fil_shard mutex and the "reference
381 count system". The reference count system here is allowing to take a "latch"
382 on the space by incrementing the reference count, and release it by
383 decrementing it.
384
385 The increments are possible from two places:
386 1. buf_page_init_low is covered by the existing MDL/table lock latches only
387 and the fact that the space it is using is a current version of the space
388 (the version itself is also guarded by these MDL/table lock latches). It
389 implicitly acquires the "reference count system" latch after this operation.
390 2. buf_page_t::buf_page_t(const buf_page_t&) copy constructor - increases the
391 value, but it assumes the page being copied from has "reference count system"
392 latch so the reference count is greater than 0 during this constructor call.
393
394 For decrementing the reference count is itself a latch allowing for the safe
395 decrement.
396
397 The value is checked for being 0 in Fil_shard::checkpoint under the Fil_shard
398 mutex, and only if the space is deleted.
399 Observing m_n_ref_count==0 might trigger freeing the object. No other thread
400 can be during the process of incrementing m_n_ref_count from 0 to 1 in
401 parallel to this check. This is impossible for following reasons. Recall the
402 only two places where we do increments listed above:
403 1. If the space is deleted, then MDL/table lock latches guarantee there are
404 no users that would be able to see it as the current version of space and thus
405 will not attempt to increase the reference value from 0.
406 2. The buf_page_t copy constructor can increase it, but it assumes the page
407 being copied from has "reference count system" latch so the reference count is
408 greater than 0 during this constructor call.
409
410 There is also an opposite race possible: while we check for ref count being
411 zero, another thread may be decrementing it in parallel, and we might miss
412 that if we check too soon. This is benign, as it will result in us not
413 reclaiming the memory we could (but not have to) free, and will return to the
414 check on next checkpoint.
415 */
416 std::atomic_size_t m_n_ref_count{};
417#endif /* !UNIV_HOTBACKUP */
418
419 /** true if the tablespace is marked for deletion. */
420 std::atomic_bool m_deleted{};
421
422 public:
423 /** true if we want to rename the .ibd file of tablespace and
424 want to temporarily prevent other threads from opening the file that is being
425 renamed. */
427
428 /** Throttles writing to log a message about long waiting for file to perform
429 rename. */
431
432 /** We set this true when we start deleting a single-table
433 tablespace. When this is set following new ops are not allowed:
434 * read IO request
435 * ibuf merge
436 * file flush
437 Note that we can still possibly have new write operations because we
438 don't check this flag when doing flush batches. */
440
441#ifdef UNIV_DEBUG
442 /** Reference count for operations who want to skip redo log in
443 the file space in order to make fsp_space_modify_check pass. */
445#endif /* UNIV_DEBUG */
446
447 /** Purpose */
449
450 /** Files attached to this tablespace. Note: Only the system tablespace
451 can have multiple files, this is a legacy issue. */
453
454 /** Tablespace file size in pages; 0 if not known yet */
456
457 /** FSP_SIZE in the tablespace header; 0 if not known yet */
459
460 /** Autoextend size */
462
463 /** Length of the FSP_FREE list */
464 uint32_t free_len{};
465
466 /** Contents of FSP_FREE_LIMIT */
468
469 /** Tablespace flags; see fsp_flags_is_valid() and
470 page_size_t(ulint) (constructor).
471 This is protected by space->latch and tablespace MDL */
472 uint32_t flags{};
473
474 /** Number of reserved free extents for ongoing operations like
475 B-tree page split */
477
478 /** This is positive when flushing the tablespace to disk;
479 dropping of the tablespace is forbidden if this is positive */
481
482 /** This is positive when we have pending operations against this
483 tablespace. The pending operations can be ibuf merges or lock
484 validation code trying to read a block. Dropping of the tablespace
485 is forbidden if this is positive. Protected by Fil_shard::m_mutex. */
486 uint32_t n_pending_ops{};
487
488#ifndef UNIV_HOTBACKUP
489 /** Latch protecting the file space storage allocation */
491#endif /* !UNIV_HOTBACKUP */
492
493 /** List of spaces with at least one unflushed file we have
494 written to */
496
497 /** true if this space is currently in unflushed_spaces */
499
500 /** Compression algorithm */
502
503 /** Encryption metadata */
505
506 /** Encryption is in progress */
508
509 /** Flush lsn of header page. It is used only during recovery */
511
512 /** FIL_SPACE_MAGIC_N */
514
515 /** System tablespace */
517
518 /** Check if the tablespace is compressed.
519 @return true if compressed, false otherwise. */
520 [[nodiscard]] bool is_compressed() const noexcept {
522 }
523
524 /** Check if the tablespace is encrypted.
525 @return true if encrypted, false otherwise. */
526 [[nodiscard]] bool is_encrypted() const noexcept {
528 }
529
530 /** Check if the encryption details, like the encryption key, type and
531 other details, that are needed to carry out encryption are available.
532 @return true if encryption can be done, false otherwise. */
533 [[nodiscard]] bool can_encrypt() const noexcept {
535 }
536
537 public:
538 /** Get the file node corresponding to the given page number of the
539 tablespace.
540 @param[in,out] page_no Caller passes the page number within a tablespace.
541 After return, it contains the page number within
542 the returned file node. For tablespaces containing
543 only one file, the given page_no will not change.
544 @return the file node object. */
545 [[nodiscard]] fil_node_t *get_file_node(page_no_t *page_no) noexcept;
546};
547
548/** Value of fil_space_t::magic_n */
549constexpr size_t FIL_SPACE_MAGIC_N = 89472;
550
551/** Value of fil_node_t::magic_n */
552constexpr size_t FIL_NODE_MAGIC_N = 89389;
553
554/** Common InnoDB file extensions */
557 IBD = 1,
558 CFG = 2,
559 CFP = 3,
560 IBT = 4,
561 IBU = 5,
562 DWR = 6,
563 BWR = 7
565
566extern const char *dot_ext[];
567
568#define DOT_IBD dot_ext[IBD]
569#define DOT_CFG dot_ext[CFG]
570#define DOT_CFP dot_ext[CFP]
571#define DOT_IBT dot_ext[IBT]
572#define DOT_IBU dot_ext[IBU]
573#define DOT_DWR dot_ext[DWR]
574
575#ifdef _WIN32
576/* Initialization of m_abs_path() produces warning C4351:
577"new behavior: elements of array '...' will be default initialized."
578See https://msdn.microsoft.com/en-us/library/1ywe7hcy.aspx */
579#pragma warning(disable : 4351)
580#endif /* _WIN32 */
581
582/** Wrapper for a path to a directory that may or may not exist. */
583class Fil_path {
584 public:
585 /** schema '/' table separator */
586 static constexpr auto DB_SEPARATOR = '/';
587
588 /** OS specific path separator. */
589 static constexpr auto OS_SEPARATOR = OS_PATH_SEPARATOR;
590
591 /** Directory separators that are supported. */
592 static constexpr auto SEPARATOR = "\\/";
593#ifdef _WIN32
594 static constexpr auto DOT_SLASH = ".\\";
595 static constexpr auto DOT_DOT_SLASH = "..\\";
596 static constexpr auto SLASH_DOT_DOT_SLASH = "\\..\\";
597#else
598 static constexpr auto DOT_SLASH = "./";
599 static constexpr auto DOT_DOT_SLASH = "../";
600 static constexpr auto SLASH_DOT_DOT_SLASH = "/../";
601#endif /* _WIN32 */
602
603 /** Various types of file paths. */
605
606 /** Default constructor. Defaults to MySQL_datadir_path. */
607 Fil_path();
608
609 /** Constructor
610 @param[in] path Path, not necessarily NUL terminated
611 @param[in] len Length of path
612 @param[in] normalize_path If false, it's the callers responsibility to
613 ensure that the path is normalized. */
614 explicit Fil_path(const char *path, size_t len, bool normalize_path = false);
615
616 /** Constructor
617 @param[in] path Path, not necessarily NUL terminated
618 @param[in] normalize_path If false, it's the callers responsibility to
619 ensure that the path is normalized. */
620 explicit Fil_path(const char *path, bool normalize_path = false);
621
622 /** Constructor
623 @param[in] path pathname (may also include the file basename)
624 @param[in] normalize_path If false, it's the callers responsibility to
625 ensure that the path is normalized. */
626 explicit Fil_path(const std::string &path, bool normalize_path = false);
627
628 /** Implicit type conversion
629 @return pointer to m_path.c_str() */
630 [[nodiscard]] operator const char *() const { return m_path.c_str(); }
631
632 /** Explicit type conversion
633 @return pointer to m_path.c_str() */
634 [[nodiscard]] const char *operator()() const { return m_path.c_str(); }
635
636 /** @return the value of m_path */
637 [[nodiscard]] const std::string &path() const { return (m_path); }
638
639 /** @return the length of m_path */
640 [[nodiscard]] size_t len() const { return (m_path.length()); }
641
642 /** Return the absolute path by value. If m_abs_path is null, calculate
643 it and return it by value without trying to reset this const object.
644 m_abs_path can be empty if the path did not exist when this object
645 was constructed.
646 @return the absolute path by value. */
647 [[nodiscard]] const std::string abs_path() const {
648 if (m_abs_path.empty()) {
649 return (get_real_path(m_path));
650 }
651
652 return (m_abs_path);
653 }
654
655 /** @return the length of m_abs_path */
656 [[nodiscard]] size_t abs_len() const { return (m_abs_path.length()); }
657
658 /** Determine if this path is equal to the other path.
659 @param[in] other path to compare to
660 @return true if the paths are the same */
661 bool operator==(const Fil_path &other) const { return (is_same_as(other)); }
662
663 /** Check if m_path is the same as this other path.
664 @param[in] other directory path to compare to
665 @return true if m_path is the same as path */
666 [[nodiscard]] bool is_same_as(const Fil_path &other) const;
667
668 /** Check if this path is the same as the other path.
669 @param[in] other directory path to compare to
670 @return true if this path is the same as the other path */
671 [[nodiscard]] bool is_same_as(const std::string &other) const;
672
673 /** Check if two path strings are equal. Put them into Fil_path objects
674 so that they can be compared correctly.
675 @param[in] first first path to check
676 @param[in] second socond path to check
677 @return true if these two paths are the same */
678 [[nodiscard]] static bool is_same_as(const std::string &first,
679 const std::string &second) {
680 if (first.empty() || second.empty()) {
681 return (false);
682 }
683
684 Fil_path first_path(first);
685 std::string first_abs = first_path.abs_path();
686 trim_separator(first_abs);
687
688 Fil_path second_path(second);
689 std::string second_abs = second_path.abs_path();
690 trim_separator(second_abs);
691
692 return (first_abs == second_abs);
693 }
694
695 /** Splits the path into directory and file name parts.
696 @param[in] path path to split
697 @return [directory, file] for the path */
698 [[nodiscard]] static std::pair<std::string, std::string> split(
699 const std::string &path);
700
701 /** Check if m_path is the parent of the other path.
702 @param[in] other path to compare to
703 @return true if m_path is an ancestor of name */
704 [[nodiscard]] bool is_ancestor(const Fil_path &other) const;
705
706 /** Check if this Fil_path is an ancestor of the other path.
707 @param[in] other path to compare to
708 @return true if this Fil_path is an ancestor of the other path */
709 [[nodiscard]] bool is_ancestor(const std::string &other) const;
710
711 /** Check if the first path is an ancestor of the second.
712 Do not assume that these paths have been converted to real paths
713 and are ready to compare. If the two paths are the same
714 we will return false.
715 @param[in] first Parent path to check
716 @param[in] second Descendent path to check
717 @return true if the first path is an ancestor of the second */
718 [[nodiscard]] static bool is_ancestor(const std::string &first,
719 const std::string &second) {
720 if (first.empty() || second.empty()) {
721 return (false);
722 }
723
724 Fil_path ancestor(first);
725 Fil_path descendant(second);
726
727 return (ancestor.is_ancestor(descendant));
728 }
729
730 /** @return true if m_path exists and is a file. */
731 [[nodiscard]] bool is_file_and_exists() const;
732
733 /** @return true if m_path exists and is a directory. */
734 [[nodiscard]] bool is_directory_and_exists() const;
735
736 /** This validation is only for ':'.
737 @return true if the path is valid. */
738 [[nodiscard]] bool is_valid() const;
739
740 /** Determine if m_path contains a circular section like "/anydir/../"
741 Fil_path::normalize() must be run before this.
742 @return true if a circular section if found, false if not */
743 [[nodiscard]] bool is_circular() const;
744
745 /** Determine if the file or directory is considered HIDDEN.
746 Most file systems identify the HIDDEN attribute by a '.' preceding the
747 basename. On Windows, a HIDDEN path is identified by a file attribute.
748 We will use the preceding '.' to indicate a HIDDEN attribute on ALL
749 file systems so that InnoDB tablespaces and their directory structure
750 remain portable.
751 @param[in] path The full or relative path of a file or directory.
752 @return true if the directory or path is HIDDEN. */
753 static bool is_hidden(std::string path);
754
755#ifdef _WIN32
756 /** Use the WIN32_FIND_DATA struncture to determine if the file or
757 directory is HIDDEN. Consider a SYSTEM attribute also as an indicator
758 that it is HIDDEN to InnoDB.
759 @param[in] dirent A directory entry obtained from a call to FindFirstFile()
760 or FindNextFile()
761 @return true if the directory or path is HIDDEN. */
762 static bool is_hidden(WIN32_FIND_DATA &dirent);
763#endif /* WIN32 */
764
765 /** Remove quotes e.g., 'a;b' or "a;b" -> a;b.
766 This will only remove the quotes if they are matching on the whole string.
767 This will not work if each delimited string is quoted since this is called
768 before the string is parsed.
769 @return pathspec with the quotes stripped */
770 static std::string remove_quotes(const char *pathspec) {
771 std::string path(pathspec);
772
773 ut_ad(!path.empty());
774
775 if (path.size() >= 2 && ((path.front() == '\'' && path.back() == '\'') ||
776 (path.front() == '"' && path.back() == '"'))) {
777 path.erase(0, 1);
778 path.erase(path.size() - 1);
779 }
780
781 return (path);
782 }
783
784 /** Determine if a path is a relative path or not.
785 @param[in] path OS directory or file path to evaluate
786 @retval true if the path is relative
787 @retval false if the path is absolute or file_name_only */
788 [[nodiscard]] static bool is_relative_path(const std::string &path) {
789 return (type_of_path(path) == relative);
790 }
791
792 /** @return true if the path is an absolute path. */
793 [[nodiscard]] bool is_absolute_path() const {
794 return (type_of_path(m_path) == absolute);
795 }
796
797 /** Determine if a path is an absolute path or not.
798 @param[in] path OS directory or file path to evaluate
799 @retval true if the path is absolute
800 @retval false if the path is relative or file_name_only */
801 [[nodiscard]] static bool is_absolute_path(const std::string &path) {
802 return (type_of_path(path) == absolute);
803 }
804
805 /** Determine what type of path is provided.
806 @param[in] path OS directory or file path to evaluate
807 @return the type of filepath; 'absolute', 'relative',
808 'file_name_only', or 'invalid' if the path is empty. */
809 [[nodiscard]] static path_type type_of_path(const std::string &path) {
810 if (path.empty()) {
811 return (invalid);
812 }
813
814 /* The most likely type is a file name only with no separators. */
815 auto first_separator = path.find_first_of(SEPARATOR);
816 if (first_separator == std::string::npos) {
817 return (file_name_only);
818 }
819
820 /* Any string that starts with an OS_SEPARATOR is
821 an absolute path. This includes any OS and even
822 paths like "\\Host\share" on Windows. */
823 if (first_separator == 0) {
824 return (absolute);
825 }
826
827#ifdef _WIN32
828 /* Windows may have an absolute path like 'A:\' */
829 if (path.length() >= 3 && isalpha(path.at(0)) && path.at(1) == ':' &&
830 (path.at(2) == '\\' || path.at(2) == '/')) {
831 return (absolute);
832 }
833#endif /* _WIN32 */
834
835 /* Since it contains separators and is not an absolute path,
836 it must be a relative path. */
837 return (relative);
838 }
839
840 /* Check if the path is prefixed with pattern.
841 @return true if prefix matches */
842 [[nodiscard]] static bool has_prefix(const std::string &path,
843 const std::string prefix) {
844 return (path.size() >= prefix.size() &&
845 std::equal(prefix.begin(), prefix.end(), path.begin()));
846 }
847
848 /** Normalize a directory path for the current OS:
849 On Windows, we convert '/' to '\', else we convert '\' to '/'.
850 @param[in,out] path Directory and file path */
851 static void normalize(std::string &path) {
852 for (auto &c : path) {
853 if (c == OS_PATH_SEPARATOR_ALT) {
854 c = OS_SEPARATOR;
855 }
856 }
857 }
858
859 /** Normalize a directory path for the current OS:
860 On Windows, we convert '/' to '\', else we convert '\' to '/'.
861 @param[in,out] path A NUL terminated path */
862 static void normalize(char *path) {
863 for (auto ptr = path; *ptr; ++ptr) {
864 if (*ptr == OS_PATH_SEPARATOR_ALT) {
865 *ptr = OS_SEPARATOR;
866 }
867 }
868 }
869
870 /** Convert a path string to lower case using the CHARSET my_charset_filename.
871 @param[in,out] path Directory and file path */
872 static void to_lower(std::string &path) {
873 for (auto &c : path) {
875 }
876 }
877
878 /** @return true if the path exists and is a file . */
879 [[nodiscard]] static os_file_type_t get_file_type(const std::string &path);
880
881 /** Return a string to display the file type of a path.
882 @param[in] path path name
883 @return true if the path exists and is a file . */
884 static const char *get_file_type_string(const std::string &path);
885
886 /** Return a string to display the file type of a path.
887 @param[in] type OS file type
888 @return true if the path exists and is a file . */
889 static const char *get_file_type_string(os_file_type_t type);
890
891 /** Get the real path for a directory or a file name. This path can be
892 used to compare with another absolute path. It will be converted to
893 lower case on case insensitive file systems and if it is a directory,
894 it will end with a directory separator. The call to my_realpath() may
895 fail on non-Windows platforms if the path does not exist. If so, the
896 parameter 'force' determines what to return.
897 @param[in] path directory or filename to convert to a real path
898 @param[in] force if true and my_realpath() fails, use the path provided.
899 if false and my_realpath() fails, return a null string.
900 @return the absolute path prepared for making comparisons with other real
901 paths. */
902 [[nodiscard]] static std::string get_real_path(const std::string &path,
903 bool force = true);
904
905 /** Get the basename of the file path. This is the file name without any
906 directory separators. In other words, the file name after the last separator.
907 @param[in] filepath The name of a file, optionally with a path. */
908 [[nodiscard]] static std::string get_basename(const std::string &filepath);
909
910 /** Separate the portion of a directory path that exists and the portion that
911 does not exist.
912 @param[in] path Path to evaluate
913 @param[in,out] ghost The portion of the path that does not exist.
914 @return the existing portion of a path. */
915 [[nodiscard]] static std::string get_existing_path(const std::string &path,
916 std::string &ghost);
917
918 /** Check if the name is an undo tablespace name.
919 @param[in] name Tablespace name
920 @return true if it is an undo tablespace name */
921 [[nodiscard]] static bool is_undo_tablespace_name(const std::string &name);
922
923 /** Check if the file has the the specified suffix
924 @param[in] sfx suffix to look for
925 @param[in] path Filename to check
926 @return true if it has the the ".ibd" suffix. */
927 static bool has_suffix(ib_file_suffix sfx, const std::string &path) {
928 const auto suffix = dot_ext[sfx];
929 size_t len = strlen(suffix);
930
931 return (path.size() >= len &&
932 path.compare(path.size() - len, len, suffix) == 0);
933 }
934
935 /** Check if the file has the the specified suffix and truncate
936 @param[in] sfx suffix to look for
937 @param[in,out] path Filename to check
938 @return true if the suffix is found and truncated. */
939 static bool truncate_suffix(ib_file_suffix sfx, std::string &path) {
940 const auto suffix = dot_ext[sfx];
941 size_t len = strlen(suffix);
942
943 if (path.size() < len ||
944 path.compare(path.size() - len, len, suffix) != 0) {
945 return (false);
946 }
947
948 path.resize(path.size() - len);
949 return (true);
950 }
951
952 /** Check if a character is a path separator ('\' or '/')
953 @param[in] c Character to check
954 @return true if it is a separator */
955 static bool is_separator(char c) { return (c == '\\' || c == '/'); }
956
957 /** If the last character of a directory path is a separator ('\' or '/')
958 trim it off the string.
959 @param[in] path file system path */
960 static void trim_separator(std::string &path) {
961 if (!path.empty() && is_separator(path.back())) {
962 path.resize(path.size() - 1);
963 }
964 }
965
966 /** If the last character of a directory path is NOT a separator,
967 append a separator to the path.
968 NOTE: We leave it up to the caller to assure that the path is a directory
969 and not a file since if that directory does not yet exist, this function
970 cannot tell the difference.
971 @param[in] path file system path */
972 static void append_separator(std::string &path) {
973 if (!path.empty() && !is_separator(path.back())) {
974 path.push_back(OS_SEPARATOR);
975 }
976 }
977
978 /** Allocate and build a file name from a path, a table or
979 tablespace name and a suffix.
980 @param[in] path_in nullptr or the directory path or
981 the full path and filename
982 @param[in] name_in nullptr if path is full, or
983 Table/Tablespace name
984 @param[in] ext the file extension to use
985 @param[in] trim whether last name on the path should
986 be trimmed
987 @return own: file name; must be freed by ut::free() */
988 [[nodiscard]] static char *make(const std::string &path_in,
989 const std::string &name_in,
990 ib_file_suffix ext, bool trim = false);
991
992 /** Allocate and build a CFG file name from a path.
993 @param[in] path_in Full path to the filename
994 @return own: file name; must be freed by ut::free() */
995 [[nodiscard]] static char *make_cfg(const std::string &path_in) {
996 return (make(path_in, "", CFG));
997 }
998
999 /** Allocate and build a CFP file name from a path.
1000 @param[in] path_in Full path to the filename
1001 @return own: file name; must be freed by ut::free() */
1002 [[nodiscard]] static char *make_cfp(const std::string &path_in) {
1003 return (make(path_in, "", CFP));
1004 }
1005
1006 /** Allocate and build a file name from a path, a table or
1007 tablespace name and a suffix.
1008 @param[in] path_in nullptr or the directory path or
1009 the full path and filename
1010 @param[in] name_in nullptr if path is full, or
1011 Table/Tablespace name
1012 @return own: file name; must be freed by ut::free() */
1013 [[nodiscard]] static char *make_ibd(const std::string &path_in,
1014 const std::string &name_in) {
1015 return (make(path_in, name_in, IBD));
1016 }
1017
1018 /** Allocate and build a file name from a path, a table or
1019 tablespace name and a suffix.
1020 @param[in] name_in Table/Tablespace name
1021 @return own: file name; must be freed by ut::free() */
1022 [[nodiscard]] static char *make_ibd_from_table_name(
1023 const std::string &name_in) {
1024 return (make("", name_in, IBD));
1025 }
1026
1027 /** Create an IBD path name after replacing the basename in an old path
1028 with a new basename. The old_path is a full path name including the
1029 extension. The tablename is in the normal form "schema/tablename".
1030 @param[in] path_in Pathname
1031 @param[in] name_in Contains new base name
1032 @param[in] extn File extension
1033 @return new full pathname */
1034 [[nodiscard]] static std::string make_new_path(const std::string &path_in,
1035 const std::string &name_in,
1036 ib_file_suffix extn);
1037
1038 /** Parse file-per-table file name and build Innodb dictionary table name.
1039 @param[in] file_path File name with complete path
1040 @param[in] extn File extension
1041 @param[out] dict_name Innodb dictionary table name
1042 @return true, if successful. */
1043 static bool parse_file_path(const std::string &file_path, ib_file_suffix extn,
1044 std::string &dict_name);
1045
1046 /** This function reduces a null-terminated full remote path name
1047 into the path that is sent by MySQL for DATA DIRECTORY clause.
1048 It replaces the 'databasename/tablename.ibd' found at the end of the
1049 path with just 'tablename'.
1050
1051 Since the result is always smaller than the path sent in, no new
1052 memory is allocated. The caller should allocate memory for the path
1053 sent in. This function manipulates that path in place. If the path
1054 format is not as expected, set data_dir_path to "" and return.
1055
1056 The result is used to inform a SHOW CREATE TABLE command.
1057 @param[in,out] data_dir_path Full path/data_dir_path */
1058 static void make_data_dir_path(char *data_dir_path);
1059
1060#ifndef UNIV_HOTBACKUP
1061 /** Check if the filepath provided is in a valid placement.
1062 This routine is run during file discovery at startup.
1063 1) File-per-table must be in a dir named for the schema.
1064 2) File-per-table must not be in the datadir.
1065 3) General tablespace must not be under the datadir.
1066 @param[in] space_name tablespace name
1067 @param[in] space_id tablespace ID
1068 @param[in] fsp_flags tablespace flags
1069 @param[in] path scanned realpath to an existing file to validate
1070 @retval true if the filepath is a valid datafile location */
1071 static bool is_valid_location(const char *space_name, space_id_t space_id,
1072 uint32_t fsp_flags, const std::string &path);
1073
1074 /** Check if the implicit filepath is immediately within a dir named for
1075 the schema.
1076 @param[in] space_name tablespace name
1077 @param[in] path scanned realpath to an existing file to validate
1078 @retval true if the filepath is valid */
1079 static bool is_valid_location_within_db(const char *space_name,
1080 const std::string &path);
1081
1082 /** Convert filename to the file system charset format.
1083 @param[in,out] name Filename to convert */
1084 static void convert_to_filename_charset(std::string &name);
1085
1086 /** Convert to lower case using the file system charset.
1087 @param[in,out] path Filepath to convert */
1088 static void convert_to_lower_case(std::string &path);
1089
1090#endif /* !UNIV_HOTBACKUP */
1091
1092 protected:
1093 /** Path to a file or directory. */
1094 std::string m_path;
1095
1096 /** A full absolute path to the same file. */
1097 std::string m_abs_path;
1098};
1099
1100/** The MySQL server --datadir value */
1102
1103/** The MySQL server --innodb-undo-directory value */
1105
1106/** The undo path is different from any other known directory. */
1107extern bool MySQL_undo_path_is_unique;
1108
1109/** Initial size of a single-table tablespace in pages */
1110constexpr size_t FIL_IBD_FILE_INITIAL_SIZE = 7;
1111constexpr size_t FIL_IBT_FILE_INITIAL_SIZE = 5;
1112
1113/** An empty tablespace (CREATE TABLESPACE) has minimum
1114of 4 pages and an empty CREATE TABLE (file_per_table) has 6 pages.
1115Minimum of these two is 4 */
1117
1118/** 'null' (undefined) page offset in the context of file spaces */
1119constexpr page_no_t FIL_NULL = std::numeric_limits<page_no_t>::max();
1120
1121/** Maximum Page Number, one less than FIL_NULL */
1122constexpr page_no_t PAGE_NO_MAX = std::numeric_limits<page_no_t>::max() - 1;
1123
1124/** Unknown space id */
1125constexpr space_id_t SPACE_UNKNOWN = std::numeric_limits<space_id_t>::max();
1126
1127/* Space address data type; this is intended to be used when
1128addresses accurate to a byte are stored in file pages. If the page part
1129of the address is FIL_NULL, the address is considered undefined. */
1130
1131/** 'type' definition in C: an address stored in a file page is a
1132string of bytes */
1134
1135/** File space address */
1137 /* Default constructor */
1139
1140 /** Constructor
1141 @param[in] p Logical page number
1142 @param[in] boff Offset within the page */
1143 fil_addr_t(page_no_t p, uint32_t boff) : page(p), boffset(boff) {}
1144
1145 /** Compare to instances
1146 @param[in] rhs Instance to compare with
1147 @return true if the page number and page offset are equal */
1148 bool is_equal(const fil_addr_t &rhs) const {
1149 return (page == rhs.page && boffset == rhs.boffset);
1150 }
1151
1152 /** Check if the file address is null.
1153 @return true if null */
1154 bool is_null() const { return (page == FIL_NULL && boffset == 0); }
1155
1156 /** Print a string representation.
1157 @param[in,out] out Stream to write to */
1158 std::ostream &print(std::ostream &out) const {
1159 out << "[fil_addr_t: page=" << page << ", boffset=" << boffset << "]";
1160
1161 return (out);
1162 }
1163
1164 /** Page number within a space */
1166
1167 /** Byte offset within the page */
1168 uint32_t boffset;
1169};
1170
1171/* For printing fil_addr_t to a stream.
1172@param[in,out] out Stream to write to
1173@param[in] obj fil_addr_t instance to write */
1174inline std::ostream &operator<<(std::ostream &out, const fil_addr_t &obj) {
1175 return (obj.print(out));
1176}
1177
1178/** The null file address */
1180
1181using page_type_t = uint16_t;
1182
1183/** File page types (values of FIL_PAGE_TYPE) @{ */
1184/** B-tree node */
1185constexpr page_type_t FIL_PAGE_INDEX = 17855;
1186
1187/** R-tree node */
1188constexpr page_type_t FIL_PAGE_RTREE = 17854;
1189
1190/** Tablespace SDI Index page */
1191constexpr page_type_t FIL_PAGE_SDI = 17853;
1192
1193/** This page type is unused. */
1195
1196/** Undo log page */
1198
1199/** Index node */
1201
1202/** Insert buffer free list */
1204
1205/* File page types introduced in MySQL/InnoDB 5.1.7 */
1206/** Freshly allocated page */
1208
1209/** Insert buffer bitmap */
1211
1212/** System page */
1214
1215/** Transaction system data */
1217
1218/** File space header */
1220
1221/** Extent descriptor page */
1223
1224/** Uncompressed BLOB page */
1226
1227/** First compressed BLOB page */
1229
1230/** Subsequent compressed BLOB page */
1232
1233/** In old tablespaces, garbage in FIL_PAGE_TYPE is replaced with
1234this value when flushing pages. */
1236
1237/** Compressed page */
1239
1240/** Encrypted page */
1242
1243/** Compressed and Encrypted page */
1245
1246/** Encrypted R-tree page */
1248
1249/** Uncompressed SDI BLOB page */
1251
1252/** Compressed SDI BLOB page */
1254
1255/** Legacy doublewrite buffer page. */
1257
1258/** Rollback Segment Array page */
1260
1261/** Index pages of uncompressed LOB */
1263
1264/** Data pages of uncompressed LOB */
1266
1267/** The first page of an uncompressed LOB */
1269
1270/** The first page of a compressed LOB */
1272
1273/** Data pages of compressed LOB */
1275
1276/** Index pages of compressed LOB. This page contains an array of
1277z_index_entry_t objects.*/
1279
1280/** Fragment pages of compressed LOB. */
1282
1283/** Index pages of fragment pages (compressed LOB). */
1285
1286/** Note the highest valid non-index page_type_t. */
1288
1289/** Check whether the page type is index (Btree or Rtree or SDI) type */
1290inline bool fil_page_type_is_index(page_type_t page_type) {
1291 return page_type == FIL_PAGE_INDEX || page_type == FIL_PAGE_SDI ||
1292 page_type == FIL_PAGE_RTREE;
1293}
1294
1296
1297/** Check whether the page is index page (either regular Btree index or Rtree
1298index */
1299inline bool fil_page_index_page_check(const byte *page) {
1301}
1302
1303/** @} */
1304
1305/** Number of pending tablespace flushes */
1306extern std::atomic<std::uint64_t> fil_n_pending_tablespace_flushes;
1307
1308/** Number of files currently open */
1309extern std::atomic_size_t fil_n_files_open;
1310
1311/** Look up a tablespace.
1312The caller should hold an InnoDB table lock or a MDL that prevents
1313the tablespace from being dropped during the operation,
1314or the caller should be in single-threaded crash recovery mode
1315(no user connections that could drop tablespaces).
1316If this is not the case, fil_space_acquire() and fil_space_release()
1317should be used instead.
1318@param[in] space_id Tablespace ID
1319@return tablespace, or nullptr if not found */
1320[[nodiscard]] fil_space_t *fil_space_get(space_id_t space_id);
1321
1322#ifndef UNIV_HOTBACKUP
1323/** Returns the latch of a file space.
1324@param[in] space_id Tablespace ID
1325@return latch protecting storage allocation */
1326[[nodiscard]] rw_lock_t *fil_space_get_latch(space_id_t space_id);
1327
1328#ifdef UNIV_DEBUG
1329/** Gets the type of a file space.
1330@param[in] space_id Tablespace ID
1331@return file type */
1332[[nodiscard]] fil_type_t fil_space_get_type(space_id_t space_id);
1333#endif /* UNIV_DEBUG */
1334
1335/** Note that a tablespace has been imported.
1336It is initially marked as FIL_TYPE_IMPORT so that no logging is
1337done during the import process when the space ID is stamped to each page.
1338Now we change it to FIL_TYPE_TABLESPACE to start redo and undo logging.
1339NOTE: temporary tablespaces are never imported.
1340@param[in] space_id Tablespace ID */
1341void fil_space_set_imported(space_id_t space_id);
1342#endif /* !UNIV_HOTBACKUP */
1343
1344/** Attach a file to a tablespace. File must be closed.
1345@param[in] name file name (file must be closed)
1346@param[in] size file size in database blocks, rounded
1347 downwards to an integer
1348@param[in,out] space space where to append
1349@param[in] is_raw true if a raw device or a raw disk partition
1350@param[in] atomic_write true if the file has atomic write enabled
1351@param[in] max_pages maximum number of pages in file
1352@return pointer to the file name
1353@retval nullptr if error */
1354[[nodiscard]] char *fil_node_create(const char *name, page_no_t size,
1355 fil_space_t *space, bool is_raw,
1356 bool atomic_write,
1357 page_no_t max_pages = PAGE_NO_MAX);
1358
1359/** Create a space memory object and put it to the fil_system hash table.
1360The tablespace name is independent from the tablespace file-name.
1361Error messages are issued to the server log.
1362@param[in] name Tablespace name
1363@param[in] space_id Tablespace ID
1364@param[in] flags Tablespace flags
1365@param[in] purpose Tablespace purpose
1366@return pointer to created tablespace, to be filled in with fil_node_create()
1367@retval nullptr on failure (such as when the same tablespace exists) */
1368[[nodiscard]] fil_space_t *fil_space_create(const char *name,
1369 space_id_t space_id, uint32_t flags,
1370 fil_type_t purpose);
1371
1372/** Assigns a new space id for a new single-table tablespace. This works
1373simply by incrementing the global counter. If 4 billion id's is not enough,
1374we may need to recycle id's.
1375@param[out] space_id Set this to the new tablespace ID
1376@return true if assigned, false if not */
1377[[nodiscard]] bool fil_assign_new_space_id(space_id_t *space_id);
1378
1379/** Returns the path from the first fil_node_t found with this space ID.
1380The caller is responsible for freeing the memory allocated here for the
1381value returned.
1382@param[in] space_id Tablespace ID
1383@return own: A copy of fil_node_t::path, nullptr if space ID is zero
1384 or not found. */
1385[[nodiscard]] char *fil_space_get_first_path(space_id_t space_id);
1386
1387/** Returns the size of the space in pages. The tablespace must be cached
1388in the memory cache.
1389@param[in] space_id Tablespace ID
1390@return space size, 0 if space not found */
1391[[nodiscard]] page_no_t fil_space_get_size(space_id_t space_id);
1392
1393/** Returns the size of an undo space just after it was initialized.
1394@param[in] space_id Tablespace ID
1395@return initial space size, 0 if space not found */
1397
1398/** This is called for an undo tablespace after it has been initialized
1399or opened. It sets the minimum size in pages at which it should be truncated
1400and the number of pages that it should be extended. An undo tablespace is
1401extended by larger amounts than normal tablespaces. It starts at 16Mb and
1402is increased during aggressive growth and decreased when the growth is slower.
1403@param[in] space_id Tablespace ID
1404@param[in] use_current If true, use the current size in pages as the initial
1405 size. If false, use UNDO_INITIAL_SIZE_IN_PAGES. */
1406void fil_space_set_undo_size(space_id_t space_id, bool use_current);
1407
1408/** Returns the flags of the space. The tablespace must be cached
1409in the memory cache.
1410@param[in] space_id Tablespace ID for which to get the flags
1411@return flags, ULINT_UNDEFINED if space not found */
1412[[nodiscard]] uint32_t fil_space_get_flags(space_id_t space_id);
1413
1414/** Sets the flags of the tablespace. The tablespace must be locked
1415in MDL_EXCLUSIVE MODE.
1416@param[in] space tablespace in-memory struct
1417@param[in] flags tablespace flags */
1418void fil_space_set_flags(fil_space_t *space, uint32_t flags);
1419
1420/** Open each file of a tablespace if not already open.
1421@param[in] space_id Tablespace ID
1422@retval true if all file nodes were opened
1423@retval false on failure */
1424[[nodiscard]] bool fil_space_open(space_id_t space_id);
1425
1426/** Close each file of a tablespace if open.
1427@param[in] space_id Tablespace ID */
1428void fil_space_close(space_id_t space_id);
1429
1430/** Returns the page size of the space and whether it is compressed or not.
1431The tablespace must be cached in the memory cache.
1432@param[in] space_id Tablespace ID
1433@param[out] found true if tablespace was found
1434@return page size */
1435[[nodiscard]] const page_size_t fil_space_get_page_size(space_id_t space_id,
1436 bool *found);
1437
1438/** Initializes the tablespace memory cache.
1439@param[in] max_n_open Maximum number of open files */
1440void fil_init(ulint max_n_open);
1441
1442/** Changes the maximum opened files limit.
1443@param[in, out] new_max_open_files New value for the open files limit. If the
1444limit cannot be changed, the value is changed to a minimum value recommended.
1445@return true if the new limit was set. */
1446bool fil_open_files_limit_update(size_t &new_max_open_files);
1447
1448/** Initializes the tablespace memory cache. */
1449void fil_close();
1450
1451/** Opens all log files and system tablespace data files.
1452They stay open until the database server shutdown. This should be called
1453at a server startup after the space objects for the log and the system
1454tablespace have been created. The purpose of this operation is to make
1455sure we never run out of file descriptors if we need to read from the
1456insert buffer or to write to the log. */
1458
1459/** Closes all open files. There must not be any pending i/o's or not flushed
1460modifications in the files. */
1461void fil_close_all_files();
1462
1463/** Iterate over the files in all the tablespaces. */
1465 public:
1466 using Function = std::function<dberr_t(fil_node_t *)>;
1467
1468 /** For each data file.
1469 @param[in] f Callback */
1470 template <typename F>
1471 static dberr_t for_each_file(F &&f) {
1472 return iterate([=](fil_node_t *file) { return (f(file)); });
1473 }
1474
1475 /** Iterate through all persistent tablespace files (FIL_TYPE_TABLESPACE)
1476 returning the nodes via callback function f.
1477 @param[in] f Callback
1478 @return any error returned by the callback function. */
1479 static dberr_t iterate(Function &&f);
1480};
1481
1482/** Sets the max tablespace id counter if the given number is bigger than the
1483previous value.
1484@param[in] max_id Maximum known tablespace ID */
1486
1487#ifndef UNIV_HOTBACKUP
1488
1489/** Write the flushed LSN to the page header of the first page in the
1490system tablespace.
1491@param[in] lsn Flushed LSN
1492@return DB_SUCCESS or error number */
1493[[nodiscard]] dberr_t fil_write_flushed_lsn(lsn_t lsn);
1494
1495#else /* !UNIV_HOTBACKUP */
1496/** Frees a space object from the tablespace memory cache.
1497Closes a tablespaces' files but does not delete them.
1498There must not be any pending i/o's or flushes on the files.
1499@param[in] space_id Tablespace ID
1500@return true if success */
1501bool meb_fil_space_free(space_id_t space_id);
1502
1503/** Extends all tablespaces to the size stored in the space header. During the
1504mysqlbackup --apply-log phase we extended the spaces on-demand so that log
1505records could be applied, but that may have left spaces still too small
1506compared to the size stored in the space header. */
1507void meb_extend_tablespaces_to_stored_len();
1508
1509/** Process a file name passed as an input
1510@param[in] name absolute path of tablespace file
1511@param[in] space_id the tablespace ID */
1512void meb_fil_name_process(const char *name, space_id_t space_id);
1513
1514#endif /* !UNIV_HOTBACKUP */
1515
1516/** Acquire a tablespace when it could be dropped concurrently.
1517Used by background threads that do not necessarily hold proper locks
1518for concurrency control.
1519@param[in] space_id Tablespace ID
1520@return the tablespace, or nullptr if missing or being deleted */
1521[[nodiscard]] fil_space_t *fil_space_acquire(space_id_t space_id);
1522
1523/** Acquire a tablespace that may not exist.
1524Used by background threads that do not necessarily hold proper locks
1525for concurrency control.
1526@param[in] space_id Tablespace ID
1527@return the tablespace, or nullptr if missing or being deleted */
1528[[nodiscard]] fil_space_t *fil_space_acquire_silent(space_id_t space_id);
1529
1530/** Release a tablespace acquired with fil_space_acquire().
1531@param[in,out] space Tablespace to release */
1532void fil_space_release(fil_space_t *space);
1533
1534/** Fetch the file name opened for a space_id from the file map.
1535@param[in] space_id tablespace ID
1536@param[out] name the scanned filename
1537@return true if the space_id is found. The name is set to an
1538empty string if the space_id is not found. */
1539bool fil_system_get_file_by_space_id(space_id_t space_id, std::string &name);
1540
1541/** Fetch the file name opened for an undo space number from the file map.
1542@param[in] space_num Undo tablespace Number
1543@param[out] space_id Undo tablespace ID
1544@param[out] name the scanned filename
1545@return true if the space_num was found. The name is set to an
1546empty string if the space_num is not found. */
1548 space_id_t &space_id, std::string &name);
1549
1550/** Truncate the tablespace to needed size.
1551@param[in] space_id Tablespace ID to truncate
1552@param[in] size_in_pages Truncate size.
1553@return true if truncate was successful. */
1554[[nodiscard]] bool fil_truncate_tablespace(space_id_t space_id,
1555 page_no_t size_in_pages);
1556
1557/** Closes a single-table tablespace. The tablespace must be cached in the
1558memory cache. Free all pages used by the tablespace.
1559@param[in] space_id Tablespace ID
1560@return DB_SUCCESS or error */
1561[[nodiscard]] dberr_t fil_close_tablespace(space_id_t space_id);
1562
1563/** Discards a single-table tablespace. The tablespace must be cached in the
1564memory cache. Discarding is like deleting a tablespace, but
1565
1566 1. We do not drop the table from the data dictionary;
1567
1568 2. We remove all insert buffer entries for the tablespace immediately;
1569 in DROP TABLE they are only removed gradually in the background;
1570
1571 3. When the user does IMPORT TABLESPACE, the tablespace will have the
1572 same id as it originally had.
1573
1574 4. Free all the pages in use by the tablespace if rename=true.
1575@param[in] space_id Tablespace ID
1576@return DB_SUCCESS or error */
1577[[nodiscard]] dberr_t fil_discard_tablespace(space_id_t space_id);
1578
1579/** Test if a tablespace file can be renamed to a new filepath by checking
1580if that the old filepath exists and the new filepath does not exist.
1581@param[in] space_id Tablespace ID
1582@param[in] old_path Old filepath
1583@param[in] new_path New filepath
1584@param[in] is_discarded Whether the tablespace is discarded
1585@return innodb error code */
1586[[nodiscard]] dberr_t fil_rename_tablespace_check(space_id_t space_id,
1587 const char *old_path,
1588 const char *new_path,
1589 bool is_discarded);
1590
1591/** Rename a single-table tablespace.
1592The tablespace must exist in the memory cache.
1593@param[in] space_id Tablespace ID
1594@param[in] old_path Old file name
1595@param[in] new_name New tablespace name in the schema/name format
1596@param[in] new_path_in New file name, or nullptr if it is located in
1597the normal data directory
1598@return InnoDB error code */
1599[[nodiscard]] dberr_t fil_rename_tablespace(space_id_t space_id,
1600 const char *old_path,
1601 const char *new_name,
1602 const char *new_path_in);
1603
1604/** Create an IBD tablespace file.
1605@param[in] space_id Tablespace ID
1606@param[in] name Tablespace name in dbname/tablename format.
1607 For general tablespaces, the 'dbname/' part
1608 may be missing.
1609@param[in] path Path and filename of the datafile to create.
1610@param[in] flags Tablespace flags
1611@param[in] size Initial size of the tablespace file in pages,
1612 must be >= FIL_IBD_FILE_INITIAL_SIZE
1613@return DB_SUCCESS or error code */
1614[[nodiscard]] dberr_t fil_ibd_create(space_id_t space_id, const char *name,
1615 const char *path, uint32_t flags,
1616 page_no_t size);
1617
1618/** Create a session temporary tablespace (IBT) file.
1619@param[in] space_id Tablespace ID
1620@param[in] name Tablespace name
1621@param[in] path Path and filename of the datafile to create.
1622@param[in] flags Tablespace flags
1623@param[in] size Initial size of the tablespace file in pages,
1624 must be >= FIL_IBT_FILE_INITIAL_SIZE
1625@return DB_SUCCESS or error code */
1626[[nodiscard]] dberr_t fil_ibt_create(space_id_t space_id, const char *name,
1627 const char *path, uint32_t flags,
1628 page_no_t size);
1629
1630/** Deletes an IBD or IBU tablespace.
1631The tablespace must be cached in the memory cache. This will delete the
1632datafile, fil_space_t & fil_node_t entries from the file_system_t cache.
1633@param[in] space_id Tablespace ID
1634@param[in] buf_remove Specify the action to take on the pages
1635for this table in the buffer pool.
1636@return DB_SUCCESS, DB_TABLESPCE_NOT_FOUND or DB_IO_ERROR */
1637[[nodiscard]] dberr_t fil_delete_tablespace(space_id_t space_id,
1638 buf_remove_t buf_remove);
1639
1640/** Open a single-table tablespace and optionally do some validation such
1641as checking that the space id is correct. If the file is already open,
1642the validation will be done before reporting success.
1643If not successful, print an error message to the error log.
1644This function is used to open a tablespace when we start up mysqld,
1645and also in IMPORT TABLESPACE.
1646NOTE that we assume this operation is used either at the database startup
1647or under the protection of the dictionary mutex, so that two users cannot
1648race here.
1649
1650The fil_node_t::handle will not be left open.
1651
1652@param[in] validate whether we should validate the tablespace
1653 (read the first page of the file and
1654 check that the space id in it matches id)
1655@param[in] purpose FIL_TYPE_TABLESPACE or FIL_TYPE_TEMPORARY
1656@param[in] space_id Tablespace ID
1657@param[in] flags tablespace flags
1658@param[in] space_name tablespace name of the datafile
1659 If file-per-table, it is the table name in the
1660 databasename/tablename format
1661@param[in] path_in expected filepath, usually read from dictionary
1662@param[in] strict whether to report error when open ibd failed
1663@param[in] old_space whether it is a 5.7 tablespace opening
1664 by upgrade
1665@return DB_SUCCESS or error code */
1666[[nodiscard]] dberr_t fil_ibd_open(bool validate, fil_type_t purpose,
1667 space_id_t space_id, uint32_t flags,
1668 const char *space_name, const char *path_in,
1669 bool strict, bool old_space);
1670
1671/** Returns true if a matching tablespace exists in the InnoDB tablespace
1672memory cache.
1673@param[in] space_id Tablespace ID
1674@param[in] name Tablespace name used in space_create().
1675@param[in] print_err Print detailed error information to the
1676 error log if a matching tablespace is
1677 not found from memory.
1678@param[in] adjust_space Whether to adjust space id on mismatch
1679@return true if a matching tablespace exists in the memory cache */
1680[[nodiscard]] bool fil_space_exists_in_mem(space_id_t space_id,
1681 const char *name, bool print_err,
1682 bool adjust_space);
1683
1684/** Extends all tablespaces to the size stored in the space header. During the
1685mysqlbackup --apply-log phase we extended the spaces on-demand so that log
1686records could be appllied, but that may have left spaces still too small
1687compared to the size stored in the space header. */
1689
1690/** Try to extend a tablespace if it is smaller than the specified size.
1691@param[in,out] space Tablespace ID
1692@param[in] size desired size in pages
1693@return whether the tablespace is at least as big as requested */
1694[[nodiscard]] bool fil_space_extend(fil_space_t *space, page_no_t size);
1695
1696/** Tries to reserve free extents in a file space.
1697@param[in] space_id Tablespace ID
1698@param[in] n_free_now Number of free extents now
1699@param[in] n_to_reserve How many one wants to reserve
1700@return true if succeed */
1701[[nodiscard]] bool fil_space_reserve_free_extents(space_id_t space_id,
1702 ulint n_free_now,
1703 ulint n_to_reserve);
1704
1705/** Releases free extents in a file space.
1706@param[in] space_id Tablespace ID
1707@param[in] n_reserved How many were reserved */
1708void fil_space_release_free_extents(space_id_t space_id, ulint n_reserved);
1709
1710/** Gets the number of reserved extents. If the database is silent, this
1711number should be zero.
1712@param[in] space_id Tablespace ID
1713@return the number of reserved extents */
1714[[nodiscard]] ulint fil_space_get_n_reserved_extents(space_id_t space_id);
1715
1716/** Read or write data from a file.
1717@param[in] type IO context
1718@param[in] sync If true then do synchronous IO
1719@param[in] page_id page id
1720@param[in] page_size page size
1721@param[in] byte_offset remainder of offset in bytes; in aio this
1722 must be divisible by the OS block size
1723@param[in] len how many bytes to read or write; this must
1724 not cross a file boundary; in AIO this must
1725 be a block size multiple
1726@param[in,out] buf buffer where to store read data or from where
1727 to write; in AIO this must be appropriately
1728 aligned
1729@param[in] message message for AIO handler if !sync, else ignored
1730@return error code
1731@retval DB_SUCCESS on success
1732@retval DB_TABLESPACE_DELETED if the tablespace does not exist */
1733[[nodiscard]] dberr_t fil_io(const IORequest &type, bool sync,
1734 const page_id_t &page_id,
1735 const page_size_t &page_size, ulint byte_offset,
1736 ulint len, void *buf, void *message);
1737
1738/** Waits for an AIO operation to complete. This function is used to write the
1739handler for completed requests. The aio array of pending requests is divided
1740into segments (see os0file.cc for more info). The thread specifies which
1741segment it wants to wait for.
1742@param[in] segment The number of the segment in the AIO array
1743 to wait for */
1744void fil_aio_wait(ulint segment);
1745
1746/** Flushes to disk possible writes cached by the OS. If the space does
1747not exist or is being dropped, does not do anything.
1748@param[in] space_id Tablespace ID */
1749void fil_flush(space_id_t space_id);
1750
1751/** Flush to disk the writes in file spaces possibly cached by the OS
1752(note: spaces of type FIL_TYPE_TEMPORARY are skipped) */
1754
1755#ifdef UNIV_DEBUG
1756/** Checks the consistency of the tablespace cache.
1757@return true if ok */
1758bool fil_validate();
1759#endif /* UNIV_DEBUG */
1760
1761/** Returns true if file address is undefined.
1762@param[in] addr File address to check
1763@return true if undefined */
1764[[nodiscard]] bool fil_addr_is_null(const fil_addr_t &addr);
1765
1766/** Get the predecessor of a file page.
1767@param[in] page File page
1768@return FIL_PAGE_PREV */
1769[[nodiscard]] page_no_t fil_page_get_prev(const byte *page);
1770
1771/** Get the successor of a file page.
1772@param[in] page File page
1773@return FIL_PAGE_NEXT */
1774[[nodiscard]] page_no_t fil_page_get_next(const byte *page);
1775
1776/** Sets the file page type.
1777@param[in,out] page File page
1778@param[in] type File page type to set */
1779void fil_page_set_type(byte *page, ulint type);
1780
1781/** Reset the page type.
1782Data files created before MySQL 5.1 may contain garbage in FIL_PAGE_TYPE.
1783In MySQL 3.23.53, only undo log pages and index pages were tagged.
1784Any other pages were written with uninitialized bytes in FIL_PAGE_TYPE.
1785@param[in] page_id Page number
1786@param[in,out] page Page with invalid FIL_PAGE_TYPE
1787@param[in] type Expected page type
1788@param[in,out] mtr Mini-transaction */
1789void fil_page_reset_type(const page_id_t &page_id, byte *page, ulint type,
1790 mtr_t *mtr);
1791
1792/** Get the file page type.
1793@param[in] page File page
1794@return page type */
1796 return (static_cast<page_type_t>(mach_read_from_2(page + FIL_PAGE_TYPE)));
1797}
1798
1799#ifdef UNIV_DEBUG
1800/** Increase redo skipped count for a tablespace.
1801@param[in] space_id Tablespace ID */
1803
1804/** Decrease redo skipped count for a tablespace.
1805@param[in] space_id Tablespace ID */
1807
1808/** Check whether a single-table tablespace is redo skipped.
1809@param[in] space_id Tablespace ID
1810@return true if redo skipped */
1811[[nodiscard]] bool fil_space_is_redo_skipped(space_id_t space_id);
1812#endif /* UNIV_DEBUG */
1813
1814/** Delete the tablespace file and any related files like .cfg.
1815This should not be called for temporary tables.
1816@param[in] path File path of the IBD tablespace
1817@return true on success */
1818[[nodiscard]] bool fil_delete_file(const char *path);
1819
1820/** Callback functor. */
1822 /** Default constructor */
1824
1825 virtual ~PageCallback() UNIV_NOTHROW = default;
1826
1827 /** Called for page 0 in the tablespace file at the start.
1828 @param file_size size of the file in bytes
1829 @param block contents of the first page in the tablespace file
1830 @retval DB_SUCCESS or error code. */
1831 [[nodiscard]] virtual dberr_t init(os_offset_t file_size,
1832 const buf_block_t *block) UNIV_NOTHROW = 0;
1833
1834 /** Called for every page in the tablespace. If the page was not
1835 updated then its state must be set to BUF_PAGE_NOT_USED. For
1836 compressed tables the page descriptor memory will be at offset:
1837 block->frame + UNIV_PAGE_SIZE;
1838 @param offset physical offset within the file
1839 @param block block read from file, note it is not from the buffer pool
1840 @retval DB_SUCCESS or error code. */
1841 [[nodiscard]] virtual dberr_t operator()(os_offset_t offset,
1842 buf_block_t *block) UNIV_NOTHROW = 0;
1843
1844 /** Set the name of the physical file and the file handle that is used
1845 to open it for the file that is being iterated over.
1846 @param filename then physical name of the tablespace file.
1847 @param file OS file handle */
1849 m_file = file;
1851 }
1852
1853 /** @return the space id of the tablespace */
1854 [[nodiscard]] virtual space_id_t get_space_id() const UNIV_NOTHROW = 0;
1855
1856 /**
1857 @retval the space flags of the tablespace being iterated over */
1858 [[nodiscard]] virtual ulint get_space_flags() const UNIV_NOTHROW = 0;
1859
1860 /** Set the tablespace table size.
1861 @param[in] page a page belonging to the tablespace */
1863
1864 /** The compressed page size
1865 @return the compressed page size */
1866 [[nodiscard]] const page_size_t &get_page_size() const {
1867 return (m_page_size);
1868 }
1869
1870 /** The tablespace page size. */
1872
1873 /** File handle to the tablespace */
1875
1876 /** Physical file path. */
1877 const char *m_filepath;
1878
1879 // Disable copying
1881 PageCallback(const PageCallback &) = delete;
1883};
1884
1885/** Iterate over all the pages in the tablespace.
1886@param[in] encryption_metadata the encryption metadata to use for reading
1887@param[in] table the table definition in the server
1888@param[in] n_io_buffers number of blocks to read and write together
1889@param[in] compression_type compression type if compression is enabled,
1890else Compression::Type::NONE
1891@param[in,out] callback functor that will do the page updates
1892@return DB_SUCCESS or error code */
1893[[nodiscard]] dberr_t fil_tablespace_iterate(
1894 const Encryption_metadata &encryption_metadata, dict_table_t *table,
1895 ulint n_io_buffers, Compression::Type compression_type,
1896 PageCallback &callback);
1897
1898/** Looks for a pre-existing fil_space_t with the given tablespace ID
1899and, if found, returns the name and filepath in newly allocated buffers
1900that the caller must free.
1901@param[in] space_id The tablespace ID to search for.
1902@param[out] name Name of the tablespace found.
1903@param[out] filepath The filepath of the first datafile for the
1904tablespace.
1905@return true if tablespace is found, false if not. */
1906[[nodiscard]] bool fil_space_read_name_and_filepath(space_id_t space_id,
1907 char **name,
1908 char **filepath);
1909
1910/** Convert a file name to a tablespace name. Strip the file name
1911prefix and suffix, leaving only databasename/tablename.
1912@param[in] filename directory/databasename/tablename.ibd
1913@return database/tablename string, to be freed with ut::free() */
1914[[nodiscard]] char *fil_path_to_space_name(const char *filename);
1915
1916/** Returns the space ID based on the tablespace name.
1917The tablespace must be found in the tablespace memory cache.
1918This call is made from external to this module, so the mutex is not owned.
1919@param[in] name Tablespace name
1920@return space ID if tablespace found, SPACE_UNKNOWN if space not. */
1921[[nodiscard]] space_id_t fil_space_get_id_by_name(const char *name);
1922
1923/** Check if swapping two .ibd files can be done without failure
1924@param[in] old_table old table
1925@param[in] new_table new table
1926@param[in] tmp_name temporary table name
1927@return innodb error code */
1928[[nodiscard]] dberr_t fil_rename_precheck(const dict_table_t *old_table,
1929 const dict_table_t *new_table,
1930 const char *tmp_name);
1931
1932/** Set the compression type for the tablespace
1933@param[in] space_id Space ID of the tablespace
1934@param[in] algorithm Text representation of the algorithm
1935@return DB_SUCCESS or error code */
1936[[nodiscard]] dberr_t fil_set_compression(space_id_t space_id,
1937 const char *algorithm);
1938
1939/** Get the compression algorithm for a tablespace.
1940@param[in] space_id Space ID to check
1941@return the compression algorithm */
1942[[nodiscard]] Compression::Type fil_get_compression(space_id_t space_id);
1943
1944/** Set encryption information for IORequest.
1945@param[in,out] req_type IO request
1946@param[in] page_id page id
1947@param[in] space table space */
1948void fil_io_set_encryption(IORequest &req_type, const page_id_t &page_id,
1949 fil_space_t *space);
1950
1951/** Set the encryption type for the tablespace
1952@param[in] space_id Space ID of tablespace for which to set
1953@param[in] algorithm Encryption algorithm
1954@param[in] key Encryption key
1955@param[in] iv Encryption iv
1956@return DB_SUCCESS or error code */
1957[[nodiscard]] dberr_t fil_set_encryption(space_id_t space_id,
1958 Encryption::Type algorithm, byte *key,
1959 byte *iv);
1960
1961/** Set the autoextend_size attribute for the tablespace
1962@param[in] space_id Space ID of tablespace for which to set
1963@param[in] autoextend_size Value of autoextend_size attribute
1964@return DB_SUCCESS or error code */
1965dberr_t fil_set_autoextend_size(space_id_t space_id, uint64_t autoextend_size);
1966
1967/** Reset the encryption type for the tablespace
1968@param[in] space_id Space ID of tablespace for which to set
1969@return DB_SUCCESS or error code */
1970[[nodiscard]] dberr_t fil_reset_encryption(space_id_t space_id);
1971
1972/** Rotate the tablespace keys by new master key.
1973@return the number of tablespaces that failed to rotate. */
1974[[nodiscard]] size_t fil_encryption_rotate();
1975
1976/** Roencrypt the tablespace keys by current master key. */
1977void fil_encryption_reencrypt(std::vector<space_id_t> &sid_vector);
1978
1979/** During crash recovery, open a tablespace if it had not been opened
1980yet, to get valid size and flags.
1981@param[in,out] space Tablespace instance */
1983 if (space->size == 0) {
1984 /* Initially, size and flags will be set to 0,
1985 until the files are opened for the first time.
1986 fil_space_get_size() will open the file
1987 and adjust the size and flags. */
1988 page_no_t size = fil_space_get_size(space->id);
1989
1990 ut_a(size == space->size);
1991 }
1992}
1993
1994#if !defined(NO_FALLOCATE) && defined(UNIV_LINUX)
1995/**
1996Try and enable FusionIO atomic writes.
1997@param[in] file OS file handle
1998@return true if successful */
1999[[nodiscard]] bool fil_fusionio_enable_atomic_write(pfs_os_file_t file);
2000#endif /* !NO_FALLOCATE && UNIV_LINUX */
2001
2002/** Note that the file system where the file resides doesn't support PUNCH HOLE.
2003Called from AIO handlers when IO returns DB_IO_NO_PUNCH_HOLE
2004@param[in,out] file file to set */
2006
2007#ifdef UNIV_ENABLE_UNIT_TEST_MAKE_FILEPATH
2008void test_make_filepath();
2009#endif /* UNIV_ENABLE_UNIT_TEST_MAKE_FILEPATH */
2010
2011/** @return the system tablespace instance */
2014}
2015
2016/** Redo a tablespace create.
2017@param[in] ptr redo log record
2018@param[in] end end of the redo log buffer
2019@param[in] page_id Tablespace Id and first page in file
2020@param[in] parsed_bytes Number of bytes parsed so far
2021@param[in] parse_only Don't apply, parse only
2022@return pointer to next redo log record
2023@retval nullptr if this log record was truncated */
2024[[nodiscard]] byte *fil_tablespace_redo_create(byte *ptr, const byte *end,
2025 const page_id_t &page_id,
2026 ulint parsed_bytes,
2027 bool parse_only);
2028
2029/** Redo a tablespace delete.
2030@param[in] ptr redo log record
2031@param[in] end end of the redo log buffer
2032@param[in] page_id Tablespace Id and first page in file
2033@param[in] parsed_bytes Number of bytes parsed so far
2034@param[in] parse_only Don't apply, parse only
2035@return pointer to next redo log record
2036@retval nullptr if this log record was truncated */
2037[[nodiscard]] byte *fil_tablespace_redo_delete(byte *ptr, const byte *end,
2038 const page_id_t &page_id,
2039 ulint parsed_bytes,
2040 bool parse_only);
2041
2042/** Redo a tablespace rename.
2043This function doesn't do anything, simply parses the redo log record.
2044@param[in] ptr redo log record
2045@param[in] end end of the redo log buffer
2046@param[in] page_id Tablespace Id and first page in file
2047@param[in] parsed_bytes Number of bytes parsed so far
2048@param[in] parse_only Don't apply, parse only
2049@return pointer to next redo log record
2050@retval nullptr if this log record was truncated */
2051[[nodiscard]] byte *fil_tablespace_redo_rename(byte *ptr, const byte *end,
2052 const page_id_t &page_id,
2053 ulint parsed_bytes,
2054 bool parse_only);
2055
2056/** Redo a tablespace extend
2057@param[in] ptr redo log record
2058@param[in] end end of the redo log buffer
2059@param[in] page_id Tablespace Id and first page in file
2060@param[in] parsed_bytes Number of bytes parsed so far
2061@param[in] parse_only Don't apply the log if true
2062@return pointer to next redo log record
2063@retval nullptr if this log record was truncated */
2064[[nodiscard]] byte *fil_tablespace_redo_extend(byte *ptr, const byte *end,
2065 const page_id_t &page_id,
2066 ulint parsed_bytes,
2067 bool parse_only);
2068
2069/** Parse and process an encryption redo record.
2070@param[in] ptr redo log record
2071@param[in] end end of the redo log buffer
2072@param[in] space_id the tablespace ID
2073@param[in] lsn lsn for REDO record
2074@return log record end, nullptr if not a complete record */
2075[[nodiscard]] byte *fil_tablespace_redo_encryption(byte *ptr, const byte *end,
2076 space_id_t space_id,
2077 lsn_t lsn);
2078
2079/** Read the tablespace id to path mapping from the file
2080@param[in] recovery true if called from crash recovery */
2082
2083/** Lookup the tablespace ID.
2084@param[in] space_id Tablespace ID to lookup
2085@return true if the space ID is known. */
2086[[nodiscard]] bool fil_tablespace_lookup_for_recovery(space_id_t space_id);
2087
2088/** Compare and update space name and dd path for partitioned table. Uniformly
2089converts partition separators and names to lower case.
2090@param[in] space_id tablespace ID
2091@param[in] fsp_flags tablespace flags
2092@param[in] update_space update space name
2093@param[in,out] space_name tablespace name
2094@param[in,out] dd_path file name with complete path
2095@return true, if names are updated. */
2096bool fil_update_partition_name(space_id_t space_id, uint32_t fsp_flags,
2097 bool update_space, std::string &space_name,
2098 std::string &dd_path);
2099
2100/** Add tablespace to the set of tablespaces to be updated in DD.
2101@param[in] dd_object_id Server DD tablespace ID
2102@param[in] space_id Innodb tablespace ID
2103@param[in] space_name New tablespace name
2104@param[in] old_path Old Path in the data dictionary
2105@param[in] new_path New path to be update in dictionary */
2106void fil_add_moved_space(dd::Object_id dd_object_id, space_id_t space_id,
2107 const char *space_name, const std::string &old_path,
2108 const std::string &new_path);
2109
2110/** Lookup the tablespace ID and return the path to the file. The filename
2111is ignored when testing for equality. Only the path up to the file name is
2112considered for matching: e.g. ./test/a.ibd == ./test/b.ibd.
2113@param[in] space_id tablespace ID to lookup
2114@param[in] space_name tablespace name
2115@param[in] fsp_flags tablespace flags
2116@param[in] old_path the path found in dd:Tablespace_files
2117@param[out] new_path the scanned path for this space_id
2118@return status of the match. */
2119[[nodiscard]] Fil_state fil_tablespace_path_equals(space_id_t space_id,
2120 const char *space_name,
2121 ulint fsp_flags,
2122 std::string old_path,
2123 std::string *new_path);
2124
2125/** This function should be called after recovery has completed.
2126Check for tablespace files for which we did not see any MLOG_FILE_DELETE
2127or MLOG_FILE_RENAME record. These could not be recovered
2128@return true if there were some filenames missing for which we had to
2129ignore redo log records during the apply phase */
2130[[nodiscard]] bool fil_check_missing_tablespaces();
2131
2132/** Normalize and save a directory to scan for datafiles.
2133@param[in] directory directory to scan for ibd and ibu files
2134@param[in] is_undo_dir true for an undo directory */
2135void fil_set_scan_dir(const std::string &directory, bool is_undo_dir = false);
2136
2137/** Normalize and save a list of directories to scan for datafiles.
2138@param[in] directories Directories to scan for ibd and ibu files
2139 in the form: "dir1;dir2; ... dirN" */
2140void fil_set_scan_dirs(const std::string &directories);
2141
2142/** Discover tablespaces by reading the header from .ibd files.
2143@return DB_SUCCESS if all goes well */
2145
2146/** Open the tablespace and also get the tablespace filenames, space_id must
2147already be known.
2148@param[in] space_id Tablespace ID to lookup
2149@return DB_SUCCESS if open was successful */
2151
2152/** Replay a file rename operation for ddl replay.
2153@param[in] page_id Space ID and first page number in the file
2154@param[in] old_name old file name
2155@param[in] new_name new file name
2156@return whether the operation was successfully applied
2157(the name did not exist, or new_name did not exist and
2158name was successfully renamed to new_name) */
2159bool fil_op_replay_rename_for_ddl(const page_id_t &page_id,
2160 const char *old_name, const char *new_name);
2161
2162/** Free the Tablespace_files instance.
2163@param[in] read_only_mode true if InnoDB is started in read only mode.
2164@return DB_SUCCESS if all OK */
2165[[nodiscard]] dberr_t fil_open_for_business(bool read_only_mode);
2166
2167/** Check if a path is known to InnoDB meaning that it is in or under
2168one of the four path settings scanned at startup for file discovery.
2169@param[in] path Path to check
2170@return true if path is known to InnoDB */
2171[[nodiscard]] bool fil_path_is_known(const std::string &path);
2172
2173/** Get the list of directories that datafiles can reside in.
2174@return the list of directories 'dir1;dir2;....;dirN' */
2175[[nodiscard]] std::string fil_get_dirs();
2176
2177/** Rename a tablespace. Use the space_id to find the shard.
2178@param[in] space_id tablespace ID
2179@param[in] old_name old tablespace name
2180@param[in] new_name new tablespace name
2181@return DB_SUCCESS on success */
2182[[nodiscard]] dberr_t fil_rename_tablespace_by_id(space_id_t space_id,
2183 const char *old_name,
2184 const char *new_name);
2185
2186/** Write initial pages for a new tablespace file created.
2187@param[in] file open file handle
2188@param[in] path path and filename of the datafile
2189@param[in] type file type
2190@param[in] size Initial size of the tablespace file in pages
2191@param[in] encrypt_info encryption key information
2192@param[in] space_id tablespace ID
2193@param[in,out] space_flags tablespace flags
2194@param[out] atomic_write if atomic write is used
2195@param[out] punch_hole if punch hole is used
2196@return DB_SUCCESS on success */
2197[[nodiscard]] dberr_t fil_write_initial_pages(
2198 pfs_os_file_t file, const char *path, fil_type_t type, page_no_t size,
2199 const byte *encrypt_info, space_id_t space_id, uint32_t &space_flags,
2200 bool &atomic_write, bool &punch_hole);
2201
2202/** Free the data structures required for recovery. */
2204
2205/** Update the tablespace name. In case, the new name
2206and old name are same, no update done.
2207@param[in,out] space tablespace object on which name
2208 will be updated
2209@param[in] name new name for tablespace */
2210void fil_space_update_name(fil_space_t *space, const char *name);
2211
2212/** Adjust file name for import for partition files in different letter case.
2213@param[in] table Innodb dict table
2214@param[in] path file path to open
2215@param[in] extn file extension */
2216void fil_adjust_name_import(dict_table_t *table, const char *path,
2217 ib_file_suffix extn);
2218
2219#ifndef UNIV_HOTBACKUP
2220
2221/** Allows fil system to do periodical cleanup. */
2222void fil_purge();
2223
2224/** Count how many truncated undo space IDs are still tracked in
2225the buffer pool and the file_system cache.
2226@param[in] undo_num undo tablespace number.
2227@return number of undo tablespaces that are still in memory. */
2228size_t fil_count_undo_deleted(space_id_t undo_num);
2229
2230#endif /* !UNIV_HOTBACKUP */
2231
2232/** Get the page type as a string.
2233@param[in] type page type to be converted to string.
2234@return the page type as a string. */
2235[[nodiscard]] const char *fil_get_page_type_str(page_type_t type) noexcept;
2236
2237/** Check if the given page type is valid.
2238@param[in] type the page type to be checked for validity.
2239@return true if it is valid page type, false otherwise. */
2240[[nodiscard]] bool fil_is_page_type_valid(page_type_t type) noexcept;
2241#endif /* fil0fil_h */
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:51
uint32_t page_no_t
Page number.
Definition: api0api.h:49
byte buf_frame_t
A buffer frame.
Definition: buf0types.h:62
buf_remove_t
Algorithm to remove the pages for a tablespace from the buffer pool.
Definition: buf0types.h:84
Type
Algorithm types supported.
Definition: os0enc.h:57
Progress
Encryption progress type.
Definition: os0enc.h:80
Iterate over the files in all the tablespaces.
Definition: fil0fil.h:1464
std::function< dberr_t(fil_node_t *)> Function
Definition: fil0fil.h:1466
static dberr_t iterate(Function &&f)
Iterate through all persistent tablespace files (FIL_TYPE_TABLESPACE) returning the nodes via callbac...
Definition: fil0fil.cc:3936
static dberr_t for_each_file(F &&f)
For each data file.
Definition: fil0fil.h:1471
Wrapper for a path to a directory that may or may not exist.
Definition: fil0fil.h:583
bool is_ancestor(const Fil_path &other) const
Check if m_path is the parent of the other path.
Definition: fil0fil.cc:9197
size_t abs_len() const
Definition: fil0fil.h:656
static void convert_to_filename_charset(std::string &name)
Convert filename to the file system charset format.
Definition: fil0fil.cc:11567
static bool is_same_as(const std::string &first, const std::string &second)
Check if two path strings are equal.
Definition: fil0fil.h:678
static char * make_ibd_from_table_name(const std::string &name_in)
Allocate and build a file name from a path, a table or tablespace name and a suffix.
Definition: fil0fil.h:1022
static const char * get_file_type_string(const std::string &path)
Return a string to display the file type of a path.
Definition: fil0fil.cc:9265
path_type
Various types of file paths.
Definition: fil0fil.h:604
@ absolute
Definition: fil0fil.h:604
@ invalid
Definition: fil0fil.h:604
@ relative
Definition: fil0fil.h:604
@ file_name_only
Definition: fil0fil.h:604
bool operator==(const Fil_path &other) const
Determine if this path is equal to the other path.
Definition: fil0fil.h:661
static char * make(const std::string &path_in, const std::string &name_in, ib_file_suffix ext, bool trim=false)
Allocate and build a file name from a path, a table or tablespace name and a suffix.
Definition: fil0fil.cc:4894
static bool is_ancestor(const std::string &first, const std::string &second)
Check if the first path is an ancestor of the second.
Definition: fil0fil.h:718
static char * make_cfp(const std::string &path_in)
Allocate and build a CFP file name from a path.
Definition: fil0fil.h:1002
static constexpr auto SEPARATOR
Directory separators that are supported.
Definition: fil0fil.h:592
static constexpr auto DOT_SLASH
Definition: fil0fil.h:598
std::string m_path
Path to a file or directory.
Definition: fil0fil.h:1094
const char * operator()() const
Explicit type conversion.
Definition: fil0fil.h:634
static bool is_relative_path(const std::string &path)
Determine if a path is a relative path or not.
Definition: fil0fil.h:788
static bool is_absolute_path(const std::string &path)
Determine if a path is an absolute path or not.
Definition: fil0fil.h:801
static void convert_to_lower_case(std::string &path)
Convert to lower case using the file system charset.
Definition: fil0fil.cc:11584
static std::string get_basename(const std::string &filepath)
Get the basename of the file path.
Definition: fil0fil.cc:4312
bool is_same_as(const Fil_path &other) const
Check if m_path is the same as this other path.
Definition: fil0fil.cc:9167
const std::string abs_path() const
Return the absolute path by value.
Definition: fil0fil.h:647
bool is_valid() const
This validation is only for ':'.
Definition: fil0fil.cc:9307
static std::string make_new_path(const std::string &path_in, const std::string &name_in, ib_file_suffix extn)
Create an IBD path name after replacing the basename in an old path with a new basename.
Definition: fil0fil.cc:5006
std::string m_abs_path
A full absolute path to the same file.
Definition: fil0fil.h:1097
static bool is_separator(char c)
Check if a character is a path separator ('\' or '/')
Definition: fil0fil.h:955
static void append_separator(std::string &path)
If the last character of a directory path is NOT a separator, append a separator to the path.
Definition: fil0fil.h:972
static bool is_valid_location_within_db(const char *space_name, const std::string &path)
Check if the implicit filepath is immediately within a dir named for the schema.
Definition: fil0fil.cc:11504
static constexpr auto SLASH_DOT_DOT_SLASH
Definition: fil0fil.h:600
static std::pair< std::string, std::string > split(const std::string &path)
Splits the path into directory and file name parts.
Definition: fil0fil.cc:9191
size_t len() const
Definition: fil0fil.h:640
static char * make_cfg(const std::string &path_in)
Allocate and build a CFG file name from a path.
Definition: fil0fil.h:995
static std::string remove_quotes(const char *pathspec)
Remove quotes e.g., 'a;b' or "a;b" -> a;b.
Definition: fil0fil.h:770
static constexpr auto OS_SEPARATOR
OS specific path separator.
Definition: fil0fil.h:589
static bool is_valid_location(const char *space_name, space_id_t space_id, uint32_t fsp_flags, const std::string &path)
Check if the filepath provided is in a valid placement.
Definition: fil0fil.cc:11460
static bool is_undo_tablespace_name(const std::string &name)
Check if the name is an undo tablespace name.
Definition: fil0fil.cc:2096
static char * make_ibd(const std::string &path_in, const std::string &name_in)
Allocate and build a file name from a path, a table or tablespace name and a suffix.
Definition: fil0fil.h:1013
const std::string & path() const
Definition: fil0fil.h:637
bool is_circular() const
Determine if m_path contains a circular section like "/anydir/../" Fil_path::normalize() must be run ...
Definition: fil0fil.cc:9331
bool is_directory_and_exists() const
Definition: fil0fil.cc:9301
static std::string get_real_path(const std::string &path, bool force=true)
Get the real path for a directory or a file name.
Definition: fil0fil.cc:4202
bool is_file_and_exists() const
Definition: fil0fil.cc:9296
static bool is_hidden(std::string path)
Determine if the file or directory is considered HIDDEN.
Definition: fil0fil.cc:9228
bool is_absolute_path() const
Definition: fil0fil.h:793
static constexpr auto DB_SEPARATOR
schema '/' table separator
Definition: fil0fil.h:586
static void make_data_dir_path(char *data_dir_path)
This function reduces a null-terminated full remote path name into the path that is sent by MySQL for...
Definition: fil0fil.cc:5045
static void normalize(char *path)
Normalize a directory path for the current OS: On Windows, we convert '/' to '\', else we convert '\'...
Definition: fil0fil.h:862
Fil_path()
Default constructor.
Definition: fil0fil.cc:9164
static os_file_type_t get_file_type(const std::string &path)
Definition: fil0fil.cc:9254
static bool truncate_suffix(ib_file_suffix sfx, std::string &path)
Check if the file has the the specified suffix and truncate.
Definition: fil0fil.h:939
static void to_lower(std::string &path)
Convert a path string to lower case using the CHARSET my_charset_filename.
Definition: fil0fil.h:872
static bool parse_file_path(const std::string &file_path, ib_file_suffix extn, std::string &dict_name)
Parse file-per-table file name and build Innodb dictionary table name.
Definition: fil0fil.cc:4974
static path_type type_of_path(const std::string &path)
Determine what type of path is provided.
Definition: fil0fil.h:809
static void normalize(std::string &path)
Normalize a directory path for the current OS: On Windows, we convert '/' to '\', else we convert '\'...
Definition: fil0fil.h:851
static std::string get_existing_path(const std::string &path, std::string &ghost)
Separate the portion of a directory path that exists and the portion that does not exist.
Definition: fil0fil.cc:4172
static void trim_separator(std::string &path)
If the last character of a directory path is a separator ('\' or '/') trim it off the string.
Definition: fil0fil.h:960
static constexpr auto DOT_DOT_SLASH
Definition: fil0fil.h:599
static bool has_prefix(const std::string &path, const std::string prefix)
Definition: fil0fil.h:842
static bool has_suffix(ib_file_suffix sfx, const std::string &path)
Check if the file has the the specified suffix.
Definition: fil0fil.h:927
We use Flush_observer to track flushing of non-redo logged pages in bulk create index(btr0load....
Definition: buf0flu.h:269
The IO Context that is passed down to the low level IO code.
Definition: os0file.h:275
Allows to monitor an event processing times, allowing to throttle the processing to one per THROTTLE_...
Definition: ut0ut.h:362
For measuring time elapsed.
Definition: ut0ut.h:300
Page identifier.
Definition: buf0types.h:207
Page size descriptor.
Definition: page0size.h:50
const char * p
Definition: ctype-mb.cc:1237
int page
Definition: ctype-mb.cc:1236
dberr_t
Definition: db0err.h:39
Data dictionary global types.
static duk_ret_t normalize_path(duk_context *ctx, duk_idx_t obj_idx)
Definition: duk_module_shim.cc:77
byte * fil_tablespace_redo_delete(byte *ptr, const byte *end, const page_id_t &page_id, ulint parsed_bytes, bool parse_only)
Redo a tablespace delete.
Definition: fil0fil.cc:10480
static constexpr char general_space_name[]
This tablespace name is used internally during file discovery to open a general tablespace before the...
Definition: fil0fil.h:83
bool fil_system_get_file_by_space_num(space_id_t space_num, space_id_t &space_id, std::string &name)
Fetch the file name opened for an undo space number from the file map.
Definition: fil0fil.cc:4460
constexpr page_type_t FIL_PAGE_TYPE_LOB_FIRST
The first page of an uncompressed LOB.
Definition: fil0fil.h:1268
bool fil_system_get_file_by_space_id(space_id_t space_id, std::string &name)
Fetch the file name opened for a space_id from the file map.
Definition: fil0fil.cc:4454
void fil_purge()
Allows fil system to do periodical cleanup.
Definition: fil0fil.cc:11596
bool fil_is_page_type_valid(page_type_t type) noexcept
Check if the given page type is valid.
Definition: fil0fil.cc:11647
bool fil_check_missing_tablespaces()
This function should be called after recovery has completed.
Definition: fil0fil.cc:10091
constexpr page_type_t FIL_PAGE_UNDO_LOG
Undo log page.
Definition: fil0fil.h:1197
fil_space_t * fil_space_create(const char *name, space_id_t space_id, uint32_t flags, fil_type_t purpose)
Create a space memory object and put it to the fil_system hash table.
Definition: fil0fil.cc:3303
std::ostream & operator<<(std::ostream &out, const fil_addr_t &obj)
Definition: fil0fil.h:1174
constexpr page_type_t FIL_PAGE_TYPE_LOB_INDEX
Index pages of uncompressed LOB.
Definition: fil0fil.h:1262
constexpr page_type_t FIL_PAGE_ENCRYPTED_RTREE
Encrypted R-tree page.
Definition: fil0fil.h:1247
bool fil_path_is_known(const std::string &path)
Check if a path is known to InnoDB meaning that it is in or under one of the four path settings scann...
Definition: fil0fil.cc:11429
bool fil_validate()
Checks the consistency of the tablespace cache.
Definition: fil0fil.cc:1947
constexpr page_no_t PAGE_NO_MAX
Maximum Page Number, one less than FIL_NULL.
Definition: fil0fil.h:1122
constexpr page_type_t FIL_PAGE_TYPE_LOB_DATA
Data pages of uncompressed LOB.
Definition: fil0fil.h:1265
constexpr page_type_t FIL_PAGE_TYPE_ZBLOB
First compressed BLOB page.
Definition: fil0fil.h:1228
uint32_t fil_space_get_flags(space_id_t space_id)
Returns the flags of the space.
Definition: fil0fil.cc:3523
void fil_io_set_encryption(IORequest &req_type, const page_id_t &page_id, fil_space_t *space)
Set encryption information for IORequest.
Definition: fil0fil.cc:7535
dberr_t fil_set_compression(space_id_t space_id, const char *algorithm)
Set the compression type for the tablespace.
Definition: fil0fil.cc:8830
page_no_t fil_page_get_prev(const byte *page)
Get the predecessor of a file page.
Definition: fil0fil.cc:8195
Fil_path MySQL_undo_path
The MySQL server –innodb-undo-directory value.
Definition: fil0fil.cc:279
bool fil_page_index_page_check(const byte *page)
Check whether the page is index page (either regular Btree index or Rtree index.
Definition: fil0fil.h:1299
rw_lock_t * fil_space_get_latch(space_id_t space_id)
Returns the latch of a file space.
Definition: fil0fil.cc:2234
bool fil_delete_file(const char *path)
Delete the tablespace file and any related files like .cfg.
Definition: fil0fil.cc:8709
ulint fil_space_get_n_reserved_extents(space_id_t space_id)
Gets the number of reserved extents.
Definition: fil0fil.cc:7387
ulong srv_fast_shutdown
The value of the configuration parameter innodb_fast_shutdown, controlling the InnoDB shutdown.
Definition: srv0srv.cc:566
constexpr size_t FIL_NODE_MAGIC_N
Value of fil_node_t::magic_n.
Definition: fil0fil.h:552
void fil_open_system_tablespace_files()
Opens all log files and system tablespace data files.
Definition: fil0fil.cc:3745
constexpr size_t FIL_SCAN_MAX_TABLESPACES_PER_THREAD
Maximum number of tablespaces to be scanned by a thread while scanning for available tablespaces duri...
Definition: fil0fil.h:64
constexpr page_type_t FIL_PAGE_COMPRESSED_AND_ENCRYPTED
Compressed and Encrypted page.
Definition: fil0fil.h:1244
char * fil_path_to_space_name(const char *filename)
Convert a file name to a tablespace name.
Definition: fil0fil.cc:5977
uint16_t page_type_t
Definition: fil0fil.h:1181
byte * fil_tablespace_redo_create(byte *ptr, const byte *end, const page_id_t &page_id, ulint parsed_bytes, bool parse_only)
Redo a tablespace create.
Definition: fil0fil.cc:10103
page_no_t fil_space_get_undo_initial_size(space_id_t space_id)
Returns the size of an undo space just after it was initialized.
Definition: fil0fil.cc:3487
void fil_encryption_reencrypt(std::vector< space_id_t > &sid_vector)
Roencrypt the tablespace keys by current master key.
Definition: fil0fil.cc:9119
byte * fil_tablespace_redo_rename(byte *ptr, const byte *end, const page_id_t &page_id, ulint parsed_bytes, bool parse_only)
Redo a tablespace rename.
Definition: fil0fil.cc:10203
fil_type_t fil_space_get_type(space_id_t space_id)
Gets the type of a file space.
Definition: fil0fil.cc:2251
void fil_space_inc_redo_skipped_count(space_id_t space_id)
Increase redo skipped count for a tablespace.
Definition: fil0fil.cc:4721
void fil_space_set_flags(fil_space_t *space, uint32_t flags)
Sets the flags of the tablespace.
Definition: fil0fil.cc:9364
dberr_t fil_tablespace_open_for_recovery(space_id_t space_id)
Open the tablespace and also get the tablespace filenames, space_id must already be known.
Definition: fil0fil.cc:9853
constexpr size_t FIL_IBD_FILE_INITIAL_SIZE_5_7
An empty tablespace (CREATE TABLESPACE) has minimum of 4 pages and an empty CREATE TABLE (file_per_ta...
Definition: fil0fil.h:1116
bool fil_space_extend(fil_space_t *space, page_no_t size)
Try to extend a tablespace if it is smaller than the specified size.
Definition: fil0fil.cc:6774
constexpr page_type_t FIL_PAGE_TYPE_ZLOB_FRAG_ENTRY
Index pages of fragment pages (compressed LOB).
Definition: fil0fil.h:1284
dberr_t fil_close_tablespace(space_id_t space_id)
Closes a single-table tablespace.
Definition: fil0fil.cc:4331
constexpr page_type_t FIL_PAGE_INODE
Index node.
Definition: fil0fil.h:1200
bool fil_update_partition_name(space_id_t space_id, uint32_t fsp_flags, bool update_space, std::string &space_name, std::string &dd_path)
Compare and update space name and dd path for partitioned table.
Definition: fil0fil.cc:9979
void fil_free_scanned_files()
Free the data structures required for recovery.
Definition: fil0fil.cc:11438
constexpr page_type_t FIL_PAGE_TYPE_UNUSED
This page type is unused.
Definition: fil0fil.h:1194
constexpr page_type_t FIL_PAGE_INDEX
File page types (values of FIL_PAGE_TYPE)
Definition: fil0fil.h:1185
std::atomic_size_t fil_n_files_open
Number of files currently open.
Definition: fil0fil.cc:292
bool MySQL_undo_path_is_unique
The undo path is different from any other known directory.
Definition: fil0fil.cc:282
void fil_space_dec_redo_skipped_count(space_id_t space_id)
Decrease redo skipped count for a tablespace.
Definition: fil0fil.cc:4737
constexpr page_type_t FIL_PAGE_RTREE
R-tree node.
Definition: fil0fil.h:1188
void fil_space_open_if_needed(fil_space_t *space)
During crash recovery, open a tablespace if it had not been opened yet, to get valid size and flags.
Definition: fil0fil.h:1982
constexpr size_t FIL_IBD_FILE_INITIAL_SIZE
Initial size of a single-table tablespace in pages.
Definition: fil0fil.h:1110
static constexpr char undo_space_name[]
This tablespace name is used as the prefix for implicit undo tablespaces and during file discovery to...
Definition: fil0fil.h:88
bool fil_space_exists_in_mem(space_id_t space_id, const char *name, bool print_err, bool adjust_space)
Returns true if a matching tablespace exists in the InnoDB tablespace memory cache.
Definition: fil0fil.cc:6427
bool fil_space_read_name_and_filepath(space_id_t space_id, char **name, char **filepath)
Looks for a pre-existing fil_space_t with the given tablespace ID and, if found, returns the name and...
Definition: fil0fil.cc:5946
dberr_t fil_set_encryption(space_id_t space_id, Encryption::Type algorithm, byte *key, byte *iv)
Set the encryption type for the tablespace.
Definition: fil0fil.cc:8923
dberr_t fil_rename_tablespace_by_id(space_id_t space_id, const char *old_name, const char *new_name)
Rename a tablespace.
Definition: fil0fil.cc:5454
constexpr size_t FIL_IBT_FILE_INITIAL_SIZE
Definition: fil0fil.h:1111
void fil_space_update_name(fil_space_t *space, const char *name)
Update the tablespace name.
Definition: fil0fil.cc:11445
bool fil_open_files_limit_update(size_t &new_max_open_files)
Changes the maximum opened files limit.
Definition: fil0fil.cc:3620
constexpr page_no_t FIL_NULL
'null' (undefined) page offset in the context of file spaces
Definition: fil0fil.h:1119
constexpr size_t FIL_SPACE_MAGIC_N
Value of fil_space_t::magic_n.
Definition: fil0fil.h:549
dberr_t fil_reset_encryption(space_id_t space_id)
Reset the encryption type for the tablespace.
Definition: fil0fil.cc:8952
size_t fil_get_scan_threads(size_t num_files)
Calculate the number of threads that can be spawned to scan the given number of files taking into the...
Definition: fil0fil.cc:130
void fil_space_close(space_id_t space_id)
Close each file of a tablespace if open.
Definition: fil0fil.cc:3575
fil_space_t * fil_space_acquire(space_id_t space_id)
Acquire a tablespace when it could be dropped concurrently.
Definition: fil0fil.cc:4020
fil_space_t * fil_space_acquire_silent(space_id_t space_id)
Acquire a tablespace that may not exist.
Definition: fil0fil.cc:4029
Fil_state
Result of comparing a path.
Definition: fil0fil.h:130
@ MATCHES
The path matches what was found during the scan.
@ MISSING
No MLOG_FILE_DELETE record and the file could not be found.
@ DELETED
A MLOG_FILE_DELETE was found, file was deleted.
@ MOVED
Space ID matches but the paths don't match.
@ RENAMED
Tablespace and/or filename was renamed.
dberr_t fil_write_flushed_lsn(lsn_t lsn)
Write the flushed LSN to the page header of the first page in the system tablespace.
Definition: fil0fil.cc:3953
char * fil_space_get_first_path(space_id_t space_id)
Returns the path from the first fil_node_t found with this space ID.
Definition: fil0fil.cc:3449
constexpr page_type_t FIL_PAGE_TYPE_ZLOB_FRAG
Fragment pages of compressed LOB.
Definition: fil0fil.h:1281
char * fil_node_create(const char *name, page_no_t size, fil_space_t *space, bool is_raw, bool atomic_write, page_no_t max_pages=PAGE_NO_MAX)
Attach a file to a tablespace.
Definition: fil0fil.cc:2422
constexpr page_type_t FIL_PAGE_TYPE_LAST
Note the highest valid non-index page_type_t.
Definition: fil0fil.h:1287
void fil_tablespace_open_init_for_recovery(bool recovery)
Read the tablespace id to path mapping from the file.
fil_addr_t fil_addr_null
The null file address.
Definition: fil0fil.cc:326
void fil_close_all_files()
Closes all open files.
Definition: fil0fil.cc:3890
byte * fil_tablespace_redo_encryption(byte *ptr, const byte *end, space_id_t space_id, lsn_t lsn)
Parse and process an encryption redo record.
Definition: fil0fil.cc:10568
void fil_init(ulint max_n_open)
Initializes the tablespace memory cache.
Definition: fil0fil.cc:3605
size_t fil_encryption_rotate()
Rotate the tablespace keys by new master key.
Definition: fil0fil.cc:9117
bool fil_page_type_is_index(page_type_t page_type)
Check whether the page type is index (Btree or Rtree or SDI) type.
Definition: fil0fil.h:1290
void fil_set_scan_dirs(const std::string &directories)
Normalize and save a list of directories to scan for datafiles.
Definition: fil0fil.cc:11417
fil_space_t * fil_space_get_sys_space()
Definition: fil0fil.h:2012
void fil_no_punch_hole(fil_node_t *file)
Note that the file system where the file resides doesn't support PUNCH HOLE.
Definition: fil0fil.cc:8828
const page_size_t fil_space_get_page_size(space_id_t space_id, bool *found)
Returns the page size of the space and whether it is compressed or not.
Definition: fil0fil.cc:3590
dberr_t fil_scan_for_tablespaces()
Discover tablespaces by reading the header from .ibd files.
Definition: fil0fil.cc:11423
byte fil_faddr_t
'type' definition in C: an address stored in a file page is a string of bytes
Definition: fil0fil.h:1133
dberr_t fil_rename_tablespace_check(space_id_t space_id, const char *old_path, const char *new_path, bool is_discarded)
Test if a tablespace file can be renamed to a new filepath by checking if that the old filepath exist...
Definition: fil0fil.cc:5076
void fil_space_release(fil_space_t *space)
Release a tablespace acquired with fil_space_acquire().
Definition: fil0fil.cc:4035
bool fil_truncate_tablespace(space_id_t space_id, page_no_t size_in_pages)
Truncate the tablespace to needed size.
Definition: fil0fil.cc:4712
byte * fil_tablespace_redo_extend(byte *ptr, const byte *end, const page_id_t &page_id, ulint parsed_bytes, bool parse_only)
Redo a tablespace extend.
Definition: fil0fil.cc:10313
void fil_close()
Initializes the tablespace memory cache.
Definition: fil0fil.cc:8229
const char * fil_get_page_type_str(page_type_t type) noexcept
Get the page type as a string.
Definition: fil0fil.cc:11608
void fil_flush_file_spaces()
Flush to disk the writes in file spaces possibly cached by the OS (note: spaces of type FIL_TYPE_TEMP...
Definition: fil0fil.cc:8183
std::vector< std::string, ut::allocator< std::string > > Filenames
Definition: fil0fil.h:116
bool fil_space_reserve_free_extents(space_id_t space_id, ulint n_free_now, ulint n_to_reserve)
Tries to reserve free extents in a file space.
Definition: fil0fil.cc:7342
dberr_t fil_ibd_open(bool validate, fil_type_t purpose, space_id_t space_id, uint32_t flags, const char *space_name, const char *path_in, bool strict, bool old_space)
Open a single-table tablespace and optionally do some validation such as checking that the space id i...
Definition: fil0fil.cc:5761
page_no_t fil_page_get_next(const byte *page)
Get the successor of a file page.
Definition: fil0fil.cc:8202
constexpr size_t FIL_SCAN_THREADS_PER_CORE
Number of threads per core.
Definition: fil0fil.h:72
constexpr page_type_t FIL_PAGE_TYPE_ZLOB_DATA
Data pages of compressed LOB.
Definition: fil0fil.h:1274
constexpr page_type_t FIL_PAGE_TYPE_XDES
Extent descriptor page.
Definition: fil0fil.h:1222
fil_type_t
File types.
Definition: fil0fil.h:120
@ FIL_TYPE_TEMPORARY
temporary tablespace (temporary undo log or tables)
Definition: fil0fil.h:122
@ FIL_TYPE_IMPORT
a tablespace that is being imported (no logging until finished)
Definition: fil0fil.h:124
@ FIL_TYPE_TABLESPACE
persistent tablespace (for system, undo log or tables)
Definition: fil0fil.h:126
void fil_space_set_undo_size(space_id_t space_id, bool use_current)
This is called for an undo tablespace after it has been initialized or opened.
Definition: fil0fil.cc:3501
constexpr page_type_t FIL_PAGE_COMPRESSED
Compressed page.
Definition: fil0fil.h:1238
std::vector< space_id_t, ut::allocator< space_id_t > > Space_ids
Definition: fil0fil.h:117
std::atomic< std::uint64_t > fil_n_pending_tablespace_flushes
Number of pending tablespace flushes.
Definition: fil0fil.cc:289
constexpr page_type_t FIL_PAGE_SDI
Tablespace SDI Index page.
Definition: fil0fil.h:1191
bool fil_tablespace_lookup_for_recovery(space_id_t space_id)
Lookup the tablespace ID.
Definition: fil0fil.cc:9800
dberr_t fil_rename_tablespace(space_id_t space_id, const char *old_path, const char *new_name, const char *new_path_in)
Rename a single-table tablespace.
Definition: fil0fil.cc:5378
dberr_t fil_tablespace_iterate(const Encryption_metadata &encryption_metadata, dict_table_t *table, ulint n_io_buffers, Compression::Type compression_type, PageCallback &callback)
Iterate over all the pages in the tablespace.
Definition: fil0fil.cc:8519
void fil_space_set_imported(space_id_t space_id)
Note that a tablespace has been imported.
Definition: fil0fil.cc:2265
constexpr size_t FIL_SCAN_MAX_THREADS
Maximum number of threads that will be used for scanning the tablespace files.
Definition: fil0fil.h:69
constexpr uint32_t UNDO_INITIAL_SIZE
Initial size of an UNDO tablespace when it is created new or truncated under low load.
Definition: fil0fil.h:101
void fil_extend_tablespaces_to_stored_len()
Extends all tablespaces to the size stored in the space header.
void fil_space_release_free_extents(space_id_t space_id, ulint n_reserved)
Releases free extents in a file space.
Definition: fil0fil.cc:7368
constexpr page_type_t FIL_PAGE_TYPE_ZBLOB2
Subsequent compressed BLOB page.
Definition: fil0fil.h:1231
constexpr page_type_t FIL_PAGE_TYPE_UNKNOWN
In old tablespaces, garbage in FIL_PAGE_TYPE is replaced with this value when flushing pages.
Definition: fil0fil.h:1235
constexpr page_type_t FIL_PAGE_TYPE_ZLOB_FIRST
The first page of a compressed LOB.
Definition: fil0fil.h:1271
fil_space_t * fil_space_get(space_id_t space_id)
Look up a tablespace.
Definition: fil0fil.cc:2217
constexpr page_type_t FIL_PAGE_TYPE_ALLOCATED
Freshly allocated page.
Definition: fil0fil.h:1207
constexpr page_type_t FIL_PAGE_TYPE_LEGACY_DBLWR
Legacy doublewrite buffer page.
Definition: fil0fil.h:1256
constexpr page_type_t FIL_PAGE_IBUF_FREE_LIST
Insert buffer free list.
Definition: fil0fil.h:1203
void fil_set_max_space_id_if_bigger(space_id_t max_id)
Sets the max tablespace id counter if the given number is bigger than the previous value.
Definition: fil0fil.cc:3941
volatile bool recv_recovery_on
true when applying redo log records during crash recovery; false otherwise.
Definition: log0recv.cc:100
constexpr page_type_t FIL_PAGE_SDI_ZBLOB
Compressed SDI BLOB page.
Definition: fil0fil.h:1253
constexpr page_type_t FIL_PAGE_TYPE_TRX_SYS
Transaction system data.
Definition: fil0fil.h:1216
void fil_add_moved_space(dd::Object_id dd_object_id, space_id_t space_id, const char *space_name, const std::string &old_path, const std::string &new_path)
Add tablespace to the set of tablespaces to be updated in DD.
Definition: fil0fil.cc:9972
Fil_state fil_tablespace_path_equals(space_id_t space_id, const char *space_name, ulint fsp_flags, std::string old_path, std::string *new_path)
Lookup the tablespace ID and return the path to the file.
Definition: fil0fil.cc:9857
page_type_t fil_page_get_type(const byte *page)
Get the file page type.
Definition: fil0fil.h:1795
constexpr page_type_t FIL_PAGE_ENCRYPTED
Encrypted page.
Definition: fil0fil.h:1241
dberr_t fil_set_autoextend_size(space_id_t space_id, uint64_t autoextend_size)
Set the autoextend_size attribute for the tablespace.
Definition: fil0fil.cc:8897
page_no_t fil_space_get_size(space_id_t space_id)
Returns the size of the space in pages.
Definition: fil0fil.cc:3473
dberr_t fil_ibt_create(space_id_t space_id, const char *name, const char *path, uint32_t flags, page_no_t size)
Create a session temporary tablespace (IBT) file.
Definition: fil0fil.cc:5753
Compression::Type fil_get_compression(space_id_t space_id)
Get the compression algorithm for a tablespace.
Definition: fil0fil.cc:8887
space_id_t fil_space_get_id_by_name(const char *name)
Returns the space ID based on the tablespace name.
Definition: fil0fil.cc:6440
bool fil_assign_new_space_id(space_id_t *space_id)
Assigns a new space id for a new single-table tablespace.
Definition: fil0fil.cc:3390
constexpr space_id_t SPACE_UNKNOWN
Unknown space id.
Definition: fil0fil.h:1125
void fil_aio_wait(ulint segment)
Waits for an AIO operation to complete.
Definition: fil0fil.cc:7902
Fil_path MySQL_datadir_path
The MySQL server –datadir value.
Definition: fil0fil.cc:276
bool fil_op_replay_rename_for_ddl(const page_id_t &page_id, const char *old_name, const char *new_name)
Replay a file rename operation for ddl replay.
Definition: fil0fil.cc:9748
constexpr page_type_t FIL_PAGE_TYPE_SYS
System page.
Definition: fil0fil.h:1213
bool fil_space_is_redo_skipped(space_id_t space_id)
Check whether a single-table tablespace is redo skipped.
Definition: fil0fil.cc:4755
dberr_t fil_io(const IORequest &type, bool sync, const page_id_t &page_id, const page_size_t &page_size, ulint byte_offset, ulint len, void *buf, void *message)
Read or write data from a file.
Definition: fil0fil.cc:7959
void fil_page_reset_type(const page_id_t &page_id, byte *page, ulint type, mtr_t *mtr)
Reset the page type.
Definition: fil0fil.cc:8221
constexpr page_type_t FIL_PAGE_SDI_BLOB
Uncompressed SDI BLOB page.
Definition: fil0fil.h:1250
dberr_t fil_rename_precheck(const dict_table_t *old_table, const dict_table_t *new_table, const char *tmp_name)
Check if swapping two .ibd files can be done without failure.
Definition: fil0fil.cc:8735
constexpr page_type_t FIL_PAGE_TYPE_BLOB
Uncompressed BLOB page.
Definition: fil0fil.h:1225
bool fil_addr_is_null(const fil_addr_t &addr)
Returns true if file address is undefined.
Definition: fil0fil.cc:8188
constexpr page_type_t FIL_PAGE_TYPE_ZLOB_INDEX
Index pages of compressed LOB.
Definition: fil0fil.h:1278
void fil_page_set_type(byte *page, ulint type)
Sets the file page type.
Definition: fil0fil.cc:8209
dberr_t fil_discard_tablespace(space_id_t space_id)
Discards a single-table tablespace.
Definition: fil0fil.cc:4788
size_t fil_count_undo_deleted(space_id_t undo_num)
Count how many truncated undo space IDs are still tracked in the buffer pool and the file_system cach...
Definition: fil0fil.cc:11598
ib_file_suffix
Common InnoDB file extensions.
Definition: fil0fil.h:555
@ DWR
Definition: fil0fil.h:562
@ BWR
Definition: fil0fil.h:563
@ IBT
Definition: fil0fil.h:560
@ IBD
Definition: fil0fil.h:557
@ CFP
Definition: fil0fil.h:559
@ CFG
Definition: fil0fil.h:558
@ NO_EXT
Definition: fil0fil.h:556
@ IBU
Definition: fil0fil.h:561
const char * dot_ext[]
Common InnoDB file extensions.
Definition: fil0fil.cc:285
dberr_t fil_ibd_create(space_id_t space_id, const char *name, const char *path, uint32_t flags, page_no_t size)
Create an IBD tablespace file.
Definition: fil0fil.cc:5745
constexpr page_type_t FIL_PAGE_TYPE_RSEG_ARRAY
Rollback Segment Array page.
Definition: fil0fil.h:1259
void fil_adjust_name_import(dict_table_t *table, const char *path, ib_file_suffix extn)
Adjust file name for import for partition files in different letter case.
Definition: fil0fil.cc:8440
dberr_t fil_open_for_business(bool read_only_mode)
Free the Tablespace_files instance.
Definition: fil0fil.cc:9737
dberr_t fil_write_initial_pages(pfs_os_file_t file, const char *path, fil_type_t type, page_no_t size, const byte *encrypt_info, space_id_t space_id, uint32_t &space_flags, bool &atomic_write, bool &punch_hole)
Write initial pages for a new tablespace file created.
Definition: fil0fil.cc:5459
bool fil_space_open(space_id_t space_id)
Open each file of a tablespace if not already open.
Definition: fil0fil.cc:3561
dberr_t fil_delete_tablespace(space_id_t space_id, buf_remove_t buf_remove)
Deletes an IBD or IBU tablespace.
Definition: fil0fil.cc:4632
void fil_flush(space_id_t space_id)
Flushes to disk possible writes cached by the OS.
Definition: fil0fil.cc:8141
constexpr page_type_t FIL_PAGE_TYPE_FSP_HDR
File space header.
Definition: fil0fil.h:1219
std::string fil_get_dirs()
Get the list of directories that datafiles can reside in.
Definition: fil0fil.cc:11435
void fil_set_scan_dir(const std::string &directory, bool is_undo_dir=false)
Normalize and save a directory to scan for datafiles.
Definition: fil0fil.cc:11413
constexpr page_type_t FIL_PAGE_IBUF_BITMAP
Insert buffer bitmap.
Definition: fil0fil.h:1210
The low-level file system page header & trailer offsets.
constexpr uint32_t FIL_PAGE_TYPE
file page type: FIL_PAGE_INDEX,..., 2 bytes.
Definition: fil0types.h:76
static bool equal(const Item *i1, const Item *i2, const Field *f2)
Definition: sql_select.cc:3805
constexpr uint32_t FSP_FLAGS_GET_ENCRYPTION(uint32_t flags)
Return the contents of the ENCRYPTION field.
Definition: fsp0types.h:351
static int flags[50]
Definition: hp_test1.cc:40
Insert buffer global types.
unsigned char byte
Blob class.
Definition: common.h:151
Recovery.
uint64_t lsn_t
Type used for all log sequence number storage and arithmetic.
Definition: log0types.h:63
A better implementation of the UNIX ctype(3) library.
MYSQL_PLUGIN_IMPORT CHARSET_INFO my_charset_filename
Definition: ctype-utf8.cc:7041
#define my_tolower(s, c)
Definition: m_ctype.h:688
static uint16_t mach_read_from_2(const byte *b)
The following function is used to fetch data from 2 consecutive bytes.
static const char * filepath
Definition: myisamlog.cc:94
static size_t file_size
Definition: mysql_config_editor.cc:71
static char * path
Definition: mysqldump.cc:137
Definition: buf0block_hint.cc:30
unsigned long long Object_id
Definition: object_id.h:31
Innodb data dictionary name.
Definition: dict0dd.cc:7158
Definition: os0file.h:86
Json_data_extension ext
Definition: backend.cc:51
HARNESS_EXPORT void trim(std::string &str)
Removes both leading and trailing whitespaces from the string.
Definition: string_utils.cc:70
static mysql_service_status_t validate(reference_caching_channel channel) noexcept
Definition: component.cc:67
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
os_file_type_t
Definition: os0file.h:661
uint64_t os_offset_t
File offset in bytes.
Definition: os0file.h:84
A class describing a page size.
const char * filename
Definition: pfs_example_component_population.cc:67
required string key
Definition: replication_asynchronous_connection_failover.proto:60
required string type
Definition: replication_group_member_actions.proto:34
case opt name
Definition: sslopt-case.h:33
Type
Algorithm types supported.
Definition: file.h:53
@ NONE
No compression.
Definition: file.h:59
Encryption metadata.
Definition: os0enc.h:445
Encryption::Type m_type
Encrypt type.
Definition: os0enc.h:447
Callback functor.
Definition: fil0fil.h:1821
virtual ulint get_space_flags() const 1=0
virtual dberr_t init(os_offset_t file_size, const buf_block_t *block) 1=0
Called for page 0 in the tablespace file at the start.
pfs_os_file_t m_file
File handle to the tablespace.
Definition: fil0fil.h:1874
virtual dberr_t operator()(os_offset_t offset, buf_block_t *block) 1=0
Called for every page in the tablespace.
page_size_t m_page_size
The tablespace page size.
Definition: fil0fil.h:1871
PageCallback()
Default constructor.
Definition: fil0fil.h:1823
void set_file(const char *filename, pfs_os_file_t file) 1
Set the name of the physical file and the file handle that is used to open it for the file that is be...
Definition: fil0fil.h:1848
void set_page_size(const buf_frame_t *page) 1
Set the tablespace table size.
Definition: fil0fil.cc:8701
PageCallback(PageCallback &&)=delete
const char * m_filepath
Physical file path.
Definition: fil0fil.h:1877
const page_size_t & get_page_size() const
The compressed page size.
Definition: fil0fil.h:1866
PageCallback(const PageCallback &)=delete
virtual space_id_t get_space_id() const 1=0
PageCallback & operator=(const PageCallback &)=delete
The buffer control block structure.
Definition: buf0buf.h:1690
Data structure for a database table.
Definition: dict0mem.h:1909
File space address.
Definition: fil0fil.h:1136
fil_addr_t()
Definition: fil0fil.h:1138
std::ostream & print(std::ostream &out) const
Print a string representation.
Definition: fil0fil.h:1158
uint32_t boffset
Byte offset within the page.
Definition: fil0fil.h:1168
fil_addr_t(page_no_t p, uint32_t boff)
Constructor.
Definition: fil0fil.h:1143
page_no_t page
Page number within a space.
Definition: fil0fil.h:1165
bool is_equal(const fil_addr_t &rhs) const
Compare to instances.
Definition: fil0fil.h:1148
bool is_null() const
Check if the file address is null.
Definition: fil0fil.h:1154
File node of a tablespace or the log data space.
Definition: fil0fil.h:151
page_no_t max_size
maximum size of the file in database pages
Definition: fil0fil.h:198
void set_flushed()
Sets file to flushed state.
Definition: fil0fil.h:160
size_t n_pending_ios
count of pending I/O's; is_open must be true if nonzero
Definition: fil0fil.h:201
fil_space_t * space
tablespace containing this file
Definition: fil0fil.h:165
size_t block_size
block size to use for punching holes
Definition: fil0fil.h:222
bool is_open
whether this file is open.
Definition: fil0fil.h:173
bool atomic_write
whether atomic write is enabled for this file
Definition: fil0fil.h:225
pfs_os_file_t handle
file handle (valid if is_open)
Definition: fil0fil.h:176
page_no_t init_size
initial size of the file in database pages; FIL_IBD_FILE_INITIAL_SIZE by default
Definition: fil0fil.h:195
page_no_t size
size of the file in database pages (0 if not known yet); the possible last incomplete megabyte may be...
Definition: fil0fil.h:187
size_t magic_n
FIL_NODE_MAGIC_N.
Definition: fil0fil.h:228
size_t n_pending_flushes
count of pending flushes; is_open must be true if nonzero
Definition: fil0fil.h:204
bool is_flushed() const
Returns true if the file is flushed.
Definition: fil0fil.h:155
os_event_t sync_event
event that groups and serializes calls to fsync
Definition: fil0fil.h:179
int64_t flush_counter
the modification_counter of the latest flush to disk
Definition: fil0fil.h:213
page_no_t flush_size
Size of the file when last flushed, used to force the flush when file grows to keep the filesystem me...
Definition: fil0fil.h:191
bool can_be_closed() const
Returns true if the file can be closed.
Definition: fil0fil.cc:1822
UT_LIST_NODE_T(fil_node_t) List_node
Definition: fil0fil.h:162
bool punch_hole
whether the file system of this file supports PUNCH HOLE
Definition: fil0fil.h:219
int64_t modification_counter
number of writes to the file since the system was started
Definition: fil0fil.h:210
List_node LRU
link to the fil_system->LRU list (keeping track of open files)
Definition: fil0fil.h:216
char * name
file name; protected by Fil_shard::m_mutex and log_sys->mutex.
Definition: fil0fil.h:168
bool is_being_extended
Set to true when a file is being extended.
Definition: fil0fil.h:207
bool is_raw_disk
whether the file actually is a raw device or disk partition
Definition: fil0fil.h:182
Tablespace or log data space.
Definition: fil0fil.h:232
void initialize() noexcept
Initializes fields.
Definition: fil0fil.h:332
std::ostream & print_xdes_pages(std::ostream &out) const
Print the extent descriptor pages of this tablespace into the given output stream.
Definition: fil0fil.cc:9474
fil_node_t * get_file_node(page_no_t *page_no) noexcept
Get the file node corresponding to the given page number of the tablespace.
Definition: fil0fil.cc:11680
ib::Timer m_last_extended
When the tablespace was extended last.
Definition: fil0fil.h:314
size_t get_reference_count() const
Definition: fil0fil.cc:11742
space_id_t id
Tablespace ID.
Definition: fil0fil.h:328
bool is_compressed() const noexcept
Check if the tablespace is compressed.
Definition: fil0fil.h:520
Encryption::Progress encryption_op_in_progress
Encryption is in progress.
Definition: fil0fil.h:507
std::atomic_bool m_deleted
true if the tablespace is marked for deletion.
Definition: fil0fil.h:420
void bump_version()
Bumps the space object version and cause all pages in buffer pool that reference the current space ob...
Definition: fil0fil.cc:11764
List_node unflushed_spaces
List of spaces with at least one unflushed file we have written to.
Definition: fil0fil.h:495
page_no_t size
Tablespace file size in pages; 0 if not known yet.
Definition: fil0fil.h:455
rw_lock_t latch
Latch protecting the file space storage allocation.
Definition: fil0fil.h:490
ib::Throttler m_prevent_file_open_wait_message_throttler
Throttles writing to log a message about long waiting for file to perform rename.
Definition: fil0fil.h:430
uint32_t flags
Tablespace flags; see fsp_flags_is_valid() and page_size_t(ulint) (constructor).
Definition: fil0fil.h:472
void release_free_extents(ulint n_reserved)
Release the reserved free extents.
Definition: fil0fil.cc:9447
page_no_t size_in_header
FSP_SIZE in the tablespace header; 0 if not known yet.
Definition: fil0fil.h:458
std::atomic< uint32_t > m_version
All pages in the buffer pool that reference this fil_space_t instance with version before this versio...
Definition: fil0fil.h:376
Encryption_metadata m_encryption_metadata
Encryption metadata.
Definition: fil0fil.h:504
bool prevent_file_open
true if we want to rename the .ibd file of tablespace and want to temporarily prevent other threads f...
Definition: fil0fil.h:426
page_no_t m_undo_extend
Extend undo tablespaces by so many pages.
Definition: fil0fil.h:317
uint64_t autoextend_size_in_bytes
Autoextend size.
Definition: fil0fil.h:461
uint32_t free_len
Length of the FSP_FREE list.
Definition: fil0fil.h:464
lsn_t m_header_page_flush_lsn
Flush lsn of header page.
Definition: fil0fil.h:510
void dec_ref() noexcept
Decrement the page reference count.
Definition: fil0fil.h:290
std::atomic_size_t m_n_ref_count
Number of buf_page_t entries that point to this instance.
Definition: fil0fil.h:416
Files files
Files attached to this tablespace.
Definition: fil0fil.h:452
bool stop_new_ops
We set this true when we start deleting a single-table tablespace.
Definition: fil0fil.h:439
ulint magic_n
FIL_SPACE_MAGIC_N.
Definition: fil0fil.h:513
uint32_t n_reserved_extents
Number of reserved free extents for ongoing operations like B-tree page split.
Definition: fil0fil.h:476
bool can_encrypt() const noexcept
Check if the encryption details, like the encryption key, type and other details, that are needed to ...
Definition: fil0fil.h:533
uint32_t get_current_version() const
Returns current version of the space object.
Definition: fil0fil.cc:11722
bool is_encrypted() const noexcept
Check if the tablespace is encrypted.
Definition: fil0fil.h:526
static fil_space_t * s_sys_space
System tablespace.
Definition: fil0fil.h:516
uint32_t n_pending_ops
This is positive when we have pending operations against this tablespace.
Definition: fil0fil.h:486
page_no_t free_limit
Contents of FSP_FREE_LIMIT.
Definition: fil0fil.h:467
UT_LIST_NODE_T(fil_space_t) List_node
Definition: fil0fil.h:233
uint32_t get_recent_version() const
Returns current version of the space object.
Definition: fil0fil.cc:11726
char * name
Tablespace name.
Definition: fil0fil.h:325
std::vector< Observer *, ut::allocator< Observer * > > Flush_observers
Definition: fil0fil.h:311
Compression::Type compression_type
Compression algorithm.
Definition: fil0fil.h:501
uint32_t n_pending_flushes
This is positive when flushing the tablespace to disk; dropping of the tablespace is forbidden if thi...
Definition: fil0fil.h:480
fil_type_t purpose
Purpose.
Definition: fil0fil.h:448
void set_deleted()
Marks the space object for deletion.
Definition: fil0fil.cc:11750
bool was_not_deleted() const
Definition: fil0fil.cc:11714
bool is_in_unflushed_spaces
true if this space is currently in unflushed_spaces
Definition: fil0fil.h:498
bool has_no_references() const
Definition: fil0fil.cc:11732
page_no_t m_undo_initial
When an undo tablespace has been initialized with required header pages, that size is recorded here.
Definition: fil0fil.h:322
std::vector< fil_node_t, ut::allocator< fil_node_t > > Files
Definition: fil0fil.h:234
void inc_ref() noexcept
Increment the page reference count.
Definition: fil0fil.h:279
ulint redo_skipped_count
Reference count for operations who want to skip redo log in the file space in order to make fsp_space...
Definition: fil0fil.h:444
bool is_deleted() const
Definition: fil0fil.cc:11709
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:177
InnoDB condition variable.
Definition: os0event.cc:63
Common file descriptor for file IO instrumentation with PFS on windows and other platforms.
Definition: os0file.h:173
The structure used in the spin lock implementation of a read-write lock.
Definition: sync0rw.h:360
Definition: trx0trx.h:684
Version control for database, common definitions, and include files.
#define OS_PATH_SEPARATOR
Definition: univ.i:538
#define UNIV_NOTHROW
Definition: univ.i:456
#define OS_PATH_SEPARATOR_ALT
Definition: univ.i:539
unsigned long int ulint
Definition: univ.i:406
#define ut_ad(EXPR)
Debug assertion.
Definition: ut0dbg.h:69
#define ut_a(EXPR)
Abort execution if EXPR does not evaluate to nonzero.
Definition: ut0dbg.h:57
#define UT_LIST_NODE_T(t)
Macro used for legacy reasons.
Definition: ut0lst.h:64
Dynamic memory allocation routines and custom allocators specifically crafted to support memory instr...
static uint64_t lsn
Definition: xcom_base.cc:446