You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ha...@apache.org on 2024/04/24 07:58:13 UTC
(skywalking-banyandb) 03/05: Won't store term in the index
This is an automated email from the ASF dual-hosted git repository.
hanahmily pushed a commit to branch stream-load
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git
commit cfad43a5bb597d7d5195a123614595e6b534ab3c
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Mon Apr 22 06:32:12 2024 +0000
Won't store term in the index
Signed-off-by: Gao Hongtao <ha...@gmail.com>
---
banyand/internal/storage/index.go | 17 ++--
banyand/stream/iter.go | 69 ++++++---------
banyand/stream/write.go | 10 +--
pkg/index/index.go | 12 +--
pkg/index/inverted/inverted.go | 127 +++++++--------------------
pkg/index/inverted/sort.go | 24 +++--
pkg/index/testcases/duration.go | 39 ++------
test/docker/base-compose.yml | 10 +--
test/stress/trace/docker-compose-single.yaml | 16 ++--
9 files changed, 104 insertions(+), 220 deletions(-)
diff --git a/banyand/internal/storage/index.go b/banyand/internal/storage/index.go
index af7eaed4..acb4086b 100644
--- a/banyand/internal/storage/index.go
+++ b/banyand/internal/storage/index.go
@@ -198,14 +198,11 @@ func (s *seriesIndex) Search(ctx context.Context, series *pbv1.Series, filter in
var sortedSeriesList pbv1.SeriesList
for iter.Next() {
- pv := iter.Val().Value
- if err = pv.Intersect(pl); err != nil {
- return nil, err
- }
- if pv.IsEmpty() {
+ seriesID := iter.Val()
+ if !pl.Contains(seriesID) {
continue
}
- sortedSeriesList = appendSeriesList(sortedSeriesList, seriesList, pv)
+ sortedSeriesList = appendSeriesList(sortedSeriesList, seriesList, common.SeriesID(seriesID))
if err != nil {
return nil, err
}
@@ -223,12 +220,12 @@ func filterSeriesList(seriesList pbv1.SeriesList, filter posting.List) pbv1.Seri
return seriesList
}
-func appendSeriesList(dest, src pbv1.SeriesList, filter posting.List) pbv1.SeriesList {
+func appendSeriesList(dest, src pbv1.SeriesList, target common.SeriesID) pbv1.SeriesList {
for i := 0; i < len(src); i++ {
- if !filter.Contains(uint64(src[i].ID)) {
- continue
+ if target == src[i].ID {
+ dest = append(dest, src[i])
+ break
}
- dest = append(dest, src[i])
}
return dest
}
diff --git a/banyand/stream/iter.go b/banyand/stream/iter.go
index 5f9abb80..94be97f2 100644
--- a/banyand/stream/iter.go
+++ b/banyand/stream/iter.go
@@ -25,14 +25,12 @@ import (
"github.com/apache/skywalking-banyandb/api/common"
"github.com/apache/skywalking-banyandb/pkg/index"
- "github.com/apache/skywalking-banyandb/pkg/index/posting"
"github.com/apache/skywalking-banyandb/pkg/logger"
pbv1 "github.com/apache/skywalking-banyandb/pkg/pb/v1"
)
type searcherIterator struct {
fieldIterator index.FieldIterator
- cur posting.Iterator
err error
indexFilter filterFn
timeFilter filterFn
@@ -64,46 +62,37 @@ func (s *searcherIterator) Next() bool {
if s.err != nil {
return false
}
- if s.cur == nil {
- if s.fieldIterator.Next() {
- v := s.fieldIterator.Val()
- s.cur = v.Value.Iterator()
- } else {
- s.err = io.EOF
- return false
- }
+ if !s.fieldIterator.Next() {
+ s.err = io.EOF
+ return false
+ }
+ itemID := s.fieldIterator.Val()
+ if !s.timeFilter(itemID) {
+ return s.Next()
+ }
+ if s.indexFilter != nil && !s.indexFilter(itemID) {
+ return s.Next()
+ }
+ if e := s.l.Debug(); e.Enabled() {
+ e.Uint64("series_id", uint64(s.seriesID)).Uint64("item_id", itemID).Msg("got an item")
+ }
+ e, c, err := s.table.getElement(s.seriesID, int64(itemID), s.tagProjection)
+ if err != nil {
+ s.err = err
+ return false
+ }
+ sv, err := s.sortedTagLocation.getTagValue(e)
+ if err != nil {
+ s.err = err
+ return false
}
- if s.cur.Next() {
- itemID := s.cur.Current()
- if !s.timeFilter(itemID) {
- return s.Next()
- }
- if s.indexFilter != nil && !s.indexFilter(itemID) {
- return s.Next()
- }
- if e := s.l.Debug(); e.Enabled() {
- e.Uint64("series_id", uint64(s.seriesID)).Uint64("item_id", itemID).Msg("got an item")
- }
- e, c, err := s.table.getElement(s.seriesID, int64(itemID), s.tagProjection)
- if err != nil {
- s.err = err
- return false
- }
- sv, err := s.sortedTagLocation.getTagValue(e)
- if err != nil {
- s.err = err
- return false
- }
- s.currItem = item{
- element: e,
- count: c,
- sortedTagValue: sv,
- seriesID: s.seriesID,
- }
- return true
+ s.currItem = item{
+ element: e,
+ count: c,
+ sortedTagValue: sv,
+ seriesID: s.seriesID,
}
- s.cur = nil
- return s.Next()
+ return true
}
func (s *searcherIterator) Val() item {
diff --git a/banyand/stream/write.go b/banyand/stream/write.go
index 5d0533e6..d6070f13 100644
--- a/banyand/stream/write.go
+++ b/banyand/stream/write.go
@@ -222,12 +222,10 @@ func (w *writeCallback) Rev(message bus.Message) (resp bus.Message) {
es := g.tables[j]
es.tsTable.Table().mustAddElements(&es.elements)
if len(es.docs) > 0 {
- go func() {
- index := es.tsTable.Table().Index()
- if err := index.Write(es.docs); err != nil {
- w.l.Error().Err(err).Msg("cannot write element index")
- }
- }()
+ index := es.tsTable.Table().Index()
+ if err := index.Write(es.docs); err != nil {
+ w.l.Error().Err(err).Msg("cannot write element index")
+ }
}
es.tsTable.DecRef()
}
diff --git a/pkg/index/index.go b/pkg/index/index.go
index 739db07b..ac25855c 100644
--- a/pkg/index/index.go
+++ b/pkg/index/index.go
@@ -164,7 +164,7 @@ func (r RangeOpts) Between(value []byte) int {
// FieldIterator allows iterating over a field's posting values.
type FieldIterator interface {
Next() bool
- Val() *PostingValue
+ Val() uint64
Close() error
}
@@ -177,20 +177,14 @@ func (i *dummyIterator) Next() bool {
return false
}
-func (i *dummyIterator) Val() *PostingValue {
- return nil
+func (i *dummyIterator) Val() uint64 {
+ return 0
}
func (i *dummyIterator) Close() error {
return nil
}
-// PostingValue is the collection of a field's values.
-type PostingValue struct {
- Value posting.List
- Term []byte
-}
-
// Document represents a document in a index.
type Document struct {
Fields []Field
diff --git a/pkg/index/inverted/inverted.go b/pkg/index/inverted/inverted.go
index 0ab9e835..93dad96c 100644
--- a/pkg/index/inverted/inverted.go
+++ b/pkg/index/inverted/inverted.go
@@ -37,7 +37,6 @@ import (
databasev1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/database/v1"
modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
- pbytes "github.com/apache/skywalking-banyandb/pkg/bytes"
"github.com/apache/skywalking-banyandb/pkg/convert"
"github.com/apache/skywalking-banyandb/pkg/index"
"github.com/apache/skywalking-banyandb/pkg/index/posting"
@@ -178,7 +177,6 @@ func (s *store) Iterator(fieldKey index.FieldKey, termRange index.RangeOpts, ord
}
fk := fieldKey.MarshalIndexRule()
var query bluge.Query
- shouldDecodeTerm := true
if fieldKey.Analyzer == databasev1.IndexRule_ANALYZER_UNSPECIFIED {
query = bluge.NewTermRangeInclusiveQuery(
index.FieldStr(fieldKey, termRange.Lower),
@@ -188,7 +186,6 @@ func (s *store) Iterator(fieldKey index.FieldKey, termRange index.RangeOpts, ord
).
SetField(fk)
} else {
- shouldDecodeTerm = false
bQuery := bluge.NewBooleanQuery().
AddMust(bluge.NewTermRangeInclusiveQuery(
string(termRange.Lower),
@@ -208,12 +205,10 @@ func (s *store) Iterator(fieldKey index.FieldKey, termRange index.RangeOpts, ord
sortedKey = "-" + sortedKey
}
result := &sortIterator{
- query: query,
- reader: reader,
- sortedKey: sortedKey,
- fk: fk,
- shouldDecodeTerm: shouldDecodeTerm,
- size: preLoadSize,
+ query: query,
+ reader: reader,
+ sortedKey: sortedKey,
+ size: preLoadSize,
}
return result, nil
}
@@ -229,11 +224,9 @@ func (s *store) MatchTerms(field index.Field) (list posting.List, err error) {
}
fk := field.Key.MarshalIndexRule()
var query bluge.Query
- shouldDecodeTerm := true
if field.Key.Analyzer == databasev1.IndexRule_ANALYZER_UNSPECIFIED {
query = bluge.NewTermQuery(string(field.Marshal())).SetField(fk)
} else {
- shouldDecodeTerm = false
bQuery := bluge.NewBooleanQuery().
AddMust(bluge.NewTermQuery(string(field.Term)).SetField(fk))
if field.Key.HasSeriesID() {
@@ -245,13 +238,13 @@ func (s *store) MatchTerms(field index.Field) (list posting.List, err error) {
if err != nil {
return nil, err
}
- iter := newBlugeMatchIterator(documentMatchIterator, fk, shouldDecodeTerm, reader)
+ iter := newBlugeMatchIterator(documentMatchIterator, reader)
defer func() {
err = multierr.Append(err, iter.Close())
}()
list = roaring.NewPostingList()
for iter.Next() {
- err = multierr.Append(err, list.Union(iter.Val().Value))
+ list.Insert(iter.Val())
}
return list, err
}
@@ -278,13 +271,13 @@ func (s *store) Match(fieldKey index.FieldKey, matches []string) (posting.List,
if err != nil {
return nil, err
}
- iter := newBlugeMatchIterator(documentMatchIterator, fk, false, reader)
+ iter := newBlugeMatchIterator(documentMatchIterator, reader)
defer func() {
err = multierr.Append(err, iter.Close())
}()
list := roaring.NewPostingList()
for iter.Next() {
- err = multierr.Append(err, list.Union(iter.Val().Value))
+ list.Insert(iter.Val())
}
return list, err
}
@@ -296,7 +289,7 @@ func (s *store) Range(fieldKey index.FieldKey, opts index.RangeOpts) (list posti
}
list = roaring.NewPostingList()
for iter.Next() {
- err = multierr.Append(err, list.Union(iter.Val().Value))
+ list.Insert(iter.Val())
}
err = multierr.Append(err, iter.Close())
return
@@ -372,10 +365,10 @@ func (s *store) run() {
toAddSeriesIDField := false
for _, f := range d.Fields {
if f.Key.Analyzer == databasev1.IndexRule_ANALYZER_UNSPECIFIED {
- doc.AddField(bluge.NewKeywordFieldBytes(f.Key.MarshalIndexRule(), f.Marshal()).StoreValue().Sortable())
+ doc.AddField(bluge.NewKeywordFieldBytes(f.Key.MarshalIndexRule(), f.Marshal()).Sortable())
} else {
toAddSeriesIDField = true
- doc.AddField(bluge.NewKeywordFieldBytes(f.Key.MarshalIndexRule(), f.Term).StoreValue().Sortable().
+ doc.AddField(bluge.NewKeywordFieldBytes(f.Key.MarshalIndexRule(), f.Term).Sortable().
WithAnalyzer(analyzers[f.Key.Analyzer]))
}
}
@@ -419,113 +412,57 @@ func (s *store) flush() {
}
type blugeMatchIterator struct {
- delegated search.DocumentMatchIterator
- err error
- closer io.Closer
- current *index.PostingValue
- agg *index.PostingValue
- fieldKey string
- shouldDecodeTerm bool
- closed bool
+ delegated search.DocumentMatchIterator
+ err error
+ closer io.Closer
+ docID uint64
}
-func newBlugeMatchIterator(delegated search.DocumentMatchIterator, fieldKey string, shouldDecodeTerm bool, closer io.Closer) blugeMatchIterator {
+func newBlugeMatchIterator(delegated search.DocumentMatchIterator, closer io.Closer) blugeMatchIterator {
return blugeMatchIterator{
- delegated: delegated,
- fieldKey: fieldKey,
- shouldDecodeTerm: shouldDecodeTerm,
- closer: closer,
+ delegated: delegated,
+ closer: closer,
}
}
func (bmi *blugeMatchIterator) Next() bool {
- if bmi.err != nil || bmi.closed {
- return false
- }
- //revive:disable:empty-block
- for bmi.nextTerm() {
- }
- //revive:enable:empty-block
- if bmi.err != nil || bmi.closed {
- return false
- }
- return true
-}
-
-func (bmi *blugeMatchIterator) nextTerm() bool {
var match *search.DocumentMatch
match, bmi.err = bmi.delegated.Next()
if bmi.err != nil {
return false
}
if match == nil {
- if bmi.agg == nil {
- bmi.closed = true
- } else {
- bmi.current = bmi.agg
- bmi.agg = nil
- }
+ bmi.err = io.EOF
return false
}
- i := 0
- var docID uint64
- var term []byte
bmi.err = match.VisitStoredFields(func(field string, value []byte) bool {
if field == docIDField {
if len(value) == 8 {
- docID = convert.BytesToUint64(value)
+ bmi.docID = convert.BytesToUint64(value)
} else if len(value) == 16 {
// value = seriesID(8bytes)+docID(8bytes)
- docID = convert.BytesToUint64(value[8:])
- }
- i++
- }
- if field == bmi.fieldKey {
- v := pbytes.Copy(value)
- if bmi.shouldDecodeTerm {
- term = index.UnmarshalTerm(v)
- } else {
- term = v
+ bmi.docID = convert.BytesToUint64(value[8:])
}
- i++
- }
- return i < 2
- })
- if i != 2 {
- // ignore invalid data
- // TODO: add metric to cumulate ignored docs
- return true
- }
- if bmi.err != nil {
- return false
- }
- if bmi.agg == nil {
- bmi.agg = &index.PostingValue{
- Term: term,
- Value: roaring.NewPostingListWithInitialData(docID),
}
return true
- }
- if bytes.Equal(bmi.agg.Term, term) {
- bmi.agg.Value.Insert(docID)
- return true
- }
- bmi.current = bmi.agg
- bmi.agg = &index.PostingValue{
- Term: term,
- Value: roaring.NewPostingListWithInitialData(docID),
- }
- return false
+ })
+ return bmi.err == nil
}
-func (bmi *blugeMatchIterator) Val() *index.PostingValue {
- return bmi.current
+func (bmi *blugeMatchIterator) Val() uint64 {
+ return bmi.docID
}
func (bmi *blugeMatchIterator) Close() error {
- bmi.closed = true
if bmi.closer == nil {
+ if errors.Is(bmi.err, io.EOF) {
+ return nil
+ }
return bmi.err
}
+ err := bmi.closer.Close()
+ if errors.Is(bmi.err, io.EOF) {
+ return err
+ }
return errors.Join(bmi.err, bmi.closer.Close())
}
diff --git a/pkg/index/inverted/sort.go b/pkg/index/inverted/sort.go
index 12835eca..85e878e1 100644
--- a/pkg/index/inverted/sort.go
+++ b/pkg/index/inverted/sort.go
@@ -25,20 +25,16 @@ import (
"math"
"github.com/blugelabs/bluge"
-
- "github.com/apache/skywalking-banyandb/pkg/index"
)
type sortIterator struct {
- query bluge.Query
- err error
- reader *bluge.Reader
- current *blugeMatchIterator
- sortedKey string
- fk string
- size int
- skipped int
- shouldDecodeTerm bool
+ query bluge.Query
+ err error
+ reader *bluge.Reader
+ current *blugeMatchIterator
+ sortedKey string
+ size int
+ skipped int
}
func (si *sortIterator) Next() bool {
@@ -73,7 +69,7 @@ func (si *sortIterator) loadCurrent() bool {
return false
}
- iter := newBlugeMatchIterator(documentMatchIterator, si.fk, si.shouldDecodeTerm, nil)
+ iter := newBlugeMatchIterator(documentMatchIterator, nil)
si.current = &iter
if si.next() {
return true
@@ -84,13 +80,13 @@ func (si *sortIterator) loadCurrent() bool {
func (si *sortIterator) next() bool {
if si.current.Next() {
- si.skipped += si.current.Val().Value.Len()
+ si.skipped++
return true
}
return false
}
-func (si *sortIterator) Val() *index.PostingValue {
+func (si *sortIterator) Val() uint64 {
return si.current.Val()
}
diff --git a/pkg/index/testcases/duration.go b/pkg/index/testcases/duration.go
index ebbc9d70..9ffdc550 100644
--- a/pkg/index/testcases/duration.go
+++ b/pkg/index/testcases/duration.go
@@ -52,8 +52,7 @@ type args struct {
}
type result struct {
- items []int
- key int
+ items []uint64
}
// RunDuration executes duration related cases.
@@ -301,49 +300,23 @@ func RunDuration(t *testing.T, data map[int]posting.List, store SimpleStore) {
}
}()
is.NotNil(iter)
- got := make([]result, 0)
- var currResult result
+ var got result
for iter.Next() {
- key := int(convert.BytesToInt64(iter.Val().Term))
- if currResult.key != key {
- if currResult.key != 0 {
- got = append(got, currResult)
- currResult = result{}
- }
- currResult.key = key
- }
- currResult.items = append(currResult.items, toArray(iter.Val().Value)...)
- }
- if len(currResult.items) > 0 {
- got = append(got, currResult)
+ got.items = append(got.items, iter.Val())
}
for i := 0; i < 10; i++ {
is.False(iter.Next())
}
- wants := make([]result, 0, len(tt.want))
+ var wants result
for _, w := range tt.want {
- wants = append(wants, result{
- key: w,
- items: toArray(data[w]),
- })
+ pl := data[w]
+ wants.items = append(wants.items, pl.ToSlice()...)
}
tester.Equal(wants, got, tt.name)
})
}
}
-func toArray(list posting.List) []int {
- ints := make([]int, 0, list.Len())
- iter := list.Iterator()
- defer func(iter posting.Iterator) {
- _ = iter.Close()
- }(iter)
- for iter.Next() {
- ints = append(ints, int(iter.Current()))
- }
- return ints
-}
-
// SetUpDuration initializes data for testing duration related cases.
func SetUpDuration(t *assert.Assertions, store index.Writer) map[int]posting.List {
r := map[int]posting.List{
diff --git a/test/docker/base-compose.yml b/test/docker/base-compose.yml
index 0a0d345c..1d1a32eb 100644
--- a/test/docker/base-compose.yml
+++ b/test/docker/base-compose.yml
@@ -20,11 +20,11 @@ services:
- 2121
- 6060
command: standalone
- # healthcheck:
- # test: ["CMD", "./bydbctl", "health", "--config=-", "--addr=http://banyandb:17913"]
- # interval: 30s
- # timeout: 30s
- # retries: 120
+ healthcheck:
+ test: ["CMD", "./bydbctl", "health", "--config=-", "--addr=http://banyandb:17913"]
+ interval: 30s
+ timeout: 30s
+ retries: 120
liaison:
hostname: liaison
diff --git a/test/stress/trace/docker-compose-single.yaml b/test/stress/trace/docker-compose-single.yaml
index dc868d70..e990ad3b 100644
--- a/test/stress/trace/docker-compose-single.yaml
+++ b/test/stress/trace/docker-compose-single.yaml
@@ -37,11 +37,11 @@ services:
- 17913:17913
- 6060:6060
- 2121:2121
- # deploy:
- # resources:
- # limits:
- # cpus: "4"
- # memory: 8G
+ deploy:
+ resources:
+ limits:
+ cpus: "4"
+ memory: 8G
networks:
- test
- monitoring
@@ -63,9 +63,9 @@ services:
- ./log4j2.xml:/skywalking/config/log4j2.xml
networks:
- test
- # depends_on:
- # banyandb:
- # condition: service_healthy
+ depends_on:
+ banyandb:
+ condition: service_healthy
prometheus:
image: prom/prometheus:latest