MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
|
日志数据缓冲区 更多...
#include <log_buffer.h>
Public 成员函数 | |
RC | init (LSN lsn, int32_t max_bytes=0) |
RC | append (LSN &lsn, LogModule::Id module_id, vector< char > &&data) |
在缓冲区中追加一条日志 | |
RC | append (LSN &lsn, LogModule module, vector< char > &&data) |
RC | flush (LogFileWriter &file_writer, int &count) |
刷新缓冲区中的日志到磁盘 更多... | |
int64_t | bytes () const |
当前缓冲区中有多少字节的日志 | |
int32_t | entry_number () const |
当前缓冲区中有多少条日志 | |
LSN | current_lsn () const |
LSN | flushed_lsn () const |
Private 属性 | |
mutex | mutex_ |
deque< LogEntry > | entries_ |
当前数据结构一定会在多线程中访问,所以强制使用有效的锁,而不是有条件生效的common::Mutex | |
atomic< int64_t > | bytes_ |
日志缓冲区 | |
atomic< LSN > | current_lsn_ {0} |
当前缓冲区中的日志数据大小 | |
atomic< LSN > | flushed_lsn_ {0} |
int32_t | max_bytes_ = 4 * 1024 * 1024 |
日志数据缓冲区
缓存一部分日志在内存中而不是直接写入磁盘。 这里的缓存没有考虑高性能操作,比如使用预分配内存、环形缓冲池等。 在生产数据库中,通常会使用预分配内存形式的缓存来提高性能,并且可以减少内存碎片。
RC LogEntryBuffer::append | ( | LSN & | lsn, |
LogModule | module, | ||
vector< char > && | data | ||
) |
控制当前buffer使用的内存 简单粗暴,强制原地等待 但是如果当前想要新插入的日志比较大,不会做控制。所以理论上容纳的最大buffer内存是2*max_bytes_
RC LogEntryBuffer::flush | ( | LogFileWriter & | file_writer, |
int & | count | ||
) |
刷新缓冲区中的日志到磁盘
file_handle | 使用它来写文件 |
count | 刷了多少条日志 |