Commit d387f148 authored by marko's avatar marko

branches/zip: Add buf_pool->zip_hash for keeping track on pages allocated

to the buddy system for allocating compressed pages and their descriptors.

buf_buddy_free_block(): New function: Deallocate the buffer frame.

buf_buddy_free(), buf_buddy_free_low(): Return void instead of a pointer
to a freed buffer frame.
parent e2a384eb
...@@ -13,6 +13,7 @@ Created December 2006 by Marko Makela ...@@ -13,6 +13,7 @@ Created December 2006 by Marko Makela
#endif #endif
#undef THIS_MODULE #undef THIS_MODULE
#include "buf0buf.h" #include "buf0buf.h"
#include "buf0lru.h"
#include "buf0flu.h" #include "buf0flu.h"
#include "page0page.h" #include "page0page.h"
...@@ -54,6 +55,34 @@ buf_buddy_alloc_low( ...@@ -54,6 +55,34 @@ buf_buddy_alloc_low(
return(bpage); return(bpage);
} }
/**************************************************************************
Deallocate a buffer frame of UNIV_PAGE_SIZE. */
static
void
buf_buddy_free_block(
/*=================*/
void* buf) /* in: buffer frame to deallocate */
{
ulint fold = (ulint) buf / UNIV_PAGE_SIZE;
buf_page_t* bpage;
buf_block_t* block;
#ifdef UNIV_SYNC_DEBUG
ut_a(mutex_own(&buf_pool->mutex));
#endif /* UNIV_SYNC_DEBUG */
ut_a(buf == ut_align_down(buf, UNIV_PAGE_SIZE));
HASH_SEARCH(hash, buf_pool->zip_hash, fold, bpage,
((buf_block_t*) bpage)->frame == buf);
ut_a(bpage);
ut_a(buf_page_get_state(bpage) == BUF_BLOCK_MEMORY);
block = (buf_block_t*) bpage;
mutex_enter(&block->mutex);
buf_LRU_block_free_non_file_page(block);
mutex_exit(&block->mutex);
}
/************************************************************************** /**************************************************************************
Try to relocate a block. */ Try to relocate a block. */
static static
...@@ -188,15 +217,11 @@ buf_buddy_relocate( ...@@ -188,15 +217,11 @@ buf_buddy_relocate(
} }
/************************************************************************** /**************************************************************************
Release a block to buf_pool->zip_free[]. */ Deallocate a block. */
void* void
buf_buddy_free_low( buf_buddy_free_low(
/*===============*/ /*===============*/
/* out: pointer to the beginning of a block of
size BUF_BUDDY_HIGH that should be freed to
the underlying allocator, or NULL if released
to buf_pool->zip_free[] */
void* buf, /* in: block to free */ void* buf, /* in: block to free */
ulint i) /* in: index of buf_pool->zip_free[] */ ulint i) /* in: index of buf_pool->zip_free[] */
{ {
...@@ -246,7 +271,8 @@ buddy_free: ...@@ -246,7 +271,8 @@ buddy_free:
} }
/* The whole block is free. */ /* The whole block is free. */
return(buf); buf_buddy_free_block(buf);
return;
} }
ut_a(bpage != buf); ut_a(bpage != buf);
...@@ -289,6 +315,4 @@ buddy_free: ...@@ -289,6 +315,4 @@ buddy_free:
bpage = buf; bpage = buf;
bpage->state = BUF_BLOCK_ZIP_FREE; bpage->state = BUF_BLOCK_ZIP_FREE;
UT_LIST_ADD_FIRST(list, buf_pool->zip_free[i], bpage); UT_LIST_ADD_FIRST(list, buf_pool->zip_free[i], bpage);
return(NULL);
} }
...@@ -845,6 +845,7 @@ buf_pool_init(void) ...@@ -845,6 +845,7 @@ buf_pool_init(void)
srv_buf_pool_curr_size = buf_pool->curr_size * UNIV_PAGE_SIZE; srv_buf_pool_curr_size = buf_pool->curr_size * UNIV_PAGE_SIZE;
buf_pool->page_hash = hash_create(2 * buf_pool->curr_size); buf_pool->page_hash = hash_create(2 * buf_pool->curr_size);
buf_pool->zip_hash = hash_create(2 * buf_pool->curr_size);
buf_pool->n_pend_reads = 0; buf_pool->n_pend_reads = 0;
...@@ -1067,6 +1068,7 @@ buf_pool_page_hash_rebuild(void) ...@@ -1067,6 +1068,7 @@ buf_pool_page_hash_rebuild(void)
/* Free, create, and populate the hash table. */ /* Free, create, and populate the hash table. */
hash_table_free(buf_pool->page_hash); hash_table_free(buf_pool->page_hash);
buf_pool->page_hash = page_hash = hash_create(2 * buf_pool->curr_size); buf_pool->page_hash = page_hash = hash_create(2 * buf_pool->curr_size);
/* TODO: buf_pool->zip_hash */
chunk = buf_pool->chunks; chunk = buf_pool->chunks;
n_chunks = buf_pool->n_chunks; n_chunks = buf_pool->n_chunks;
......
...@@ -53,15 +53,11 @@ buf_buddy_alloc( ...@@ -53,15 +53,11 @@ buf_buddy_alloc(
__attribute__((malloc)); __attribute__((malloc));
/************************************************************************** /**************************************************************************
Release a block to buf_pool->zip_free[]. */ Release a block. */
UNIV_INLINE UNIV_INLINE
void* void
buf_buddy_free( buf_buddy_free(
/*===========*/ /*===========*/
/* out: pointer to the beginning of a block of
size BUF_BUDDY_HIGH that should be freed to
the underlying allocator, or NULL if released
to buf_pool->zip_free[] */
void* buf, /* in: block to free */ void* buf, /* in: block to free */
ulint size) /* in: block size, up to UNIV_PAGE_SIZE / 2 */ ulint size) /* in: block size, up to UNIV_PAGE_SIZE / 2 */
__attribute__((nonnull)); __attribute__((nonnull));
......
...@@ -28,15 +28,11 @@ buf_buddy_alloc_low( ...@@ -28,15 +28,11 @@ buf_buddy_alloc_low(
__attribute__((malloc)); __attribute__((malloc));
/************************************************************************** /**************************************************************************
Release a block to buf_pool->zip_free[]. */ Deallocate a block. */
void* void
buf_buddy_free_low( buf_buddy_free_low(
/*===============*/ /*===============*/
/* out: pointer to the beginning of a block of
size BUF_BUDDY_HIGH that should be freed to
the underlying allocator, or NULL if released
to buf_pool->zip_free[] */
void* buf, /* in: block to free */ void* buf, /* in: block to free */
ulint i) /* in: index of buf_pool->zip_free[] */ ulint i) /* in: index of buf_pool->zip_free[] */
__attribute__((nonnull)); __attribute__((nonnull));
...@@ -98,15 +94,11 @@ buf_buddy_alloc( ...@@ -98,15 +94,11 @@ buf_buddy_alloc(
} }
/************************************************************************** /**************************************************************************
Release a block to buf_pool->zip_free[]. */ Deallocate a block. */
UNIV_INLINE UNIV_INLINE
void* void
buf_buddy_free( buf_buddy_free(
/*===========*/ /*===========*/
/* out: pointer to the beginning of a block of
size BUF_BUDDY_HIGH that should be freed to
the underlying allocator, or NULL if released
to buf_pool->zip_free[] */
void* buf, /* in: block to free */ void* buf, /* in: block to free */
ulint size) /* in: block size, up to UNIV_PAGE_SIZE / 2 */ ulint size) /* in: block size, up to UNIV_PAGE_SIZE / 2 */
{ {
...@@ -114,7 +106,7 @@ buf_buddy_free( ...@@ -114,7 +106,7 @@ buf_buddy_free(
ut_a(mutex_own(&buf_pool->mutex)); ut_a(mutex_own(&buf_pool->mutex));
#endif /* UNIV_SYNC_DEBUG */ #endif /* UNIV_SYNC_DEBUG */
return(buf_buddy_free_low(buf, buf_buddy_get_slot(size))); buf_buddy_free_low(buf, buf_buddy_get_slot(size));
} }
#ifdef UNIV_MATERIALIZE #ifdef UNIV_MATERIALIZE
......
...@@ -915,8 +915,9 @@ struct buf_page_struct{ ...@@ -915,8 +915,9 @@ struct buf_page_struct{
is currently bufferfixed */ is currently bufferfixed */
page_zip_des_t zip; /* compressed page */ page_zip_des_t zip; /* compressed page */
buf_page_t* hash; /* node used in chaining to the page buf_page_t* hash; /* node used in chaining to
hash table */ buf_pool->page_hash or
buf_pool->zip_hash */
/* 2. Page flushing fields; protected by buf_pool->mutex */ /* 2. Page flushing fields; protected by buf_pool->mutex */
...@@ -1095,8 +1096,14 @@ struct buf_pool_struct{ ...@@ -1095,8 +1096,14 @@ struct buf_pool_struct{
ulint n_chunks; /* number of buffer pool chunks */ ulint n_chunks; /* number of buffer pool chunks */
buf_chunk_t* chunks; /* buffer pool chunks */ buf_chunk_t* chunks; /* buffer pool chunks */
ulint curr_size; /* current pool size in pages */ ulint curr_size; /* current pool size in pages */
hash_table_t* page_hash; /* hash table of the file pages */ hash_table_t* page_hash; /* hash table of buf_page_t or
buf_block_t file pages,
buf_page_in_file() == TRUE,
indexed by (space_id, offset) */
hash_table_t* zip_hash; /* hash table of buf_block_t blocks
whose frames are allocated to the
zip buddy system,
indexed by block->frame */
ulint n_pend_reads; /* number of pending read operations */ ulint n_pend_reads; /* number of pending read operations */
time_t last_printout_time; /* when buf_print was last time time_t last_printout_time; /* when buf_print was last time
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment