github.com/pachyderm/pachyderm@v1.13.4/src/server/pkg/storage/track/renewer.go (about) 1 package track 2 3 import ( 4 "context" 5 "fmt" 6 "sync" 7 "time" 8 9 "github.com/pachyderm/pachyderm/src/server/pkg/storage/renew" 10 "github.com/pachyderm/pachyderm/src/server/pkg/uuid" 11 ) 12 13 // TmpTrackerPrefix is the tracker prefix for temporary objects. 14 const TmpTrackerPrefix = "tmp/" 15 16 type tmpDeleter struct{} 17 18 // NewTmpDeleter creates a new temporary deleter. 19 func NewTmpDeleter() Deleter { 20 return &tmpDeleter{} 21 } 22 23 func (*tmpDeleter) Delete(_ context.Context, _ string) error { 24 return nil 25 } 26 27 // Renewer renews a add-only set of objects 28 type Renewer struct { 29 id string 30 tracker Tracker 31 ttl time.Duration 32 r *renew.Renewer 33 34 mu sync.Mutex 35 n int 36 } 37 38 // NewRenewer returns a renewer renewing objects in tracker with ttl 39 func NewRenewer(tracker Tracker, name string, ttl time.Duration) *Renewer { 40 r := &Renewer{ 41 id: TmpTrackerPrefix + name + "-" + uuid.NewWithoutDashes(), 42 tracker: tracker, 43 ttl: ttl, 44 } 45 r.r = renew.NewRenewer(context.Background(), ttl, func(ctx context.Context, ttl time.Duration) error { 46 _, err := r.tracker.SetTTLPrefix(ctx, r.id+"/", ttl) 47 return err 48 }) 49 return r 50 } 51 52 // Add adds an object to the set of objects being renewed. 53 func (r *Renewer) Add(ctx context.Context, id string) error { 54 n := r.nextInt() 55 id2 := fmt.Sprintf("%s/%d", r.id, n) 56 // create an object whos sole purpose is to reference id, and to have a structured name 57 // which can be renewed in bulk by prefix 58 return r.tracker.CreateObject(ctx, id2, []string{id}, r.ttl) 59 } 60 61 // Close stops the background renewal 62 func (r *Renewer) Close() error { 63 return r.r.Close() 64 } 65 66 func (r *Renewer) nextInt() int { 67 r.mu.Lock() 68 defer r.mu.Unlock() 69 n := r.n 70 r.n++ 71 return n 72 }