Documentation ¶
Index ¶
- Constants
- Variables
- type AddedFunc
- type BufferBlock
- type BufferFlushType
- type BufferPage
- type BufferPageState
- type BufferPool
- func (bufferPool *BufferPool) GetDirtyPageBlock(space uint32, pageNumber uint32) *BufferBlock
- func (bufferPool *BufferPool) GetFlushDiskList() *FlushBlockList
- func (bufferPool *BufferPool) GetPageBlock(space uint32, pageNumber uint32) *BufferBlock
- func (bufferPool *BufferPool) RangePageLoad(space uint32, pageNumberStart, pageNumberEnd uint32)
- func (bufferPool *BufferPool) UpdateBlock(space uint32, pageNumber uint32, block *BufferBlock)
- type DeserializeFunc
- type EvictedFunc
- type FlushBlockList
- type FlushToDisk
- type FreeBlockList
- type LRUCache
- type LRUCacheImpl
- func (L *LRUCacheImpl) Get(spaceId uint32, pageNo uint32) (*BufferBlock, error)
- func (L *LRUCacheImpl) GetOld(spaceId uint32, pageNo uint32) (*BufferBlock, error)
- func (L *LRUCacheImpl) GetYoung(spaceId uint32, pageNo uint32) (*BufferBlock, error)
- func (L *LRUCacheImpl) Has(spaceId uint32, pageNo uint32) bool
- func (st LRUCacheImpl) HitCount() uint64
- func (st LRUCacheImpl) HitRate() float64
- func (st LRUCacheImpl) IncrHitCount() uint64
- func (st LRUCacheImpl) IncrMissCount() uint64
- func (L *LRUCacheImpl) Len() uint32
- func (st LRUCacheImpl) LookupCount() uint64
- func (st LRUCacheImpl) MissCount() uint64
- func (L *LRUCacheImpl) Purge()
- func (L *LRUCacheImpl) Remove(spaceId uint32, pageNo uint32) bool
- func (L *LRUCacheImpl) Set(spaceId uint32, pageNo uint32, value *BufferBlock) error
- func (L *LRUCacheImpl) SetOld(spaceId uint32, pageNo uint32, value *BufferBlock)
- func (L LRUCacheImpl) SetYoung(spaceId uint32, pageNo uint32, value *BufferBlock)
- type PurgeOldMoveYoungFunc
- type PurgeVisitorFunc
- type SerializeFunc
Constants ¶
const ( BUF_IO_NONE buffer_io_fix = iota BUF_IO_READ BUF_IO_WRITE BUF_IO_PIN )
Variables ¶
var KeyNotFoundError = errors.New("Key not found.")
Functions ¶
This section is empty.
Types ¶
type BufferBlock ¶
type BufferBlock struct { BufferPage *BufferPage Frame *[]byte }
* 这个就是数据页的控制体,用来描述数据页部分的信息(大部分信息在buf_page_t中)。buf_block_t中第一字段就是buf_page_t,这个不是随意放的, 是必须放在第一字段,因为只有这样buf_block_t和buf_page_t两种类型的指针可以相互转换。第二个字段是frame字段,指向真正存数据的数据页。 buf_block_t还存储了Unzip LRU List链表的根节点。另外一个比较重要的字段就是block级别的mutex。
*
func NewBufferBlock ¶
func NewBufferBlock(frame *[]byte, spaceId, pageNo uint32) *BufferBlock
func (BufferBlock) GetFrame ¶
func (bb BufferBlock) GetFrame() *[]byte
func (BufferBlock) GetPageNo ¶
func (bb BufferBlock) GetPageNo() uint32
func (BufferBlock) GetSpaceId ¶
func (bb BufferBlock) GetSpaceId() uint32
type BufferFlushType ¶
type BufferFlushType uint8
const BUF_FLUSH_LIST BufferFlushType = 2
const BUF_FLUSH_LRU BufferFlushType = 1
const BUF_FLUSH_N_TYPES BufferFlushType = 4
const BUF_FLUSH_SINGLE_PAGE BufferFlushType = 3
type BufferPage ¶
type BufferPage struct {
// contains filtered or unexported fields
}
TODO 用来实现bufferpool * 这个可以理解为另外一个数据页的控制体,大部分的数据页信息存在其中,例如space_id, page_no, page state, newest_modification, oldest_modification,access_time以及压缩页的所有信息等。压缩页的信息包括压缩页的大小,压缩页的数据指针(真正的压缩页数据是存储在由伙伴 系统分配的数据页上)。这里需要注意一点,如果某个压缩页被解压了,解压页的数据指针是存储在buf_block_t的frame字段里。
*
func NewBufferPage ¶
func NewBufferPage(spaceId uint32, pageNo uint32) *BufferPage
type BufferPageState ¶
type BufferPageState uint8
const BUF_BLOCK_FILE_PAGE BufferPageState = 4
正常被使用的数据页都是这种状态。LRU List中,大部分数据页都是这种状态。压缩页被解压后,状态也会变成BUF_BLOCK_FILE_PAGE。
const BUF_BLOCK_MEMORY BufferPageState = 6
Buffer Pool中的数据页不仅可以存储用户数据,也可以存储一些系统信息,例如InnoDB行锁, 自适应哈希索引以及压缩页的数据等,这些数据页被标记为BUF_BLOCK_MEMORY。处于这个状态的数据页不处于任何逻辑链表中
const BUF_BLOCK_NOT_USED BufferPageState = 2
当链表处于Free List中,状态就为此状态。是一个能长期存在的状态。
const BUF_BLOCK_POOL_WATCH BufferPageState = 1
这种类型的page是提供给purge线程用的。InnoDB为了实现多版本,需要把之前的数据记录在undo log中,如果没有读请求再需要它, 就可以通过purge线程删除。换句话说,purge线程需要知道某些数据页是否被读取,现在解法就是首先查看page hash, 看看这个数据页是否已经被读入,如果没有读入,则获取(启动时候通过malloc分配,不在Buffer Chunks中)一个BUF_BLOCK_POOL_WATCH类型的 哨兵数据页控制体,同时加入page_hash但是没有真正的数据(buf_blokc_t::frame为空)并把其类型置为BUF_BLOCK_ZIP_PAGE (表示已经被使用了,其他purge线程就不会用到这个控制体了),相关函数buf_pool_watch_set,如果查看page hash后发现有这个数据页, 只需要判断控制体在内存中的地址是否属于Buffer Chunks即可,如果是表示对应数据页已经被其他线程读入了, 相关函数buf_pool_watch_occurred。另一方面,如果用户线程需要这个数据页,先查看page hash看看是否是BUF_BLOCK_POOL_WATCH类型的 数据页,如果是则回收这个BUF_BLOCK_POOL_WATCH类型的数据页,从Free List中(即在Buffer Chunks中)分配一个空闲的控制体,填入数据。 这里的核心思想就是通过控制体在内存中的地址来确定数据页是否还在被使用。
const BUF_BLOCK_READY_FOR_USE BufferPageState = 3
当从Free List中,获取一个空闲的数据页时,状态会从BUF_BLOCK_NOT_USED 变为BUF_BLOCK_READY_FOR_USE(buf_LRU_get_free_block),
也是一个比较短暂的状态。处于这个状态的数据页不处于任何逻辑链表中。
const BUF_BLOCK_REMOVE_HASH BufferPageState = 5
当加入Free List之前,需要先把page hash移除。因此这种状态就表示此页面page hash已经被移除,但是还没被加入到Free List中, 是一个比较短暂的状态。 总体来说,大部分数据页都处于BUF_BLOCK_NOT_USED(全部在Free List中)和BUF_BLOCK_FILE_PAGE (大部分处于LRU List中,LRU List中还包含除被purge线程标记的BUF_BLOCK_ZIP_PAGE状态的数据页)状态,少部分处于BUF_BLOCK_MEMORY状态, 极少处于其他状态。前三种状态的数据页都不在Buffer Chunks上,对应的控制体都是临时分配的, InnoDB把他们列为invalid state(buf_block_state_valid)。 如果理解了这八种状态以及其之间的转换关系 ,那么阅读Buffer pool的代码细节就会更加游刃有余。
type BufferPool ¶
type BufferPool struct { FileSystem basic.FileSystem // contains filtered or unexported fields }
func NewBufferPool ¶
func NewBufferPool(innodbBufferPoolSize uint64, youngPercent float64, oldPercent float64, innodbOldBlocksTime int, system basic.FileSystem) *BufferPool
TODO 暂时实现一个,后面再有接着实现多个buffer instance
func (*BufferPool) GetDirtyPageBlock ¶
func (bufferPool *BufferPool) GetDirtyPageBlock(space uint32, pageNumber uint32) *BufferBlock
func (*BufferPool) GetFlushDiskList ¶
func (bufferPool *BufferPool) GetFlushDiskList() *FlushBlockList
func (*BufferPool) GetPageBlock ¶
func (bufferPool *BufferPool) GetPageBlock(space uint32, pageNumber uint32) *BufferBlock
func (*BufferPool) RangePageLoad ¶
func (bufferPool *BufferPool) RangePageLoad(space uint32, pageNumberStart, pageNumberEnd uint32)
func (*BufferPool) UpdateBlock ¶
func (bufferPool *BufferPool) UpdateBlock(space uint32, pageNumber uint32, block *BufferBlock)
更新脏页面
type DeserializeFunc ¶
type DeserializeFunc func(interface{}, interface{}) (interface{}, error)
type EvictedFunc ¶
type EvictedFunc func(interface{}, interface{})
type FlushBlockList ¶
type FlushBlockList struct {
// contains filtered or unexported fields
}
脏页
func NewFlushBlockList ¶
func NewFlushBlockList() *FlushBlockList
func (*FlushBlockList) AddBlock ¶
func (flb *FlushBlockList) AddBlock(block *BufferBlock)
func (*FlushBlockList) GetLastBlock ¶
func (flb *FlushBlockList) GetLastBlock() *BufferBlock
func (*FlushBlockList) IsEmpty ¶
func (flb *FlushBlockList) IsEmpty() bool
type FlushToDisk ¶
type FlushToDisk func(system basic.FileSystem, spaceId uint32, pageNo uint32, block BufferBlock)
type FreeBlockList ¶
type FreeBlockList struct { FileSystem basic.FileSystem // contains filtered or unexported fields }
func NewFreeBlockList ¶
func NewFreeBlockList(FileSystem basic.FileSystem) *FreeBlockList
func (*FreeBlockList) AddBlock ¶
func (flb *FreeBlockList) AddBlock(spaceId uint32, pageNo uint32)
func (*FreeBlockList) GetPage ¶
func (flb *FreeBlockList) GetPage(spaceId uint32, pageNo uint32) *BufferBlock
type LRUCache ¶
type LRUCache interface { //lru 中设置spaceId,pageNo Set(spaceId uint32, pageNo uint32, value *BufferBlock) error Get(spaceId uint32, pageNo uint32) (*BufferBlock, error) Remove(spaceId uint32, pageNo uint32) bool // Purge removes all key-value pairs from the cache. Purge() // Has returns true if the key exists in the cache. Has(spaceId uint32, pageNo uint32) bool SetYoung(spaceId uint32, pageNo uint32, value *BufferBlock) GetYoung(spaceId uint32, pageNo uint32) (*BufferBlock, error) SetOld(spaceId uint32, pageNo uint32, value *BufferBlock) GetOld(spaceId uint32, pageNo uint32) (*BufferBlock, error) Len() uint32 }
type LRUCacheImpl ¶
type LRUCacheImpl struct {
// contains filtered or unexported fields
}
Discards the least recently used items first.
func (*LRUCacheImpl) Get ¶
func (L *LRUCacheImpl) Get(spaceId uint32, pageNo uint32) (*BufferBlock, error)
func (*LRUCacheImpl) GetOld ¶
func (L *LRUCacheImpl) GetOld(spaceId uint32, pageNo uint32) (*BufferBlock, error)
func (*LRUCacheImpl) GetYoung ¶
func (L *LRUCacheImpl) GetYoung(spaceId uint32, pageNo uint32) (*BufferBlock, error)
func (LRUCacheImpl) HitRate ¶
func (st LRUCacheImpl) HitRate() float64
HitRate returns rate for cache hitting
func (LRUCacheImpl) IncrMissCount ¶
func (st LRUCacheImpl) IncrMissCount() uint64
increment miss count
func (*LRUCacheImpl) Len ¶
func (L *LRUCacheImpl) Len() uint32
func (LRUCacheImpl) LookupCount ¶
func (st LRUCacheImpl) LookupCount() uint64
LookupCount returns lookup count
func (LRUCacheImpl) MissCount ¶
func (st LRUCacheImpl) MissCount() uint64
MissCount returns miss count
func (*LRUCacheImpl) Purge ¶
func (L *LRUCacheImpl) Purge()
func (*LRUCacheImpl) Set ¶
func (L *LRUCacheImpl) Set(spaceId uint32, pageNo uint32, value *BufferBlock) error
func (*LRUCacheImpl) SetOld ¶
func (L *LRUCacheImpl) SetOld(spaceId uint32, pageNo uint32, value *BufferBlock)
func (LRUCacheImpl) SetYoung ¶
func (L LRUCacheImpl) SetYoung(spaceId uint32, pageNo uint32, value *BufferBlock)
TODO 校验这里的hashcode的安全性
type PurgeOldMoveYoungFunc ¶
type PurgeOldMoveYoungFunc func(interface{}, interface{}) (interface{}, error)
type PurgeVisitorFunc ¶
type PurgeVisitorFunc func(interface{}, interface{})
type SerializeFunc ¶
type SerializeFunc func(interface{}, interface{}) (interface{}, error)