juicefs源码format命令阅读

之前博文中介绍过在windows下安装GO和vscode windows下安装go环境 和vscode中go扩展+调试

1、获取源码

git clone https://github.com/juicedata/juicefs.git

首先观察代码架构

上图是我已经编译过得代码,可能和刚git下来的有些出入。

2、编译

我是在windows上进行调试,首先需要对juicefs进行编译。编译过程看文档即可。

文档地址:安装 | JuiceFS Document Center

为了方便,将官方文档的windows下编译内容截图过来。

注:WinFsp需要下载安装,如果不安装,编译时会出现找不到头文件的错误。

出现GCC找不到命令的问题时,可以使用推荐的MinGW-w64和Cygwin,我用的MinGW-w64 ,下载安装即可。

3、 调试

format 命令

juicefs format 

--storage minio

--bucket "https://127.0.0.1:9000/mystor"

--access-key minioadmin

--secret-key minioadmin

tikv://127.0.0.1:2379/mystor

mystor

launch.json参数如图

程序入口:juicefs-->main.go

在juicefs-->main.go页面按F5,进入调试页面。

juicefs-->main.go //开始

cmd-->main.go  -->  err := app.Run(reorderOptions(app, args))

其中 reorderOptions()函数是对输入的参数(flag和cmd)进行判断(是否是正确的flag和cmd)并进行排序。返回之后直接进入app.Run()函数中。

 -->app.go c.Run(cCtx) --> command.go c.Action(cCtx)

 -->format.go format m:= meta.NewClient()

meta.NewClient()新建元数据服务的client,主要检查输入元数据相关参数的信息,根据传入的参数去调用具体的元数据服务。

         -->interface.go NewClient()

         -->interface.go f(driver, uri[p+3], conf) //这里跳转到了meta.newKVMeta

         -->tkv.go newKVMeta()   client,err:=newTKVClient(dricer,addr)

         -->tkv_tikv.go newTikvClient()  client, err := txnkv.NewClient(strings.Split(tUrl.Host, ","))

         -->client.go NewClinet()  cfg := config.GetGlobalConfig()

         -->client.go pdClient, err := tikv.NewPDClient(pdAddrs)

                 -->kv.go NewPDClient()  pd.NewClient()

clinet.go是在github.com\tikv\client-go\[email protected]\txnkv\client.go中

        -->client.go     三个函数,主要过程是初始化元数据

uuid := fmt.Sprintf("tikv-%v", pdClient.GetClusterID(context.TODO()))

spkv, err := tikv.NewEtcdSafePointKV(pdAddrs, tlsConfig)

s, err := tikv.NewKVStore(uuid, pdClient, spkv, tikv.NewRPCClient(tikv.WithSecurity(cfg.Security)))

   //creates a txn client with pdAddrs.

         -->tkv.go newKVMeta() m:=&kvMeta

         -->base.go newBaseMeta()

-->format.go  format, err := m.Load(false)

         -->Base.go  --> Load -->m.en.load()

         -->Tkv.go --> doLoad() ([]byte, error)

         -->Tkv.go -->  get(key []byte) ([]byte, error) kvtxn

-->format.go  blob, err := createStorage(*format) 

按提供的对象存储url,创建一个预支交互的client

-->format.go createStorage() //

-->format.go m.Init(format, c.Bool("force")) //创建根目录

-->tkv.go doInit(format *Format, force bool)

猜你喜欢

转载自blog.csdn.net/guaizaiguaizai/article/details/132581808