github.com/pachyderm/pachyderm@v1.13.4/src/server/pkg/storage/fileset/index_resolver.go (about)

     1  package fileset
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/pachyderm/pachyderm/src/client/pkg/errors"
     7  	"github.com/pachyderm/pachyderm/src/server/pkg/storage/fileset/index"
     8  )
     9  
    10  // NewIndexResolver creates a file set that resolves index entries.
    11  func (s *Storage) NewIndexResolver(fs FileSet) FileSet {
    12  	return &indexResolver{
    13  		s:  s,
    14  		fs: fs,
    15  	}
    16  }
    17  
    18  type indexResolver struct {
    19  	s  *Storage
    20  	fs FileSet
    21  }
    22  
    23  func (ir *indexResolver) Iterate(ctx context.Context, cb func(File) error, _ ...bool) error {
    24  	iter := NewIterator(ctx, ir.fs)
    25  	w := ir.s.newWriter(ctx, "", WithNoUpload(), WithIndexCallback(func(idx *index.Index) error {
    26  		f, err := iter.Next()
    27  		if err != nil {
    28  			return err
    29  		}
    30  		if f.Index().Path != idx.Path {
    31  			return errors.Errorf("index resolver paths out of sync")
    32  		}
    33  		return cb(newFileReader(ctx, ir.s.ChunkStorage(), idx))
    34  	}))
    35  	if err := CopyFiles(ctx, w, ir.fs); err != nil {
    36  		return err
    37  	}
    38  	return w.Close()
    39  }