之前博文中介绍过在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\v2@v2.0.4\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)