in origin/blobserver/server.go [721:761]
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 {
// 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.
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 {
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)
}
return true, nil
}
return false, nil
}