写点什么

长安链学习研究 - 存储分析 wal 机制

作者:
  • 2022 年 7 月 17 日
  • 本文字数:1283 字

    阅读完需:约 4 分钟

本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star


func (bc *Blockchain) initStore() (err error) blockchain_init.go

func (m *Factory) NewStore(chainId string, storeConfig *conf.StorageConfig, logger protocol.Logger, p11Handle *pkcs11.P11Handle) (protocol.BlockchainStore, error) store_factory.go


注册罗盘数据加密,先不看,先看注册 wal

// 注册wal 或者bfdbif err = m.registerFileOrLogDB(chainId, storeConfig, logger); err != nil {   return err}
复制代码


// 注册bfdb或者walfunc (m *Factory) registerFileOrLogDB(chainId string, storeConfig *conf.StorageConfig, logger protocol.Logger) error {	var (		err    error		bfdb   *blockfiledb.BlockFile		walLog *wal.Log	)	//处理 bfdb,完成注册	if !storeConfig.DisableBlockFileDb {		opts := blockfiledb.DefaultOptions		opts.NoCopy = true		opts.NoSync = storeConfig.LogDBSegmentAsync		if storeConfig.LogDBSegmentSize > 64 { // LogDBSegmentSize default is 64MB			opts.SegmentSize = storeConfig.LogDBSegmentSize * 1024 * 1024		}
bfdbPath := filepath.Join(storeConfig.StorePath, chainId, blockFilePath) bfdb, err = blockfiledb.Open(bfdbPath, opts, logger) if err != nil { panic(fmt.Sprintf("open block file db failed, path:%s, error:%s", bfdbPath, err)) } return m.ioc.Register(func() binlog.BinLogger { return bfdb }) } //处理 wal,完成注册 opts := wal.DefaultOptions opts.NoCopy = true opts.NoSync = storeConfig.LogDBSegmentAsync if storeConfig.LogDBSegmentSize > 0 { // LogDBSegmentSize default is 20MB opts.SegmentSize = storeConfig.LogDBSegmentSize * 1024 * 1024 }
walPath := filepath.Join(storeConfig.StorePath, chainId, walLogPath) walLog, err = wal.Open(walPath, opts) if err != nil { panic(fmt.Sprintf("open wal log failed, path:%s, error:%s", walPath, err)) } return m.ioc.Register(func() *wal.Log { return walLog })}
复制代码

默认是禁止状态,不走 bfdb 这块

wal 地址

由配置文件的存储路径+chainid +wallogpath 路径组成:

配置文件账本存储路径:

chainid:

wal 路径:

所以组成的路径就是上面拼接的路径位置

这个是 wal.open 方法创建了一个 wallog,注册到了 ioc 容器里

walLog, err = wal.Open(walPath, opts)	return m.ioc.Register(func() *wal.Log { return walLog })
复制代码

进入 open 方法里看看

l := &Log{path: path, opts: *opts}  创建一个log实例	l.scache.Resize(l.opts.SegmentCacheSize)  	if err := os.MkdirAll(path, 0777); err != nil {  创建wal日路径		return nil, err	}	if err := l.load(); err != nil 
复制代码

核心就是 l.load 方法了,明天研究。


之前的 tls 连接问题解决了,原因是阿里云环境可能做了特殊处理,导致 sdk 连接的时候,因为不是正式证书,直接被 rst 了,无法握手成功。

用户头像

关注

还未添加个人签名 2018.05.04 加入

还未添加个人简介

评论

发布
暂无评论
长安链学习研究-存储分析wal机制_长安链_李_InfoQ写作社区