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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. The database buffer pool flush algorithm
  3. (c) 1995 Innobase Oy
  4. Created 11/5/1995 Heikki Tuuri
  5. *******************************************************/
  6. #include "buf0buf.h"
  7. #include "mtr0mtr.h"
  8. /************************************************************************
  9. Inserts a modified block into the flush list. */
  10. void
  11. buf_flush_insert_into_flush_list(
  12. /*=============================*/
  13. buf_block_t* block); /* in: block which is modified */
  14. /************************************************************************
  15. Inserts a modified block into the flush list in the right sorted position.
  16. This function is used by recovery, because there the modifications do not
  17. necessarily come in the order of lsn's. */
  18. void
  19. buf_flush_insert_sorted_into_flush_list(
  20. /*====================================*/
  21. buf_block_t* block); /* in: block which is modified */
  22. /************************************************************************
  23. This function should be called at a mini-transaction commit, if a page was
  24. modified in it. Puts the block to the list of modified blocks, if it is not
  25. already in it. */
  26. UNIV_INLINE
  27. void
  28. buf_flush_note_modification(
  29. /*========================*/
  30. buf_block_t* block, /* in: block which is modified */
  31. mtr_t* mtr) /* in: mtr */
  32. {
  33. ut_ad(block);
  34. ut_ad(block->state == BUF_BLOCK_FILE_PAGE);
  35. ut_ad(block->buf_fix_count > 0);
  36. ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX));
  37. ut_ad(mutex_own(&(buf_pool->mutex)));
  38. ut_ad(ut_dulint_cmp(mtr->start_lsn, ut_dulint_zero) != 0);
  39. ut_ad(mtr->modifications);
  40. ut_ad(ut_dulint_cmp(block->newest_modification, mtr->end_lsn) <= 0);
  41. block->newest_modification = mtr->end_lsn;
  42. if (ut_dulint_is_zero(block->oldest_modification)) {
  43. block->oldest_modification = mtr->start_lsn;
  44. ut_ad(!ut_dulint_is_zero(block->oldest_modification));
  45. buf_flush_insert_into_flush_list(block);
  46. } else {
  47. ut_ad(ut_dulint_cmp(block->oldest_modification,
  48. mtr->start_lsn) <= 0);
  49. }
  50. }
  51. /************************************************************************
  52. This function should be called when recovery has modified a buffer page. */
  53. UNIV_INLINE
  54. void
  55. buf_flush_recv_note_modification(
  56. /*=============================*/
  57. buf_block_t* block, /* in: block which is modified */
  58. dulint start_lsn, /* in: start lsn of the first mtr in a
  59. set of mtr's */
  60. dulint end_lsn) /* in: end lsn of the last mtr in the
  61. set of mtr's */
  62. {
  63. ut_ad(block);
  64. ut_ad(block->state == BUF_BLOCK_FILE_PAGE);
  65. ut_ad(block->buf_fix_count > 0);
  66. ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX));
  67. mutex_enter(&(buf_pool->mutex));
  68. ut_ad(ut_dulint_cmp(block->newest_modification, end_lsn) <= 0);
  69. block->newest_modification = end_lsn;
  70. if (ut_dulint_is_zero(block->oldest_modification)) {
  71. block->oldest_modification = start_lsn;
  72. ut_ad(!ut_dulint_is_zero(block->oldest_modification));
  73. buf_flush_insert_sorted_into_flush_list(block);
  74. } else {
  75. ut_ad(ut_dulint_cmp(block->oldest_modification,
  76. start_lsn) <= 0);
  77. }
  78. mutex_exit(&(buf_pool->mutex));
  79. }