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  }