From 5c317c55e77c4783e089db653983c394742a6c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Wed, 1 Mar 2023 14:59:08 +0100 Subject: [PATCH] Move the Related doc counter to prevent a race Closes #10768 --- related/inverted_index.go | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/related/inverted_index.go b/related/inverted_index.go index 967855133..ae894e522 100644 --- a/related/inverted_index.go +++ b/related/inverted_index.go @@ -143,13 +143,6 @@ type IndexConfig struct { // Will lower case all string values in and queries tothis index. // May get better accurate results, but at a slight performance cost. ToLower bool - - // Counts the number of documents in the index. - numDocs int -} - -func (cfg *IndexConfig) incrNumDocs() { - cfg.numDocs++ } // Document is the interface an indexable document in Hugo must fulfill. @@ -178,6 +171,8 @@ type FragmentProvider interface { type InvertedIndex struct { cfg Config index map[string]map[Keyword][]Document + // Counts the number of documents added to each index. + indexDocCount map[string]int minWeight int maxWeight int @@ -199,7 +194,7 @@ func (idx *InvertedIndex) getIndexCfg(name string) (IndexConfig, bool) { // NewInvertedIndex creates a new InvertedIndex. // Documents to index must be added in Add. func NewInvertedIndex(cfg Config) *InvertedIndex { - idx := &InvertedIndex{index: make(map[string]map[Keyword][]Document), cfg: cfg} + idx := &InvertedIndex{index: make(map[string]map[Keyword][]Document), indexDocCount: make(map[string]int), cfg: cfg} for _, conf := range cfg.Indices { idx.index[conf.Name] = make(map[Keyword][]Document) if conf.Weight < idx.minWeight { @@ -221,7 +216,7 @@ func (idx *InvertedIndex) Add(ctx context.Context, docs ...Document) error { panic("index is finalized") } var err error - for i, config := range idx.cfg.Indices { + for _, config := range idx.cfg.Indices { if config.Weight == 0 { // Disabled continue @@ -251,8 +246,7 @@ func (idx *InvertedIndex) Add(ctx context.Context, docs ...Document) error { } if added { - c := &idx.cfg.Indices[i] - (*c).incrNumDocs() + idx.indexDocCount[config.Name]++ } } } @@ -270,12 +264,12 @@ func (idx *InvertedIndex) Finalize(ctx context.Context) error { continue } setm := idx.index[config.Name] - numDocs := config.numDocs - if numDocs == 0 { + if idx.indexDocCount[config.Name] == 0 { continue } // Remove high cardinality terms. + numDocs := idx.indexDocCount[config.Name] for k, v := range setm { percentageWithKeyword := int(math.Ceil(float64(len(v)) / float64(numDocs) * 100)) if percentageWithKeyword > config.CardinalityThreshold {