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 }