首页 > 编程语言 >juicefs debug mount启动看源码

juicefs debug mount启动看源码

时间:2023-02-11 17:14:35浏览次数:43  
标签:name err format go prometheus 源码 debug juicefs registerer

main.go里面importcmd包和utils包
通过多个init()函数首先注册各种元数据组件
下面以redis为例

func init() {
Register("redis", newRedisMeta)
Register("rediss", newRedisMeta)
Register("unix", newRedisMeta)
}

然后进入main函数
err := app.Run(reorderOptions(app, args))
这里就会去调用juicefs/cmd/mount.go

解析参数
如果是windows,就开启CaseInsensi

创建metaCli客户端

通过metaCli load format
{
"Name": "myjuicefs",
"UUID": "2b645fb0-12f3-479b-bdc9-7c6978e7e124",
"Storage": "s3",
"Bucket": "http://127.0.0.1:9000/bkjuicifs",
"AccessKey": "minioadmin",
"SecretKey": "rihchqP4C/YS/hkR1xQ2pIiHkogIk28TO4RIvYChXgcOcBlouK4=",
"BlockSize": 4096,
"Compression": "none",
"EncryptAlgo": "aes256gcm-rsa",
"KeyEncrypted": true,
"TrashDays": 1,
"MetaVersion": 1
}

Wrap the default registry, all prometheus.MustRegister() calls should be afterwards

registerer, registry := wrapRegister(mp, format.Name)

func wrapRegister(mp, name string) (prometheus.Registerer, *prometheus.Registry) {
registry := prometheus.NewRegistry() // replace default so only JuiceFS metrics are exposed
registerer := prometheus.WrapRegistererWithPrefix("juicefs_",
prometheus.WrapRegistererWith(prometheus.Labels{"mp": mp, "vol_name": name}, registry))
registerer.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))
registerer.MustRegister(collectors.NewGoCollector())
return registerer, registry
}

blob, err := NewReloadableStorage(format, metaCli, updateFormat(c))
-------------------------------------NewReloadableStorage开始-------------------------------------
blob, err := createStorage(*format)

blob, err = object.CreateStorage(strings.ToLower(format.Storage), format.Bucket, format.AccessKey, format.SecretKey, format.SessionToken)

func CreateStorage(name, endpoint, accessKey, secretKey, token string) (ObjectStorage, error) {
f, ok := storages[name]
if ok {
logger.Debugf("Creating %s storage at endpoint %s", name, endpoint)
return f(endpoint, accessKey, secretKey, token)
}
return nil, fmt.Errorf("invalid storage: %s", name)
}

这里是S3,其实会调用 pkg/object/s3.go里面的newS3,创建s3client

-------------------------------------NewReloadableStorage结束-------------------------------------

-------------------------------------接续进入mount.go------------------------------------
获取存储层chunkConf

chunkConf := getChunkConf(c, format)
store := chunk.NewCachedStore(blob, *chunkConf, registerer)

vfsConf := getVfsConf(c, metaConf, format, chunkConf)
ignore := prepareMp(vfsConf, mp)

if c.Bool("background") && os.Getenv("JFS_FOREGROUND") == "" {
daemonRun(c, addr, vfsConf, metaCli)
} else {
go checkMountpoint(vfsConf.Format.Name, mp, c.String("log"), false)
}

removePassword(addr)
err = metaCli.NewSession()

func (m *baseMeta) NewSession() error {
.......
if !m.conf.NoBGJob {
go m.cleanupDeletedFiles()
go m.cleanupSlices()
go m.cleanupTrash()
}
return nil
}

installHandler(mp)

v := vfs.NewVFS(vfsConf, metaCli, store, registerer, registry)

initBackgroundTasks(c, vfsConf, metaConf, metaCli, blob, registerer, registry)
主要是开启统计、备份元数据到对象存储和发送使用情况到juicefs官方(就是上报自己使用情况)ReportUsage
if !c.Bool("no-usage-report") {
go usage.ReportUsage(m, version.Version())
}

mount_main(v, c)

主要部分
err := fuse.Serve(v, c.String("o"), c.Bool("enable-xattr"), c.Bool("enable-ioctl"))
fssrv, err := fuse.NewServer(imp, conf.Meta.MountPoint, &opt)

至此系统正式启动。

标签:name,err,format,go,prometheus,源码,debug,juicefs,registerer
From: https://www.cnblogs.com/wade03/p/17112074.html

相关文章

  • juicefs debug echo看源码
    断点挂载后,在桶的根目录执行命令行echo"11111">/mnt/s3/333.txtgo-fuse库(server.go)::readRequest->handleRequest(这个时候handler是CREATE)->go-fuse库(opcode.......
  • juicefs debug ls看源码
    断点挂载后,在桶的根目录执行命令行lsgo-fuse库(server.go)::readRequest->handleRequest(这个时候handler是READDIRPLUS)->go-fuse库(opcode.go)::doReadDirPlusjuic......
  • linux源码解析06–常用内存分配函数kmalloc、vmalloc、malloc和mmap实现原理
    1.kmalloc函数static__always_inlinevoid*kmalloc(size_tsize,gfp_tflags){ if(__builtin_constant_p(size)){#ifndefCONFIG_SLOB unsignedintindex;#end......
  • 【SpringMVC源码三千问】DispatcherServlet源码解析
    DispatcherServlet#doDispatch()是SpringMVC处理请求分发的方法,只要是springmvc处理的http请求,都会经过DispatcherServlet的请求分发处理,从而调用相应的handler......
  • Cesium源码阅读环境搭建
    1.引言Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业......
  • pywebio put_file 相关源码源代码
      https://www.npmjs.com/package/file-saver用的这个包 saveAs函数 send_messagehandle_messagedispatch_message ......
  • ubuntu软件以源码编译安装软件原理
    一.关于软件包​在linux中安装软件是需要安装包的,软件的安装包有各种类型:.zip,.rar,.rpm,.tar.gz,.tar。软件包还可以分为源代码包和二进制包,源代码包是没有经过编译的包,需......
  • ubuntu系统以源码方式安装gcc
    使用源码安装软件的三个步骤:配置(configure)、编译(make)与安装(makeinstall),如下图所示。(其中configure、Makefile.in一般由项目管理器自动生成的,GCC编译器需要安装。) 首先......
  • 在Ubuntu 20.04中使用源码方式安装python3.8
    在ubuntu上安装Python有两种方法:在线安装和源码编译安装。方法1:使用apt在线安装1.更新软件包列表并安装必备组件:$sudoaptupdate$sudoaptinstallsoftware-prop......
  • drf,drf-jwt源码,自定义用户表签发和认证,simpleui的使用,权限控制(acl,rbac)
    内容回顾接口文档的编写word,md编写》存放位置:存放共享文件平台,git上,总之就是可以让其他人能访问到第三方的接口文档编写平台公司自己开发,使用开源搭建,Yapi自动生成接......