func()

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
}