github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/lsmkv/segment_roaring_set_strategy.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package lsmkv
    13  
    14  import (
    15  	"fmt"
    16  
    17  	"github.com/weaviate/weaviate/adapters/repos/db/lsmkv/segmentindex"
    18  	"github.com/weaviate/weaviate/adapters/repos/db/roaringset"
    19  	"github.com/weaviate/weaviate/entities/lsmkv"
    20  )
    21  
    22  func (s *segment) roaringSetGet(key []byte) (roaringset.BitmapLayer, error) {
    23  	out := roaringset.BitmapLayer{}
    24  
    25  	if s.strategy != segmentindex.StrategyRoaringSet {
    26  		return out, fmt.Errorf("need strategy %s", StrategyRoaringSet)
    27  	}
    28  
    29  	if s.useBloomFilter && !s.bloomFilter.Test(key) {
    30  		return out, lsmkv.NotFound
    31  	}
    32  
    33  	node, err := s.index.Get(key)
    34  	if err != nil {
    35  		return out, err
    36  	}
    37  
    38  	sn, err := s.segmentNodeFromBuffer(nodeOffset{node.Start, node.End})
    39  	if err != nil {
    40  		return out, err
    41  	}
    42  
    43  	// make sure that any data is copied before exiting this method, otherwise we
    44  	// risk a SEGFAULT as described in
    45  	// https://github.com/weaviate/weaviate/issues/1837
    46  	out.Additions = sn.AdditionsWithCopy()
    47  	out.Deletions = sn.DeletionsWithCopy()
    48  	return out, nil
    49  }
    50  
    51  func (s *segment) segmentNodeFromBuffer(offset nodeOffset) (*roaringset.SegmentNode, error) {
    52  	var contents []byte
    53  	if s.mmapContents {
    54  		contents = s.contents[offset.start:offset.end]
    55  	} else {
    56  		contents = make([]byte, offset.end-offset.start)
    57  		r, err := s.bufferedReaderAt(offset.start)
    58  		if err != nil {
    59  			return nil, err
    60  		}
    61  		_, err = r.Read(contents)
    62  		if err != nil {
    63  			return nil, err
    64  		}
    65  	}
    66  
    67  	return roaringset.NewSegmentNodeFromBuffer(contents), nil
    68  }