|
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 | 刷了多少条日志 |