| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- package DB
- import (
- "TsDB2/DB/pool"
- "os"
- "unsafe"
- )
- const (
- PageSize4K = 4096 // 头、表、索引元数据
- // 索引页是动态长度,不由这里定义
- )
- // File 只负责:打开、关闭、读、写 —— unsafe 全部收敛
- type File struct {
- f *os.File
- bp *pool.BufferPool // 页面缓冲池 (nil = 未启用)
- }
- func OpenFile(path string) (*File, error) {
- f, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, 0644)
- if err != nil {
- return nil, err
- }
- return &File{f: f}, nil
- }
- func (ff *File) Close() error {
- if ff.bp != nil {
- ff.bp.Stop() // 先刷盘再关文件
- }
- return ff.f.Close()
- }
- // InitBufferPool 初始化页面缓冲池, 拦截 ReadPage/WritePage 实现内存缓存
- // capacity: 最大缓存页数 (建议 10000~50000)
- func (ff *File) InitBufferPool(capacity int) {
- ff.bp = pool.NewBufferPool(capacity, ff.readPageDisk, ff.writePageDisk, nil)
- }
- // Commit 显式提交 — 将所有脏页刷盘
- func (ff *File) Commit() error {
- if ff.bp != nil {
- return ff.bp.Commit()
- }
- return nil
- }
- func (ff *File) WritePage16K(pageID uint32, buf *[PageSize]byte) error {
- // 头占一个4K,所以 pageID 从 1 开始
- offset := int64(PageSize4K) + int64(pageID-1)*int64(PageSize)
- _, err := ff.f.WriteAt(buf[:], offset)
- return err
- }
- // -----------------------------------------------------------------------------------
- // ✅ 动态长度:索引页 — 缓冲池拦截层
- // -----------------------------------------------------------------------------------
- func (ff *File) WritePage(pageID uint32, buf []byte) error {
- if ff.bp != nil {
- return ff.bp.WritePage(pageID, buf) // 写缓存, 延迟落盘
- }
- return ff.writePageDisk(pageID, buf)
- }
- func (ff *File) ReadPage(pageID uint32, buf []byte) error {
- if ff.bp != nil {
- return ff.bp.ReadPage(pageID, buf) // 先查缓存
- }
- return ff.readPageDisk(pageID, buf)
- }
- // -----------------------------------------------------------------------------------
- // ✅ 底层磁盘 I/O (缓冲池回源)
- // -----------------------------------------------------------------------------------
- func (ff *File) writePageDisk(pageID uint32, buf []byte) error {
- offset := int64(PageSize4K) + int64(pageID-1)*int64(len(buf))
- _, err := ff.f.WriteAt(buf, offset)
- return err
- }
- func (ff *File) readPageDisk(pageID uint32, buf []byte) error {
- offset := int64(PageSize4K) + int64(pageID-1)*int64(len(buf))
- _, err := ff.f.ReadAt(buf, offset)
- return err
- }
- // -----------------------------------------------------------------------------------
- // ✅ 头读写(固定4K)
- // -----------------------------------------------------------------------------------
- func (ff *File) WriteHeader(h *HeaderPage) error {
- var buf [PageSize4K]byte
- copy(buf[:], (*[PageSize4K]byte)(unsafe.Pointer(h))[:])
- _, err := ff.f.WriteAt(buf[:], 0)
- return err
- }
- func (ff *File) ReadHeader() (*HeaderPage, error) {
- buf := make([]byte, PageSize4K)
- _, err := ff.f.ReadAt(buf, 0)
- if err != nil {
- return nil, err
- }
- h := &HeaderPage{}
- copy((*[PageSize4K]byte)(unsafe.Pointer(h))[:], buf)
- return h, nil
- }
- func (ff *File) TruncateSize(size int64) error {
- return ff.f.Truncate(size)
- }
|