code: func (c *Collector) markItem(ctx context.Context, it Item, isRoot bool) error {
  	if !isRoot {
  		marked, err := c.Marker.IsMarked(it)
  		if err != nil {
  			return err
  		}
  		if marked {
  			return nil
  		}
  	}
  	if err := c.Marker.Mark(it); err != nil {
  		return err
  	}
  
  	// FIXME(tgulacsi): is it a problem that we cannot cancel the parent?
  	ctx, cancel := context.WithCancel(ctx)
  	ch := make(chan Item, buffered)
  	var grp syncutil.Group
  	grp.Go(func() error {
  		return c.ItemEnumerator.EnumerateItem(ctx, it, ch)
  	})
  	grp.Go(func() error {
  		for it := range ch {
  			if err := c.markItem(ctx, it, false); err != nil {
  				return err
  			}
  		}
  		return nil
  	})
  	if err := grp.Err(); err != nil {
  		cancel()
  		return err
  	}
  	return nil
  }
docs: // ctx will be canceled on failure