断点

挂载后,在桶的根目录执行命令行 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.

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

被折叠的 条评论
为什么被折叠?



