This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git
The following commit(s) were added to refs/heads/main by this push: new 3a438a59 Add more test cases and fix some issues found in the tests (#426) 3a438a59 is described below commit 3a438a5940d344684d56f0c56ef905efc35621a7 Author: Gao Hongtao <hanahm...@gmail.com> AuthorDate: Wed Apr 3 15:37:49 2024 +0800 Add more test cases and fix some issues found in the tests (#426) --- banyand/measure/block.go | 5 ++- banyand/measure/block_metadata.go | 12 +++++- banyand/stream/block.go | 5 ++- banyand/stream/block_metadata.go | 11 ++++- pkg/test/query/trace.go | 79 +++++++++++++++++++++++++++++++++-- test/stress/trace/trace_suite_test.go | 8 ++++ 6 files changed, 110 insertions(+), 10 deletions(-) diff --git a/banyand/measure/block.go b/banyand/measure/block.go index cf3c2eab..b4792d85 100644 --- a/banyand/measure/block.go +++ b/banyand/measure/block.go @@ -610,10 +610,13 @@ func (bc *blockCursor) loadData(tmpBlock *block) bool { } bc.bm.field.columnMetadata = cfm bc.bm.tagProjection = bc.tagProjection - tf := make(map[string]*dataBlock, len(bc.tagProjection)) + var tf map[string]*dataBlock for i := range bc.tagProjection { for tfName, block := range bc.bm.tagFamilies { if bc.tagProjection[i].Family == tfName { + if tf == nil { + tf = make(map[string]*dataBlock, len(bc.tagProjection)) + } tf[tfName] = block } } diff --git a/banyand/measure/block_metadata.go b/banyand/measure/block_metadata.go index 82e44ca1..6a066329 100644 --- a/banyand/measure/block_metadata.go +++ b/banyand/measure/block_metadata.go @@ -176,7 +176,7 @@ func (bm *blockMetadata) unmarshal(src []byte) ([]byte, error) { if err != nil { return nil, fmt.Errorf("cannot unmarshal tagFamily dataBlock: %w", err) } - bm.tagFamilies[convert.BytesToString(nameBytes)] = tf + bm.tagFamilies[string(nameBytes)] = tf } } src, err = bm.field.unmarshal(src) @@ -212,6 +212,13 @@ type blockMetadataArray struct { arr []blockMetadata } +func (bma *blockMetadataArray) reset() { + for i := range bma.arr { + bma.arr[i].reset() + } + bma.arr = bma.arr[:0] +} + var blockMetadataArrayPool sync.Pool func generateBlockMetadataArray() *blockMetadataArray { @@ -223,7 +230,7 @@ func generateBlockMetadataArray() *blockMetadataArray { } func releaseBlockMetadataArray(bma *blockMetadataArray) { - bma.arr = bma.arr[:0] + bma.reset() blockMetadataArrayPool.Put(bma) } @@ -279,6 +286,7 @@ func unmarshalBlockMetadata(dst []blockMetadata, src []byte) ([]blockMetadata, e dst = append(dst, blockMetadata{}) } bm := &dst[len(dst)-1] + bm.reset() tail, err := bm.unmarshal(src) if err != nil { return dstOrig, fmt.Errorf("cannot unmarshal blockMetadata entries: %w", err) diff --git a/banyand/stream/block.go b/banyand/stream/block.go index e8f63200..63342b11 100644 --- a/banyand/stream/block.go +++ b/banyand/stream/block.go @@ -529,10 +529,13 @@ func (bc *blockCursor) copyTo(r *pbv1.StreamResult) { func (bc *blockCursor) loadData(tmpBlock *block) bool { tmpBlock.reset() bc.bm.tagProjection = bc.tagProjection - tf := make(map[string]*dataBlock, len(bc.tagProjection)) + var tf map[string]*dataBlock for i := range bc.tagProjection { for tfName, block := range bc.bm.tagFamilies { if bc.tagProjection[i].Family == tfName { + if tf == nil { + tf = make(map[string]*dataBlock, len(bc.tagProjection)) + } tf[tfName] = block } } diff --git a/banyand/stream/block_metadata.go b/banyand/stream/block_metadata.go index 8c8e2771..3906f603 100644 --- a/banyand/stream/block_metadata.go +++ b/banyand/stream/block_metadata.go @@ -181,7 +181,7 @@ func (bm *blockMetadata) unmarshal(src []byte) ([]byte, error) { if err != nil { return nil, fmt.Errorf("cannot unmarshal tagFamily dataBlock: %w", err) } - bm.tagFamilies[convert.BytesToString(nameBytes)] = tf + bm.tagFamilies[string(nameBytes)] = tf } } if err != nil { @@ -216,6 +216,13 @@ type blockMetadataArray struct { arr []blockMetadata } +func (bma *blockMetadataArray) reset() { + for i := range bma.arr { + bma.arr[i].reset() + } + bma.arr = bma.arr[:0] +} + var blockMetadataArrayPool sync.Pool func generateBlockMetadataArray() *blockMetadataArray { @@ -227,7 +234,7 @@ func generateBlockMetadataArray() *blockMetadataArray { } func releaseBlockMetadataArray(bma *blockMetadataArray) { - bma.arr = bma.arr[:0] + bma.reset() blockMetadataArrayPool.Put(bma) } diff --git a/pkg/test/query/trace.go b/pkg/test/query/trace.go index 3c4834f1..18da1bf8 100644 --- a/pkg/test/query/trace.go +++ b/pkg/test/query/trace.go @@ -43,7 +43,51 @@ func TraceListOrderByDuration(basePath string, timeout time.Duration, fs *flag.F close(stopCh) }() collect(basePath, func() ([]float64, error) { - d, err := traceList(api.QueryOrderByDuration, fs) + d, _, err := traceList(api.QueryOrderByDuration, fs) + if err != nil { + return nil, err + } + return []float64{d.Seconds()}, nil + }, 500*time.Millisecond, stopCh) + analyze([]string{"result"}, basePath) +} + +// TraceListOrderByTime verifies the trace list order by time. +func TraceListOrderByTime(basePath string, timeout time.Duration, fs *flag.FlagSet) { + basePath = path.Join(basePath, "trace-time") + err := os.MkdirAll(basePath, 0o755) + if err != nil { + panic(err) + } + stopCh := make(chan struct{}) + go func() { + time.Sleep(timeout) + close(stopCh) + }() + collect(basePath, func() ([]float64, error) { + d, _, err := traceList(api.QueryOrderByStartTime, fs) + if err != nil { + return nil, err + } + return []float64{d.Seconds()}, nil + }, 500*time.Millisecond, stopCh) + analyze([]string{"result"}, basePath) +} + +// TraceByID verifies the trace by ID. +func TraceByID(basePath string, timeout time.Duration, fs *flag.FlagSet) { + basePath = path.Join(basePath, "trace-by-id") + err := os.MkdirAll(basePath, 0o755) + if err != nil { + panic(err) + } + stopCh := make(chan struct{}) + go func() { + time.Sleep(timeout) + close(stopCh) + }() + collect(basePath, func() ([]float64, error) { + d, err := traceByID(api.QueryOrderByDuration, fs) if err != nil { return nil, err } @@ -56,7 +100,7 @@ const ( defaultPageSize = 15 ) -func traceList(order api.QueryOrder, fs *flag.FlagSet) (time.Duration, error) { +func traceList(order api.QueryOrder, fs *flag.FlagSet) (time.Duration, []*api.BasicTrace, error) { ctx := cli.NewContext(cli.NewApp(), fs, nil) duration := api.Duration{ Start: time.Now().Add(-30 * time.Minute).Format(utils.StepFormats[api.StepMinute]), @@ -79,10 +123,37 @@ func traceList(order api.QueryOrder, fs *flag.FlagSet) (time.Duration, error) { result, err := trace.Traces(ctx, condition) elapsed := time.Since(start) if err != nil { - return 0, err + return 0, nil, err } if len(result.Traces) < 1 { + return 0, nil, fmt.Errorf("no result") + } + return elapsed, result.Traces, nil +} + +func traceByID(order api.QueryOrder, fs *flag.FlagSet) (time.Duration, error) { + _, traces, err := traceList(order, fs) + if err != nil { + return 0, err + } + if len(traces) < 1 { return 0, fmt.Errorf("no result") } - return elapsed, nil + start := time.Now() + numTraces := int64(0) + for _, bt := range traces { + for _, id := range bt.TraceIds { + ctx := cli.NewContext(cli.NewApp(), fs, nil) + t, err := trace.Trace(ctx, id) + if err != nil { + return 0, err + } + if len(t.Spans) < 1 { + return 0, fmt.Errorf("no result span") + } + numTraces++ + } + } + elapsed := time.Since(start) + return time.Duration(int64(elapsed) / numTraces), nil } diff --git a/test/stress/trace/trace_suite_test.go b/test/stress/trace/trace_suite_test.go index a749a236..75d7ddf8 100644 --- a/test/stress/trace/trace_suite_test.go +++ b/test/stress/trace/trace_suite_test.go @@ -54,4 +54,12 @@ var _ = Describe("Query", func() { It("TraceListOrderByDuration", func() { query.TraceListOrderByDuration(basePath, timeout, fs) }) + + It("TraceListOrderByTime", func() { + query.TraceListOrderByTime(basePath, timeout, fs) + }) + + It("TraceByID", func() { + query.TraceByID(basePath, timeout, fs) + }) })