juicefs debug ls看源码

文章详细探讨了在使用go-fuse库和juicefs文件系统时,如何执行目录遍历(ReadDirPlus)的过程,从go-fuse的内部处理到juicefs的meta层与redis交互获取元数据信息。过程中涉及请求处理、错误处理以及与kernel的交互。

断点

 

挂载后,在桶的根目录执行命令行 ls

go-fuse库(server.go)::readRequest->handleRequest(这个时候handler是READDIRPLUS)->

go-fuse库(opcode.go)::doReadDirPlus

juicefs代码(fuse.go)::ReadDirPlus

juicefs代码(vfs.go)::Readdir

juicefs代码(base.go)::Readdir

juicefs代码(redis.go)::doReaddir

go-fuse库(server.go)::readRequest->handleRequest(这个时候handler是RELEASEDIR)->

go-fuse库(opcode.go)::doReleaseDir

juicefs代码(fuse.go)::ReleaseDir

juicefs代码(vfs.go)::Releasedir


--------------------go-fuse库开始--------------------

func (ms *Server) loop(exitIdle bool) {
   defer ms.loops.Done()
exit:
   for {
      req, errNo := ms.readRequest(exitIdle)
      switch errNo {
      case OK:
         if req == nil {
            break exit
         }
      case ENOENT:
         continue
      case ENODEV:
         // unmount
         if ms.opts.Debug {
            log.Printf("received ENODEV (unmount request), thread exiting")
         }
         break exit
      default: // some other error?
         log.Printf("Failed to read from fuse conn: %v", errNo)
         break exit
      }

      if ms.singleReader {
         go ms.handleRequest(req)
      } else {
         ms.handleRequest(req)
      }
   }
}

req, errNo := ms.readRequest(exitIdle)

// Returns a new request, or error. In case exitIdle is given, returns
// nil, OK if we have too many readers already.
func (ms *Server) readRequest(exitIdle bool) (req *request, code Status) {
   req = ms.reqPool.Get().(*request)
   dest := ms.readPool.Get().([]byte)

   ms.reqMu.Lock()
   if ms.reqReaders > ms.maxReaders {
      ms.reqMu.Unlock()
      return nil, OK
   }
   ms.reqReaders++
   ms.reqMu.Unlock()

   var n int
   err := handleEINTR(func() error {
      var err error
      n, err = syscall.Read(ms.mountFd, dest)
      return err
   })
   if err != nil {
      code = ToStatus(err)
      ms.reqPool.Put(req)
      ms.reqMu.Lock()
      ms.reqReaders--
      ms.reqMu.Unlock()
      return nil, code
   }

   if ms.latencies != nil {
      req.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值