简要记录一下压缩表在buffer pool中的相关结构体:
////////////////////////////////////////////////////////////
struct buf_pool_struct{
mutex_t     zip_mutex;   //用于保护压缩page(buf_page_t)
mutex_t     zip_free_mutex;
mutex_t     zip_hash_mutex;   //保护zip_hash
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_unzip;  //number of pending decompressions
UT_LIST_BASE_NODE_T(buf_block_t) unzip_LRU;   //base node of the unzip_LRU list
UT_LIST_BASE_NODE_T(buf_page_t) zip_free[BUF_BUDDY_SIZES_MAX]; //存储buddy allocator的空闲block
}
Innodb采用Binary buddy allocator算法来为compress page(block->page.zip.data)分配内存块(buf/buf0buddy.c)
buf_buddy_alloc_low是分配block的函数,需要持有LRU_list_mutex,不可以持有zip_mutex
buf_buddy_free_low是释放block的函数,需要持有zip_free_mutex,不可以持有zip_mutex
innodb_cmpmem表显示每个bp instance的不同page size的内存分配情况,因此在调用i_s_cmpmem_fill_low时需要持有zip_free_mutex锁
zip_mutex用于保护压缩页在buffer pool中的操作,在如下函数中被调用到:
1.buf/buf0lru.c
buf_LRU_free_block:
buf_LRU_block_remove_hashed_page:该函数会释放zip_mutex
2.buf/buf0buf.c
buf_page_init
buf_page_init_for_read
buf_page_get_gen
buf_get_latched_pages_number_instance
buf_pool_watch_set/buf_pool_watch_unset
buf_pool_validate_instance
buf_get_latched_pages_number_instance
3.include/buf0buf.ic
buf_page_release_zip

zip_hash_mutex用于保护buf_pool->zip_hash,在如下函数中调用
buf/buf0buddy.c:
buf_buddy_block_free
buf_buddy_block_register
——————————————————
buf_block_struct{
UT_LIST_NODE_T(buf_block_t) unzip_LRU;   在解压page LRU  list上的节点,当该block的page.state == BUF_BLOCK_FILE_PAGE并且page.zip.data != NULL时会在unzip_lru list上
buf_page_t  page;
}
——————————————————-
struct buf_page_struct{
page_zip_des_t  zip;   //包含压缩页信息
UT_LIST_NODE_T(buf_page_t) zip_list;    //zip_clean or zip_free[]
}
从代码来看,zip_list应该是buffer_pool->zip_free链表的节点
——————————————————–
struct page_zip_des_struct{
page_zip_t* data;    //压缩Page数据
m_start   //debug编译,mlog开始的偏移量
m_end    //mlog的结尾偏移量
m_nonempty  //为true时表示mlog不为空
n_blobs   //该Page上外部存储的列的个数,在一个16kb的page上最大为744
ssize  //为0表示非压缩Page,否则压缩page大小为PAGE_ZIP_MIN_SIZE << (ssize – 1)
}

 

原创文章,转载请注明: 转载自Simple Life

本文链接地址: [MySQL学习] Innodb压缩表相关结构体

Post Footer automatically generated by wp-posturl plugin for wordpress.


Comments

Leave a Reply

Your email address will not be published. Name and email are required


Current month ye@r day *