code: func (sto *overlayStorage) EnumerateBlobs(ctx context.Context, dest chan<- blob.SizedRef, after string, limit int) error {
  	defer close(dest)
  
  	enums := []blobserver.BlobEnumerator{sto.lower, sto.upper}
  
  	// Ensure that we send limit blobs if possible.
  	sent := 0
  	for sent < limit {
  		ch := make(chan blob.SizedRef)
  		errch := make(chan error, 1)
  		go func() {
  			errch <- blobserver.MergedEnumerate(ctx, ch, enums, after, limit-sent)
  		}()
  
  		var last blob.Ref
  
  		// Yield all blobs that weren't deleted from ch to destch.
  		seen := 0
  		for sbr := range ch {
  			seen++
  			if !sto.isDeleted(sbr.Ref) {
  				log.Println(sent, sbr.Ref)
  				dest <- sbr
  				sent++
  			}
  			last = sbr.Ref
  		}
  
  		if err := <-errch; err != nil {
  			return err
  		}
  
  		// if no blob was received, enumeration is finished
  		if seen == 0 {
  			return nil
  		}
  
  		// resume enumeration after the last blob seen
  		after = last.String()
  	}
  
  	return nil
  }
docs: // EnumerateBlobs enumerates blobs of the lower and upper layers.