// ctx will be canceled on failure 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 } 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 { ctx.Cancel() return err } return nil }