新手如何建设网站,wordpress表单创建插件,苏州建站模板厂家,百度网页版下载1. mainfest文件的作用
mainfest文件是记录lsm tree中的各层tables表的创建删除记录的一个日志文件#xff0c;主要的作用是badger数据库重启后#xff0c;重新恢复内存中的各层tables表
2、内容结构
先是8个字节的魔数#xff0c;魔数的结构如下 ----------------------…1. mainfest文件的作用
mainfest文件是记录lsm tree中的各层tables表的创建删除记录的一个日志文件主要的作用是badger数据库重启后重新恢复内存中的各层tables表
2、内容结构
先是8个字节的魔数魔数的结构如下 ±----------------------------±------------------------±----------------------±----------------- | magicText (4 bytes) | externalMagic (2 bytes) | badgerMagic (2 bytes) | ±----------------------------±------------------------±----------------------±-----------------再就是pb.ManifestChangeSet结构体进行pb编码后的长度4字节和pb编码后的数据流的checksum ±---------------------------±-------------------------±----------------- | pbBufLen4bytes | checksum(4bytes) | bpBuf ±---------------------------±-------------------------±-----------------
3、pb.ManifestChangeSet
type ManifestChange struct {Id uint64 protobuf:varint,1,opt,nameId,proto3 json:Id,omitemptyOp ManifestChange_Operation protobuf:varint,2,opt,nameOp,proto3,enumbadgerpb3.ManifestChange_Operation json:Op,omitemptyLevel uint32 protobuf:varint,3,opt,nameLevel,proto3 json:Level,omitemptyKeyId uint64 protobuf:varint,4,opt,namekey_id,jsonkeyId,proto3 json:key_id,omitemptyEncryptionAlgo EncryptionAlgo protobuf:varint,5,opt,nameencryption_algo,jsonencryptionAlgo,proto3,enumbadgerpb3.EncryptionAlgo json:encryption_algo,omitemptyCompression uint32 protobuf:varint,6,opt,namecompression,proto3 json:compression,omitempty
}type ManifestChangeSet struct {// A set of changes that are applied atomically.Changes []*ManifestChange protobuf:bytes,1,rep,namechanges,proto3 json:changes,omitempty
}changes 是一个切片把sst文件的每一次创建和删除都记录下来
4、mainfest实现原子性
const ManifestFilename MANIFESTmanifestRewriteFilename MANIFEST-REWRITEhelpRewrite使用两个文件来实现原子性每次LSM tree 的的sst文件要创建或删除的时候都是先创建MANIFEST-REWRITE文件且使用O_TRUNC参数让MANIFEST-REWRITE文件为空文件清理上次没写完就恰好断电的情况造成MANIFEST-REWRITE是一个脏文件等数据写都都落盘存储再MANIFEST-REWRITE文件后在调用rename函数把MANIFEST-REWRITE文件改名为MANIFEST-REWRITE最后修改内存中存储的lsm tree中记录的sst表。 ReplayManifestFile函数在回放数据的时候是在重新打开数据库数据库目录存在MANIFEST就直接从MANIFEST来读取即使上次在写MANIFEST-REWRITE的发生断电内存中的lsm tree的sst表修改是在后的不会执行不影响数据可靠性等下次重新写MANIFEST文件的时候就会重新把上次的脏数据擦除。
5、和mainfest相关的函数
func (mf *manifestFile) rewrite() error //在lsm tree 任意层要发生变化了调用
func helpRewrite(dir string, m *Manifest, extMagic uint16) (*os.File, int, error)//第一次创建数据和rewrite调用
func ReplayManifestFile(fp *os.File, extMagic uint16)//非第一次打开数据的时候调用用来重新构建数据lsm tree的各个层的sst 表