]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Move the Related doc counter to prevent a race
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 1 Mar 2023 13:59:08 +0000 (14:59 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 1 Mar 2023 15:28:43 +0000 (16:28 +0100)
Closes #10768

related/inverted_index.go

index 967855133dc8eb50cc8207f73443a53238f1fc87..ae894e5220dc17b33494dc58bdeb6435d9792293 100644 (file)
@@ -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 {