code: func (s *fsCacheStore) GC() error {
  	s.mu.Lock()
  	defer s.mu.Unlock()
  	var size uint64
  
  	ctx := context.Background()
  	cutoff := time.Now().Add(-s.gcPolicy.MaxKeepDuration)
  	var blacklist []*cachedSource
  
  	for id, snap := range s.sources {
  		if len(snap.refs) == 0 {
  			if cutoff.After(snap.CachePolicy.LastUsed) {
  				if err := s.delete(id); err != nil {
  					return errors.Wrapf(err, "failed to delete %s", id)
  				}
  			} else {
  				ss, err := snap.getSize(ctx)
  				if err != nil {
  					return err
  				}
  				size += uint64(ss)
  				blacklist = append(blacklist, snap)
  			}
  		}
  	}
  
  	sort.Sort(sortableCacheSources(blacklist))
  	for _, snap := range blacklist {
  		if size <= s.gcPolicy.MaxSize {
  			break
  		}
  		ss, err := snap.getSize(ctx)
  		if err != nil {
  			return err
  		}
  		if err := s.delete(snap.id); err != nil {
  			return errors.Wrapf(err, "failed to delete %s", snap.id)
  		}
  		size -= uint64(ss)
  	}
  	return nil
  }
docs: // GC runs a garbage collector on FSCache