1
1
/*****************************************************************************
3
Copyright (C) 1995, 2009, Innobase Oy. All Rights Reserved.
3
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
5
5
This program is free software; you can redistribute it and/or modify it under
6
6
the terms of the GNU General Public License as published by the Free Software
35
35
buf_flush_insert_into_flush_list(
36
36
/*=============================*/
37
buf_pool_t* buf_pool, /*!< buffer pool instance */
38
buf_block_t* block, /*!< in/out: block which is modified */
39
ib_uint64_t lsn); /*!< in: oldest modification */
37
buf_block_t* block); /*!< in/out: block which is modified */
40
38
/********************************************************************//**
41
39
Inserts a modified block into the flush list in the right sorted position.
42
40
This function is used by recovery, because there the modifications do not
46
44
buf_flush_insert_sorted_into_flush_list(
47
45
/*====================================*/
48
buf_pool_t* buf_pool, /*!< buffer pool instance */
49
buf_block_t* block, /*!< in/out: block which is modified */
50
ib_uint64_t lsn); /*!< in: oldest modification */
46
buf_block_t* block); /*!< in/out: block which is modified */
52
48
/********************************************************************//**
53
49
This function should be called at a mini-transaction commit, if a page was
60
56
buf_block_t* block, /*!< in: block which is modified */
61
57
mtr_t* mtr) /*!< in: mtr */
63
buf_pool_t* buf_pool = buf_pool_from_block(block);
66
60
ut_ad(buf_block_get_state(block) == BUF_BLOCK_FILE_PAGE);
67
61
ut_ad(block->page.buf_fix_count > 0);
68
62
#ifdef UNIV_SYNC_DEBUG
69
63
ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX));
70
64
#endif /* UNIV_SYNC_DEBUG */
72
ut_ad(!buf_pool_mutex_own(buf_pool));
73
ut_ad(!buf_flush_list_mutex_own(buf_pool));
74
ut_ad(log_flush_order_mutex_own());
65
ut_ad(buf_pool_mutex_own());
76
67
ut_ad(mtr->start_lsn != 0);
77
68
ut_ad(mtr->modifications);
79
mutex_enter(&block->mutex);
80
69
ut_ad(block->page.newest_modification <= mtr->end_lsn);
82
71
block->page.newest_modification = mtr->end_lsn;
84
73
if (!block->page.oldest_modification) {
85
buf_flush_insert_into_flush_list(
86
buf_pool, block, mtr->start_lsn);
75
block->page.oldest_modification = mtr->start_lsn;
76
ut_ad(block->page.oldest_modification != 0);
78
buf_flush_insert_into_flush_list(block);
88
80
ut_ad(block->page.oldest_modification <= mtr->start_lsn);
91
mutex_exit(&block->mutex);
93
83
++srv_buf_pool_write_requests;
105
95
ib_uint64_t end_lsn) /*!< in: end lsn of the last mtr in the
108
buf_pool_t* buf_pool = buf_pool_from_block(block);
111
99
ut_ad(buf_block_get_state(block) == BUF_BLOCK_FILE_PAGE);
112
100
ut_ad(block->page.buf_fix_count > 0);
114
102
ut_ad(rw_lock_own(&(block->lock), RW_LOCK_EX));
115
103
#endif /* UNIV_SYNC_DEBUG */
117
ut_ad(!buf_pool_mutex_own(buf_pool));
118
ut_ad(!buf_flush_list_mutex_own(buf_pool));
119
ut_ad(log_flush_order_mutex_own());
105
buf_pool_mutex_enter();
121
ut_ad(start_lsn != 0);
122
107
ut_ad(block->page.newest_modification <= end_lsn);
124
mutex_enter(&block->mutex);
125
109
block->page.newest_modification = end_lsn;
127
111
if (!block->page.oldest_modification) {
128
buf_flush_insert_sorted_into_flush_list(
129
buf_pool, block, start_lsn);
113
block->page.oldest_modification = start_lsn;
115
ut_ad(block->page.oldest_modification != 0);
117
buf_flush_insert_sorted_into_flush_list(block);
131
119
ut_ad(block->page.oldest_modification <= start_lsn);
134
mutex_exit(&block->mutex);
122
buf_pool_mutex_exit();
137
124
#endif /* !UNIV_HOTBACKUP */