diff --git a/disco/disco.go b/disco/disco.go index 6ec6641a0..8ad815c28 100644 --- a/disco/disco.go +++ b/disco/disco.go @@ -312,6 +312,8 @@ type inMemSchemator struct { schema Schema } +// NewInMemSchemator instantiates an InMemSchemator +// this allows new holders to have thier own, and not rely on a shared instance func NewInMemSchemator() *inMemSchemator { return &inMemSchemator{ schema: make(Schema), diff --git a/index.go b/index.go index 0901f1a36..0e900cb05 100644 --- a/index.go +++ b/index.go @@ -267,40 +267,42 @@ func (i *Index) openFields(idx *disco.Index) error { eg, ctx := errgroup.WithContext(context.Background()) var mu sync.Mutex - if idx != nil { - fileLoop: - for fname, fld := range idx.Fields { - select { - case <-ctx.Done(): - break fileLoop - default: - var cfm *CreateFieldMessage = &CreateFieldMessage{} - var err error + if idx == nil { + return nil + } +fileLoop: + for fname, fld := range idx.Fields { + select { + case <-ctx.Done(): + break fileLoop + default: + var cfm *CreateFieldMessage = &CreateFieldMessage{} + var err error - // Decode the CreateFieldMessage from the schema data in order to - // get its metadata. - cfm, err = decodeCreateFieldMessage(i.holder.serializer, fld.Data) + // Decode the CreateFieldMessage from the schema data in order to + // get its metadata. + cfm, err = decodeCreateFieldMessage(i.holder.serializer, fld.Data) + if err != nil { + return errors.Wrap(err, "decoding create field message") + } + + indexQueue <- struct{}{} + eg.Go(func() error { + defer func() { + <-indexQueue + }() + i.holder.Logger.Debugf("open field: %s", fname) + + _, err := i.openField(&mu, cfm, fname) if err != nil { - return errors.Wrap(err, "decoding create field message") + return errors.Wrap(err, "opening field") } - indexQueue <- struct{}{} - eg.Go(func() error { - defer func() { - <-indexQueue - }() - i.holder.Logger.Debugf("open field: %s", fname) - - _, err := i.openField(&mu, cfm, fname) - if err != nil { - return errors.Wrap(err, "opening field") - } - - return nil - }) - } + return nil + }) } } + err = eg.Wait() if err != nil { // Close any fields which got opened, since the overall