in origin/blobserver/server.go [1012:1056]
func (s *Server) maybeDelete(name string, ttl time.Duration) (deleted bool, err error) {
d, err := core.NewSHA256DigestFromHex(name)
if err != nil {
return false, fmt.Errorf("parse digest: %s", err)
}
info, err := s.cas.GetCacheFileStat(name)
if err != nil {
return false, fmt.Errorf("store: %s", err)
}
expired := s.clk.Now().Sub(info.ModTime()) > ttl
owns := stringset.FromSlice(s.hashRing.Locations(d)).Has(s.addr)
if expired || !owns {
log.With("digest", name, "expired", expired, "owns", owns).Debug("Candidate for cleanup")
// Ensure file is backed up properly before deleting.
var pm metadata.Persist
if err := s.cas.GetCacheFileMetadata(name, &pm); err != nil && !os.IsNotExist(err) {
return false, fmt.Errorf("store: %s", err)
}
if pm.Value {
// Note: It is possible that no writeback tasks exist, but the file
// is persisted. We classify this as a leaked file which is safe to
// delete.
log.With("digest", name).Debug("File has persist metadata, executing write-back before cleanup")
tasks, err := s.writeBackManager.Find(writeback.NewNameQuery(name))
if err != nil {
return false, fmt.Errorf("find writeback tasks: %s", err)
}
for _, task := range tasks {
if err := s.writeBackManager.SyncExec(task); err != nil {
log.With("digest", name).Errorf("Failed to execute write-back during cleanup: %s", err)
return false, fmt.Errorf("writeback: %s", err)
}
}
if err := s.cas.DeleteCacheFileMetadata(name, &metadata.Persist{}); err != nil {
return false, fmt.Errorf("delete persist: %s", err)
}
}
if err := s.cas.DeleteCacheFile(name); err != nil {
return false, fmt.Errorf("delete: %s", err)
}
log.With("digest", name, "expired", expired, "owns", owns).Info("Cleaned up blob")
return true, nil
}
return false, nil
}