buf0buf.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:30k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*   Innobase relational database engine; Copyright (C) 2001 Innobase Oy
  2.      
  3.      This program is free software; you can redistribute it and/or modify
  4.      it under the terms of the GNU General Public License 2
  5.      as published by the Free Software Foundation in June 1991.
  6.      
  7.      This program is distributed in the hope that it will be useful,
  8.      but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.      GNU General Public License for more details.
  11.      
  12.      You should have received a copy of the GNU General Public License 2
  13.      along with this program (in file COPYING); if not, write to the Free
  14.      Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  15. /******************************************************
  16. The database buffer pool high-level routines
  17. (c) 1995 Innobase Oy
  18. Created 11/5/1995 Heikki Tuuri
  19. *******************************************************/
  20. #ifndef buf0buf_h
  21. #define buf0buf_h
  22. #include "univ.i"
  23. #include "fil0fil.h"
  24. #include "mtr0types.h"
  25. #include "buf0types.h"
  26. #include "sync0rw.h"
  27. #include "hash0hash.h"
  28. #include "ut0byte.h"
  29. /* Flags for flush types */
  30. #define BUF_FLUSH_LRU 1
  31. #define BUF_FLUSH_SINGLE_PAGE 2
  32. #define BUF_FLUSH_LIST 3 /* An array in the pool struct
  33. has size BUF_FLUSH_LIST + 1: if you
  34. add more flush types, put them in
  35. the middle! */
  36. /* Modes for buf_page_get_gen */
  37. #define BUF_GET 10 /* get always */
  38. #define BUF_GET_IF_IN_POOL 11 /* get if in pool */
  39. #define BUF_GET_NOWAIT 12 /* get if can set the latch without
  40. waiting */
  41. #define BUF_GET_NO_LATCH 14 /* get and bufferfix, but set no latch;
  42. we have separated this case, because
  43. it is error-prone programming not to
  44. set a latch, and it should be used
  45. with care */
  46. /* Modes for buf_page_get_known_nowait */
  47. #define BUF_MAKE_YOUNG 51
  48. #define BUF_KEEP_OLD 52
  49. extern buf_pool_t*  buf_pool;  /* The buffer pool of the database */
  50. extern ibool buf_debug_prints;/* If this is set TRUE, the program
  51. prints info whenever read or flush
  52. occurs */
  53. /************************************************************************
  54. Initializes the buffer pool of the database. */
  55. void
  56. buf_pool_init(
  57. /*==========*/
  58. ulint max_size, /* in: maximum size of the pool in blocks */
  59. ulint curr_size); /* in: current size to use, must be <=
  60. max_size */
  61. /*************************************************************************
  62. Gets the current size of buffer pool in bytes. */
  63. UNIV_INLINE
  64. ulint
  65. buf_pool_get_curr_size(void);
  66. /*========================*/
  67. /* out: size in bytes */
  68. /*************************************************************************
  69. Gets the maximum size of buffer pool in bytes. */
  70. UNIV_INLINE
  71. ulint
  72. buf_pool_get_max_size(void);
  73. /*=======================*/
  74. /* out: size in bytes */
  75. /************************************************************************
  76. Gets the smallest oldest_modification lsn for any page in the pool. Returns
  77. ut_dulint_zero if all modified pages have been flushed to disk. */
  78. UNIV_INLINE
  79. dulint
  80. buf_pool_get_oldest_modification(void);
  81. /*==================================*/
  82. /* out: oldest modification in pool,
  83. ut_dulint_zero if none */
  84. /*************************************************************************
  85. Allocates a buffer frame. */
  86. buf_frame_t*
  87. buf_frame_alloc(void);
  88. /*==================*/
  89. /* out: buffer frame */
  90. /*************************************************************************
  91. Frees a buffer frame which does not contain a file page. */
  92. void
  93. buf_frame_free(
  94. /*===========*/
  95. buf_frame_t* frame); /* in: buffer frame */
  96. /*************************************************************************
  97. Copies contents of a buffer frame to a given buffer. */
  98. UNIV_INLINE
  99. byte*
  100. buf_frame_copy(
  101. /*===========*/
  102. /* out: buf */
  103. byte* buf, /* in: buffer to copy to */
  104. buf_frame_t* frame); /* in: buffer frame */
  105. /******************************************************************
  106. NOTE! The following macros should be used instead of buf_page_get_gen,
  107. to improve debugging. Only values RW_S_LATCH and RW_X_LATCH are allowed
  108. in LA! */
  109. #ifdef UNIV_SYNC_DEBUG
  110. #define buf_page_get(SP, OF, LA, MTR)    buf_page_get_gen(
  111. SP, OF, LA, NULL,
  112. BUF_GET, IB__FILE__, __LINE__, MTR)
  113. #else
  114. #define buf_page_get(SP, OF, LA, MTR)    buf_page_get_gen(
  115. SP, OF, LA, NULL,
  116. BUF_GET, MTR)
  117. #endif
  118. /******************************************************************
  119. Use these macros to bufferfix a page with no latching. Remember not to
  120. read the contents of the page unless you know it is safe. Do not modify
  121. the contents of the page! We have separated this case, because it is
  122. error-prone programming not to set a latch, and it should be used
  123. with care. */
  124. #ifdef UNIV_SYNC_DEBUG
  125. #define buf_page_get_with_no_latch(SP, OF, MTR)    buf_page_get_gen(
  126. SP, OF, RW_NO_LATCH, NULL,
  127. BUF_GET_NO_LATCH, IB__FILE__, __LINE__, MTR)
  128. #else
  129. #define buf_page_get_with_no_latch(SP, OF, MTR)    buf_page_get_gen(
  130. SP, OF, RW_NO_LATCH, NULL,
  131. BUF_GET_NO_LATCH, MTR)
  132. #endif
  133. /******************************************************************
  134. NOTE! The following macros should be used instead of buf_page_get_gen, to
  135. improve debugging. Only values RW_S_LATCH and RW_X_LATCH are allowed as LA! */
  136. #ifdef UNIV_SYNC_DEBUG
  137. #define buf_page_get_nowait(SP, OF, LA, MTR)    buf_page_get_gen(
  138. SP, OF, LA, NULL,
  139. BUF_GET_NOWAIT, IB__FILE__, __LINE__, MTR)
  140. #else
  141. #define buf_page_get_nowait(SP, OF, LA, MTR)    buf_page_get_gen(
  142. SP, OF, LA, NULL,
  143. BUF_GET_NOWAIT, MTR)
  144. #endif
  145. /******************************************************************
  146. NOTE! The following macros should be used instead of
  147. buf_page_optimistic_get_func, to improve debugging. Only values RW_S_LATCH and
  148. RW_X_LATCH are allowed as LA! */
  149. #ifdef UNIV_SYNC_DEBUG
  150. #define buf_page_optimistic_get(LA, G, MC, MTR) buf_page_optimistic_get_func(
  151. LA, G, MC, IB__FILE__, __LINE__, MTR)
  152. #else
  153. #define buf_page_optimistic_get(LA, G, MC, MTR) buf_page_optimistic_get_func(
  154. LA, G, MC, MTR)
  155. #endif
  156. /************************************************************************
  157. This is the general function used to get optimistic access to a database
  158. page. */
  159. ibool
  160. buf_page_optimistic_get_func(
  161. /*=========================*/
  162. /* out: TRUE if success */
  163. ulint rw_latch,/* in: RW_S_LATCH, RW_X_LATCH */
  164. buf_frame_t* guess, /* in: guessed frame */
  165. dulint modify_clock,/* in: modify clock value if mode is
  166. ..._GUESS_ON_CLOCK */
  167. #ifdef UNIV_SYNC_DEBUG
  168. char* file, /* in: file name */
  169. ulint line, /* in: line where called */
  170. #endif
  171. mtr_t* mtr); /* in: mini-transaction */
  172. /************************************************************************
  173. Tries to get the page, but if file io is required, releases all latches
  174. in mtr down to the given savepoint. If io is required, this function
  175. retrieves the page to buffer buf_pool, but does not bufferfix it or latch
  176. it. */
  177. UNIV_INLINE
  178. buf_frame_t*
  179. buf_page_get_release_on_io(
  180. /*=======================*/
  181. /* out: pointer to the frame, or NULL
  182. if not in buffer buf_pool */
  183. ulint space, /* in: space id */
  184. ulint offset, /* in: offset of the page within space
  185. in units of a page */
  186. buf_frame_t* guess, /* in: guessed frame or NULL */
  187. ulint rw_latch, /* in: RW_X_LATCH, RW_S_LATCH,
  188. or RW_NO_LATCH */
  189. ulint savepoint, /* in: mtr savepoint */
  190. mtr_t* mtr); /* in: mtr */
  191. /************************************************************************
  192. This is used to get access to a known database page, when no waiting can be
  193. done. */
  194. ibool
  195. buf_page_get_known_nowait(
  196. /*======================*/
  197. /* out: TRUE if success */
  198. ulint rw_latch,/* in: RW_S_LATCH, RW_X_LATCH */
  199. buf_frame_t* guess, /* in: the known page frame */
  200. ulint mode, /* in: BUF_MAKE_YOUNG or BUF_KEEP_OLD */
  201. #ifdef UNIV_SYNC_DEBUG
  202. char* file, /* in: file name */
  203. ulint line, /* in: line where called */
  204. #endif
  205. mtr_t* mtr); /* in: mini-transaction */
  206. /************************************************************************
  207. This is the general function used to get access to a database page. */
  208. buf_frame_t*
  209. buf_page_get_gen(
  210. /*=============*/
  211. /* out: pointer to the frame or NULL */
  212. ulint space, /* in: space id */
  213. ulint offset, /* in: page number */
  214. ulint rw_latch,/* in: RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */
  215. buf_frame_t* guess, /* in: guessed frame or NULL */
  216. ulint mode, /* in: BUF_GET, BUF_GET_IF_IN_POOL,
  217. BUF_GET_NO_LATCH */
  218. #ifdef UNIV_SYNC_DEBUG
  219. char* file, /* in: file name */
  220. ulint line, /* in: line where called */
  221. #endif
  222. mtr_t* mtr); /* in: mini-transaction */
  223. /************************************************************************
  224. Initializes a page to the buffer buf_pool. The page is usually not read
  225. from a file even if it cannot be found in the buffer buf_pool. This is one
  226. of the functions which perform to a block a state transition NOT_USED =>
  227. FILE_PAGE (the other is buf_page_init_for_read above). */
  228. buf_frame_t*
  229. buf_page_create(
  230. /*============*/
  231. /* out: pointer to the frame, page bufferfixed */
  232. ulint space, /* in: space id */
  233. ulint offset, /* in: offset of the page within space in units of
  234. a page */
  235. mtr_t* mtr); /* in: mini-transaction handle */
  236. /************************************************************************
  237. Decrements the bufferfix count of a buffer control block and releases
  238. a latch, if specified. */
  239. UNIV_INLINE
  240. void
  241. buf_page_release(
  242. /*=============*/
  243. buf_block_t* block, /* in: buffer block */
  244. ulint rw_latch, /* in: RW_S_LATCH, RW_X_LATCH,
  245. RW_NO_LATCH */
  246. mtr_t* mtr); /* in: mtr */
  247. /************************************************************************
  248. Moves a page to the start of the buffer pool LRU list. This high-level
  249. function can be used to prevent an important page from from slipping out of
  250. the buffer pool. */
  251. void
  252. buf_page_make_young(
  253. /*=================*/
  254. buf_frame_t* frame); /* in: buffer frame of a file page */
  255. /************************************************************************
  256. Returns TRUE if the page can be found in the buffer pool hash table. NOTE
  257. that it is possible that the page is not yet read from disk, though. */
  258. ibool
  259. buf_page_peek(
  260. /*==========*/
  261. /* out: TRUE if found from page hash table,
  262. NOTE that the page is not necessarily yet read
  263. from disk! */
  264. ulint space, /* in: space id */
  265. ulint offset);/* in: page number */
  266. /************************************************************************
  267. Returns the buffer control block if the page can be found in the buffer
  268. pool. NOTE that it is possible that the page is not yet read
  269. from disk, though. This is a very low-level function: use with care! */
  270. buf_block_t*
  271. buf_page_peek_block(
  272. /*================*/
  273. /* out: control block if found from page hash table,
  274. otherwise NULL; NOTE that the page is not necessarily
  275. yet read from disk! */
  276. ulint space, /* in: space id */
  277. ulint offset);/* in: page number */
  278. /************************************************************************
  279. Recommends a move of a block to the start of the LRU list if there is danger
  280. of dropping from the buffer pool. NOTE: does not reserve the buffer pool
  281. mutex. */
  282. UNIV_INLINE
  283. ibool
  284. buf_block_peek_if_too_old(
  285. /*======================*/
  286. /* out: TRUE if should be made younger */
  287. buf_block_t* block); /* in: block to make younger */
  288. /************************************************************************
  289. Returns the current state of is_hashed of a page. FALSE if the page is
  290. not in the pool. NOTE that this operation does not fix the page in the
  291. pool if it is found there. */
  292. ibool
  293. buf_page_peek_if_search_hashed(
  294. /*===========================*/
  295. /* out: TRUE if page hash index is built in search
  296. system */
  297. ulint space, /* in: space id */
  298. ulint offset);/* in: page number */
  299. /************************************************************************
  300. Gets the youngest modification log sequence number for a frame.
  301. Returns zero if not file page or no modification occurred yet. */
  302. UNIV_INLINE
  303. dulint
  304. buf_frame_get_newest_modification(
  305. /*==============================*/
  306. /* out: newest modification to page */
  307. buf_frame_t* frame); /* in: pointer to a frame */
  308. /************************************************************************
  309. Increments the modify clock of a frame by 1. The caller must (1) own the
  310. pool mutex and block bufferfix count has to be zero, (2) or own an x-lock
  311. on the block. */
  312. UNIV_INLINE
  313. dulint
  314. buf_frame_modify_clock_inc(
  315. /*=======================*/
  316. /* out: new value */
  317. buf_frame_t* frame); /* in: pointer to a frame */
  318. /************************************************************************
  319. Returns the value of the modify clock. The caller must have an s-lock 
  320. or x-lock on the block. */
  321. UNIV_INLINE
  322. dulint
  323. buf_frame_get_modify_clock(
  324. /*=======================*/
  325. /* out: value */
  326. buf_frame_t* frame); /* in: pointer to a frame */
  327. /**************************************************************************
  328. Gets the page number of a pointer pointing within a buffer frame containing
  329. a file page. */
  330. UNIV_INLINE
  331. ulint
  332. buf_frame_get_page_no(
  333. /*==================*/
  334. /* out: page number */
  335. byte* ptr); /* in: pointer to within a buffer frame */
  336. /**************************************************************************
  337. Gets the space id of a pointer pointing within a buffer frame containing a
  338. file page. */
  339. UNIV_INLINE
  340. ulint
  341. buf_frame_get_space_id(
  342. /*===================*/
  343. /* out: space id */
  344. byte* ptr); /* in: pointer to within a buffer frame */
  345. /**************************************************************************
  346. Gets the space id, page offset, and byte offset within page of a
  347. pointer pointing to a buffer frame containing a file page. */
  348. UNIV_INLINE
  349. void
  350. buf_ptr_get_fsp_addr(
  351. /*=================*/
  352. byte* ptr, /* in: pointer to a buffer frame */
  353. ulint* space, /* out: space id */
  354. fil_addr_t* addr); /* out: page offset and byte offset */
  355. /**************************************************************************
  356. Gets the hash value of the page the pointer is pointing to. This can be used
  357. in searches in the lock hash table. */
  358. UNIV_INLINE
  359. ulint
  360. buf_frame_get_lock_hash_val(
  361. /*========================*/
  362. /* out: lock hash value */
  363. byte* ptr); /* in: pointer to within a buffer frame */
  364. /**************************************************************************
  365. Gets the mutex number protecting the page record lock hash chain in the lock
  366. table. */
  367. UNIV_INLINE
  368. mutex_t*
  369. buf_frame_get_lock_mutex(
  370. /*=====================*/
  371. /* out: mutex */
  372. byte* ptr); /* in: pointer to within a buffer frame */
  373. /***********************************************************************
  374. Gets the frame the pointer is pointing to. */
  375. UNIV_INLINE
  376. buf_frame_t*
  377. buf_frame_align(
  378. /*============*/
  379. /* out: pointer to block */
  380. byte* ptr); /* in: pointer to a frame */
  381. /***********************************************************************
  382. Checks if a pointer points to the block array of the buffer pool (blocks, not
  383. the frames). */
  384. UNIV_INLINE
  385. ibool
  386. buf_pool_is_block(
  387. /*==============*/
  388. /* out: TRUE if pointer to block */
  389. void* ptr); /* in: pointer to memory */
  390. /*************************************************************************
  391. Validates the buffer pool data structure. */
  392. ibool
  393. buf_validate(void);
  394. /*==============*/
  395. /*************************************************************************
  396. Prints info of the buffer pool data structure. */
  397. void
  398. buf_print(void);
  399. /*===========*/
  400. /*************************************************************************
  401. Prints info of the buffer i/o. */
  402. void
  403. buf_print_io(void);
  404. /*==============*/
  405. /*************************************************************************
  406. Checks that all file pages in the buffer are in a replaceable state. */
  407. ibool
  408. buf_all_freed(void);
  409. /*===============*/
  410. /*************************************************************************
  411. Checks that there currently are no pending i/o-operations for the buffer
  412. pool. */
  413. ibool
  414. buf_pool_check_no_pending_io(void);
  415. /*==============================*/
  416. /* out: TRUE if there is no pending i/o */
  417. /*************************************************************************
  418. Invalidates the file pages in the buffer pool when an archive recovery is
  419. completed. All the file pages buffered must be in a replaceable state when
  420. this function is called: not latched and not modified. */
  421. void
  422. buf_pool_invalidate(void);
  423. /*=====================*/
  424. /*========================================================================
  425. --------------------------- LOWER LEVEL ROUTINES -------------------------
  426. =========================================================================*/
  427. /*************************************************************************
  428. Adds latch level info for the rw-lock protecting the buffer frame. This
  429. should be called in the debug version after a successful latching of a
  430. page if we know the latching order level of the acquired latch. If
  431. UNIV_SYNC_DEBUG is not defined, compiles to an empty function. */
  432. UNIV_INLINE
  433. void
  434. buf_page_dbg_add_level(
  435. /*===================*/
  436. buf_frame_t* frame, /* in: buffer page where we have acquired
  437. a latch */
  438. ulint level); /* in: latching order level */
  439. /*************************************************************************
  440. Gets a pointer to the memory frame of a block. */
  441. UNIV_INLINE
  442. buf_frame_t*
  443. buf_block_get_frame(
  444. /*================*/
  445. /* out: pointer to the frame */
  446. buf_block_t* block); /* in: pointer to the control block */
  447. /*************************************************************************
  448. Gets the space id of a block. */
  449. UNIV_INLINE
  450. ulint
  451. buf_block_get_space(
  452. /*================*/
  453. /* out: space id */
  454. buf_block_t* block); /* in: pointer to the control block */
  455. /*************************************************************************
  456. Gets the page number of a block. */
  457. UNIV_INLINE
  458. ulint
  459. buf_block_get_page_no(
  460. /*==================*/
  461. /* out: page number */
  462. buf_block_t* block); /* in: pointer to the control block */
  463. /***********************************************************************
  464. Gets the block to whose frame the pointer is pointing to. */
  465. UNIV_INLINE
  466. buf_block_t*
  467. buf_block_align(
  468. /*============*/
  469. /* out: pointer to block */
  470. byte* ptr); /* in: pointer to a frame */
  471. /************************************************************************
  472. This function is used to get info if there is an io operation
  473. going on on a buffer page. */
  474. UNIV_INLINE
  475. ibool
  476. buf_page_io_query(
  477. /*==============*/
  478. /* out: TRUE if io going on */
  479. buf_block_t* block); /* in: pool block, must be bufferfixed */
  480. /***********************************************************************
  481. Accessor function for block array. */
  482. UNIV_INLINE
  483. buf_block_t*
  484. buf_pool_get_nth_block(
  485. /*===================*/
  486. /* out: pointer to block */
  487. buf_pool_t* pool, /* in: pool */
  488. ulint i); /* in: index of the block */
  489. /************************************************************************
  490. Function which inits a page for read to the buffer buf_pool. If the page is
  491. already in buf_pool, does nothing. Sets the io_fix flag to BUF_IO_READ and
  492. sets a non-recursive exclusive lock on the buffer frame. The io-handler must
  493. take care that the flag is cleared and the lock released later. This is one
  494. of the functions which perform the state transition NOT_USED => FILE_PAGE to
  495. a block (the other is buf_page_create). */ 
  496. buf_block_t*
  497. buf_page_init_for_read(
  498. /*===================*/
  499. /* out: pointer to the block */
  500. ulint mode, /* in: BUF_READ_IBUF_PAGES_ONLY, ... */
  501. ulint space, /* in: space id */
  502. ulint offset);/* in: page number */
  503. /************************************************************************
  504. Completes an asynchronous read or write request of a file page to or from
  505. the buffer pool. */
  506. void
  507. buf_page_io_complete(
  508. /*=================*/
  509. buf_block_t* block); /* in: pointer to the block in question */
  510. /************************************************************************
  511. Calculates a folded value of a file page address to use in the page hash
  512. table. */
  513. UNIV_INLINE
  514. ulint
  515. buf_page_address_fold(
  516. /*==================*/
  517. /* out: the folded value */
  518. ulint space, /* in: space id */
  519. ulint offset);/* in: offset of the page within space */
  520. /**********************************************************************
  521. Returns the control block of a file page, NULL if not found. */
  522. UNIV_INLINE
  523. buf_block_t*
  524. buf_page_hash_get(
  525. /*==============*/
  526. /* out: block, NULL if not found */
  527. ulint space, /* in: space id */
  528. ulint offset);/* in: offset of the page within space */
  529. /***********************************************************************
  530. Increments the pool clock by one and returns its new value. Remember that
  531. in the 32 bit version the clock wraps around at 4 billion! */
  532. UNIV_INLINE
  533. ulint
  534. buf_pool_clock_tic(void);
  535. /*====================*/
  536. /* out: new clock value */
  537. /*************************************************************************
  538. Gets the current length of the free list of buffer blocks. */
  539. ulint
  540. buf_get_free_list_len(void);
  541. /*=======================*/
  542. /* The buffer control block structure */
  543. struct buf_block_struct{
  544. /* 1. General fields */
  545. ulint state; /* state of the control block:
  546. BUF_BLOCK_NOT_USED, ... */
  547. byte* frame; /* pointer to buffer frame which
  548. is of size UNIV_PAGE_SIZE, and
  549. aligned to an address divisible by
  550. UNIV_PAGE_SIZE */
  551. ulint space; /* space id of the page */
  552. ulint offset; /* page number within the space */
  553. ulint lock_hash_val; /* hashed value of the page address
  554. in the record lock hash table */
  555. mutex_t* lock_mutex; /* mutex protecting the chain in the
  556. record lock hash table */
  557. rw_lock_t lock; /* read-write lock of the buffer
  558. frame */
  559. rw_lock_t read_lock; /* rw-lock reserved when a page read
  560. to the frame is requested; a thread
  561. can wait for this rw-lock if it wants
  562. to wait for the read to complete;
  563. the usual way is to wait for lock,
  564. but if the thread just wants a
  565. bufferfix and no latch on the page,
  566. then it can wait for this rw-lock */
  567. buf_block_t* hash; /* node used in chaining to the page
  568. hash table */
  569. /* 2. Page flushing fields */
  570. UT_LIST_NODE_T(buf_block_t) flush_list;
  571. /* node of the modified, not yet
  572. flushed blocks list */
  573. dulint newest_modification;
  574. /* log sequence number of the youngest
  575. modification to this block, zero if
  576. not modified */
  577. dulint oldest_modification;
  578. /* log sequence number of the START of
  579. the log entry written of the oldest
  580. modification to this block which has
  581. not yet been flushed on disk; zero if
  582. all modifications are on disk */
  583. ulint flush_type; /* if this block is currently being
  584. flushed to disk, this tells the
  585. flush_type: BUF_FLUSH_LRU or
  586. BUF_FLUSH_LIST */
  587. /* 3. LRU replacement algorithm fields */
  588. UT_LIST_NODE_T(buf_block_t) free;
  589. /* node of the free block list */
  590. UT_LIST_NODE_T(buf_block_t) LRU;
  591. /* node of the LRU list */
  592. ulint LRU_position; /* value which monotonically
  593. decreases (or may stay constant if
  594. the block is in the old blocks) toward
  595. the end of the LRU list, if the pool
  596. ulint_clock has not wrapped around:
  597. NOTE that this value can only be used
  598. in heuristic algorithms, because of
  599. the possibility of a wrap-around! */
  600. ulint freed_page_clock;/* the value of freed_page_clock
  601. buffer pool when this block was
  602. last time put to the head of the
  603. LRU list */
  604. ibool old; /* TRUE if the block is in the old
  605. blocks in the LRU list */
  606. ibool accessed; /* TRUE if the page has been accessed
  607. while in the buffer pool: read-ahead
  608. may read in pages which have not been
  609. accessed yet */
  610. ulint buf_fix_count; /* count of how manyfold this block
  611. is currently bufferfixed */
  612. ulint io_fix; /* if a read is pending to the frame,
  613. io_fix is BUF_IO_READ, in the case
  614. of a write BUF_IO_WRITE, otherwise 0 */
  615. /* 4. Optimistic search field */
  616. dulint modify_clock; /* this clock is incremented every
  617. time a pointer to a record on the
  618. page may become obsolete; this is
  619. used in the optimistic cursor
  620. positioning: if the modify clock has
  621. not changed, we know that the pointer
  622. is still valid; this field may be
  623. changed if the thread (1) owns the
  624. pool mutex and the page is not
  625. bufferfixed, or (2) the thread has an
  626. x-latch on the block */
  627. /* 5. Hash search fields: NOTE that these fields are protected by
  628. btr_search_mutex */
  629. ulint n_hash_helps; /* counter which controls building
  630. of a new hash index for the page */
  631. ulint n_fields; /* recommended prefix length for hash
  632. search: number of full fields */
  633. ulint n_bytes; /* recommended prefix: number of bytes
  634. in an incomplete field */
  635. ulint side; /* BTR_SEARCH_LEFT_SIDE or
  636. BTR_SEARCH_RIGHT_SIDE, depending on
  637. whether the leftmost record of several
  638. records with the same prefix should be
  639. indexed in the hash index */
  640. ibool is_hashed; /* TRUE if hash index has already been
  641. built on this page; note that it does
  642. not guarantee that the index is
  643. complete, though: there may have been
  644. hash collisions, record deletions,
  645. etc. */
  646. ulint curr_n_fields; /* prefix length for hash indexing:
  647. number of full fields */
  648. ulint curr_n_bytes; /* number of bytes in hash indexing */
  649. ulint curr_side; /* BTR_SEARCH_LEFT_SIDE or
  650. BTR_SEARCH_RIGHT_SIDE in hash
  651. indexing */
  652. /* 6. Debug fields */
  653. rw_lock_t debug_latch; /* in the debug version, each thread
  654. which bufferfixes the block acquires
  655. an s-latch here; so we can use the
  656. debug utilities in sync0rw */
  657. };
  658. /* The buffer pool structure. NOTE! The definition appears here only for
  659. other modules of this directory (buf) to see it. Do not use from outside! */
  660. struct buf_pool_struct{
  661. /* 1. General fields */
  662. mutex_t mutex; /* mutex protecting the buffer pool
  663. struct and control blocks, except the
  664. read-write lock in them */
  665. byte* frame_mem; /* pointer to the memory area which
  666. was allocated for the frames */
  667. byte* frame_zero; /* pointer to the first buffer frame:
  668. this may differ from frame_mem, because
  669. this is aligned by the frame size */
  670. buf_block_t* blocks; /* array of buffer control blocks */
  671. ulint max_size; /* number of control blocks ==
  672. maximum pool size in pages */
  673. ulint curr_size; /* current pool size in pages */
  674. hash_table_t* page_hash; /* hash table of the file pages */
  675. ulint n_pend_reads; /* number of pending read operations */
  676. ulint n_pages_read; /* number read operations */
  677. ulint n_pages_written;/* number write operations */
  678. ulint n_pages_created;/* number of pages created in the pool
  679. with no read */
  680. /* 2. Page flushing algorithm fields */
  681. UT_LIST_BASE_NODE_T(buf_block_t) flush_list;
  682. /* base node of the modified block
  683. list */
  684. ibool init_flush[BUF_FLUSH_LIST + 1];
  685. /* this is TRUE when a flush of the
  686. given type is being initialized */
  687. ulint n_flush[BUF_FLUSH_LIST + 1];
  688. /* this is the number of pending
  689. writes in the given flush type */
  690. os_event_t no_flush[BUF_FLUSH_LIST + 1];
  691. /* this is in the set state when there
  692. is no flush batch of the given type
  693. running */
  694. ulint ulint_clock; /* a sequence number used to count
  695. time. NOTE! This counter wraps
  696. around at 4 billion (if ulint ==
  697. 32 bits)! */
  698. ulint freed_page_clock;/* a sequence number used to count the
  699. number of buffer blocks removed from
  700. the end of the LRU list; NOTE that
  701. this counter may wrap around at 4
  702. billion! */
  703. ulint LRU_flush_ended;/* when an LRU flush ends for a page,
  704. this is incremented by one; this is
  705. set to zero when a buffer block is
  706. allocated */
  707. /* 3. LRU replacement algorithm fields */
  708. UT_LIST_BASE_NODE_T(buf_block_t) free;
  709. /* base node of the free block list */
  710. UT_LIST_BASE_NODE_T(buf_block_t) LRU;
  711. /* base node of the LRU list */
  712. buf_block_t* LRU_old;  /* pointer to the about 3/8 oldest
  713. blocks in the LRU list; NULL if LRU
  714. length less than BUF_LRU_OLD_MIN_LEN */
  715. ulint LRU_old_len; /* length of the LRU list from
  716. the block to which LRU_old points
  717. onward, including that block;
  718. see buf0lru.c for the restrictions
  719. on this value; not defined if
  720. LRU_old == NULL */
  721. };
  722. /* States of a control block */
  723. #define BUF_BLOCK_NOT_USED 211 /* is in the free list */
  724. #define BUF_BLOCK_READY_FOR_USE 212 /* when buf_get_free_block returns
  725. a block, it is in this state */
  726. #define BUF_BLOCK_FILE_PAGE 213 /* contains a buffered file page */
  727. #define BUF_BLOCK_MEMORY 214 /* contains some main memory object */
  728. #define BUF_BLOCK_REMOVE_HASH 215 /* hash index should be removed
  729. before putting to the free list */
  730. /* Io_fix states of a control block; these must be != 0 */
  731. #define BUF_IO_READ 561
  732. #define BUF_IO_WRITE 562
  733. /************************************************************************
  734. Let us list the consistency conditions for different control block states.
  735. NOT_USED: is in free list, not in LRU list, not in flush list, nor
  736. page hash table
  737. READY_FOR_USE: is not in free list, LRU list, or flush list, nor page
  738. hash table
  739. MEMORY: is not in free list, LRU list, or flush list, nor page
  740. hash table
  741. FILE_PAGE: space and offset are defined, is in page hash table
  742. if io_fix == BUF_IO_WRITE,
  743. pool: no_flush[block->flush_type] is in reset state,
  744. pool: n_flush[block->flush_type] > 0
  745. (1) if buf_fix_count == 0, then
  746. is in LRU list, not in free list
  747. is in flush list,
  748. if and only if oldest_modification > 0
  749. is x-locked,
  750. if and only if io_fix == BUF_IO_READ
  751. is s-locked,
  752. if and only if io_fix == BUF_IO_WRITE
  753. (2) if buf_fix_count > 0, then
  754. is not in LRU list, not in free list
  755. is in flush list,
  756. if and only if oldest_modification > 0
  757. if io_fix == BUF_IO_READ,
  758. is x-locked
  759. if io_fix == BUF_IO_WRITE,
  760. is s-locked
  761. State transitions:
  762. NOT_USED => READY_FOR_USE
  763. READY_FOR_USE => MEMORY
  764. READY_FOR_USE => FILE_PAGE
  765. MEMORY => NOT_USED
  766. FILE_PAGE => NOT_USED NOTE: This transition is allowed if and only if 
  767. (1) buf_fix_count == 0,
  768. (2) oldest_modification == 0, and
  769. (3) io_fix == 0.
  770. */
  771. #ifndef UNIV_NONINL
  772. #include "buf0buf.ic"
  773. #endif
  774. #endif