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

     1  package fileset
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/pachyderm/pachyderm/src/client/pkg/errors"
     9  	"github.com/pachyderm/pachyderm/src/client/pkg/require"
    10  	"github.com/pachyderm/pachyderm/src/server/pkg/storage/fileset/index"
    11  	"github.com/pachyderm/pachyderm/src/server/pkg/storage/track"
    12  )
    13  
    14  var (
    15  	// ErrPathExists path already exists
    16  	ErrPathExists = errors.Errorf("path already exists")
    17  	// ErrPathNotExists path does not exist
    18  	ErrPathNotExists = errors.Errorf("path does not exist")
    19  	// ErrNoTTLSet no ttl set on path
    20  	ErrNoTTLSet = errors.Errorf("no ttl set on path")
    21  )
    22  
    23  // Store stores filesets. A fileset is a path -> index relationship
    24  // All filesets exist in the same keyspace and can be merged by prefix
    25  type Store interface {
    26  	Set(ctx context.Context, p string, md *Metadata) error
    27  	Get(ctx context.Context, p string) (*Metadata, error)
    28  	Delete(ctx context.Context, p string) error
    29  	Walk(ctx context.Context, prefix string, cb func(string) error) error
    30  }
    31  
    32  // StoreTestSuite is a suite of tests for a Store.
    33  func StoreTestSuite(t *testing.T, newStore func(t testing.TB) Store) {
    34  	ctx := context.Background()
    35  	t.Run("SetGet", func(t *testing.T) {
    36  		x := newStore(t)
    37  		md := &Metadata{}
    38  		require.NoError(t, x.Set(ctx, "test", md))
    39  		actual, err := x.Get(ctx, "test")
    40  		require.NoError(t, err)
    41  		require.Equal(t, md, actual)
    42  	})
    43  	t.Run("Delete", func(t *testing.T) {
    44  		x := newStore(t)
    45  		require.NoError(t, x.Delete(ctx, "keys that don't exist should not cause delete to error"))
    46  		md := &Metadata{}
    47  		require.NoError(t, x.Set(ctx, "test", md))
    48  		require.NoError(t, x.Delete(ctx, "test"))
    49  		_, err := x.Get(ctx, "test")
    50  		require.Equal(t, ErrPathNotExists, err)
    51  	})
    52  	t.Run("Walk", func(t *testing.T) {
    53  		x := newStore(t)
    54  		md := &Metadata{}
    55  		ps := []string{"test/1", "test/2", "test/3"}
    56  		for _, p := range ps {
    57  			require.NoError(t, x.Set(ctx, p, md))
    58  		}
    59  		require.NoError(t, x.Walk(ctx, "test", func(p string) error {
    60  			require.Equal(t, ps[0], p)
    61  			ps = ps[1:]
    62  			return nil
    63  		}))
    64  		require.Equal(t, 0, len(ps))
    65  	})
    66  }
    67  
    68  func copyPath(ctx context.Context, src, dst Store, srcPath, dstPath string, tracker track.Tracker, ttl time.Duration) error {
    69  	md, err := src.Get(ctx, srcPath)
    70  	if err != nil {
    71  		return err
    72  	}
    73  	if err := createTrackerObject(ctx, dstPath, []*index.Index{md.Additive, md.Deletive}, tracker, ttl); err != nil {
    74  		return err
    75  	}
    76  	return dst.Set(ctx, dstPath, md)
    77  }