in internal/fs/inode/dir.go [536:613]
func (d *dirInode) LookUpChild(ctx context.Context, name string) (*Core, error) {
// Is this a conflict marker name?
if strings.HasSuffix(name, ConflictingFileNameSuffix) {
return d.lookUpConflicting(ctx, name)
}
group, ctx := errgroup.WithContext(ctx)
var fileResult *Core
var dirResult *Core
lookUpFile := func() (err error) {
fileResult, err = findExplicitInode(ctx, d.Bucket(), NewFileName(d.Name(), name))
return
}
lookUpExplicitDir := func() (err error) {
dirResult, err = findExplicitInode(ctx, d.Bucket(), NewDirName(d.Name(), name))
return
}
lookUpImplicitOrExplicitDir := func() (err error) {
dirResult, err = findDirInode(ctx, d.Bucket(), NewDirName(d.Name(), name))
return
}
lookUpHNSDir := func() (err error) {
dirResult, err = findExplicitFolder(ctx, d.Bucket(), NewDirName(d.Name(), name))
return
}
cachedType := d.cache.Get(d.cacheClock.Now(), name)
switch cachedType {
case metadata.ImplicitDirType:
dirResult = &Core{
Bucket: d.Bucket(),
FullName: NewDirName(d.Name(), name),
MinObject: nil,
}
case metadata.ExplicitDirType:
if d.isBucketHierarchical() {
group.Go(lookUpHNSDir)
} else {
group.Go(lookUpExplicitDir)
}
case metadata.RegularFileType, metadata.SymlinkType:
group.Go(lookUpFile)
case metadata.NonexistentType:
return nil, nil
case metadata.UnknownType:
group.Go(lookUpFile)
if d.isBucketHierarchical() {
group.Go(lookUpHNSDir)
} else {
if d.implicitDirs {
group.Go(lookUpImplicitOrExplicitDir)
} else {
group.Go(lookUpExplicitDir)
}
}
}
if err := group.Wait(); err != nil {
return nil, err
}
var result *Core
if dirResult != nil {
result = dirResult
} else if fileResult != nil {
result = fileResult
}
if result != nil {
d.cache.Insert(d.cacheClock.Now(), name, result.Type())
} else if d.enableNonexistentTypeCache && cachedType == metadata.UnknownType {
d.cache.Insert(d.cacheClock.Now(), name, metadata.NonexistentType)
}
return result, nil
}