summaryrefslogtreecommitdiff
path: root/innobase/buf
diff options
context:
space:
mode:
authorunknown <heikki@donna.mysql.fi>2001-03-16 00:22:21 +0200
committerunknown <heikki@donna.mysql.fi>2001-03-16 00:22:21 +0200
commit34236e77473358d13cd087ecb3791bca4c3e8b20 (patch)
tree24f9f3e0f8f12dfce6d639229fb19cb84597e1a4 /innobase/buf
parente0296db76e3d02b6aa239cf27588db523928aab5 (diff)
downloadmariadb-git-34236e77473358d13cd087ecb3791bca4c3e8b20.tar.gz
buf0buf.c Fixed a race condition in buf0lru and btr0sea which could corrupt the LRU list
buf0lru.c Fixed a race condition in buf0lru and btr0sea which could corrupt the LRU list innobase/buf/buf0buf.c: Fixed a race condition in buf0lru and btr0sea which could corrupt the LRU list innobase/buf/buf0lru.c: Fixed a race condition in buf0lru and btr0sea which could corrupt the LRU list BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
Diffstat (limited to 'innobase/buf')
-rw-r--r--innobase/buf/buf0buf.c13
-rw-r--r--innobase/buf/buf0lru.c4
2 files changed, 16 insertions, 1 deletions
diff --git a/innobase/buf/buf0buf.c b/innobase/buf/buf0buf.c
index 16662b6c51c..34fbc5b9f98 100644
--- a/innobase/buf/buf0buf.c
+++ b/innobase/buf/buf0buf.c
@@ -863,6 +863,19 @@ buf_page_get_known_nowait(
mutex_enter(&(buf_pool->mutex));
+ if (block->state == BUF_BLOCK_REMOVE_HASH) {
+ /* Another thread is just freeing the block from the LRU list
+ of the buffer pool: do not try to access this page; this
+ attempt to access the page can only come through the hash
+ index because when the buffer block state is ..._REMOVE_HASH,
+ we have already removed it from the page address hash table
+ of the buffer pool. */
+
+ mutex_exit(&(buf_pool->mutex));
+
+ return(FALSE);
+ }
+
#ifdef UNIV_SYNC_DEBUG
buf_block_buf_fix_inc_debug(block, file, line);
#else
diff --git a/innobase/buf/buf0lru.c b/innobase/buf/buf0lru.c
index 26bdd7db1fe..4626dc2757b 100644
--- a/innobase/buf/buf0lru.c
+++ b/innobase/buf/buf0lru.c
@@ -138,6 +138,8 @@ buf_LRU_search_and_free_block(
mutex_enter(&(buf_pool->mutex));
+ ut_a(block->buf_fix_count == 0);
+
buf_LRU_block_free_hashed_page(block);
freed = TRUE;
@@ -435,7 +437,7 @@ buf_LRU_add_block_to_end_low(
defined: init it */
buf_LRU_old_init();
- }
+ }
}
/**********************************************************************