Skip to content

Commit 723e8e4

Browse files
authored
Merge pull request #1632 from lebauce/fix-interface-metrics-race
traversal: fix race in interface metrics step
2 parents 0c5ec1f + cfc39c2 commit 723e8e4

File tree

8 files changed

+231
-323
lines changed

8 files changed

+231
-323
lines changed

cmd/allinone/allinone.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ var AllInOneCmd = &cobra.Command{
129129

130130
os.Setenv("SKYDIVE_ANALYZERS", fmt.Sprintf("%s:%d", addr, svcAddr.Port))
131131
os.Setenv("SKYDIVE_LOGGING_FILE_PATH", logFile+"-agent"+extension)
132-
132+
133133
agentAttr := &os.ProcAttr{
134134
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
135135
Env: os.Environ(),

graffiti/graph/traversal/traversal.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,9 @@ func (tv *GraphTraversalV) Sort(ctx StepContext, keys ...interface{}) *GraphTrav
885885
sortBy = defaultSortBy
886886
}
887887

888+
tv.GraphTraversal.RLock()
888889
graph.SortNodes(tv.nodes, sortBy, sortOrder)
890+
tv.GraphTraversal.RUnlock()
889891

890892
return tv
891893
}

gremlin/traversal/metrics.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828

2929
const (
3030
defaultAggregatesSliceLength = int64(30000) // 30 seconds
31+
aggregatesMaxSlices = 10000
3132
)
3233

3334
// MetricsTraversalExtension describes a new extension to enhance the topology
@@ -263,6 +264,10 @@ func (m *MetricsTraversalStep) Aggregates(ctx traversal.StepContext, s ...interf
263264
steps++
264265
}
265266

267+
if steps > aggregatesMaxSlices {
268+
return NewMetricsTraversalStepFromError(fmt.Errorf("Aggregates available slices exceeded: %d/%d", steps, aggregatesMaxSlices))
269+
}
270+
266271
aggregated := make([]common.Metric, steps, steps)
267272
for _, metrics := range m.metrics {
268273
aggregateMetrics(metrics, start, last, sliceLength, aggregated)

gremlin/traversal/topology.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,19 @@ func InterfaceMetrics(ctx traversal.StepContext, tv *traversal.GraphTraversalV,
3434
}
3535

3636
startField := key + ".Start"
37-
3837
tv = tv.Dedup(ctx, "ID", startField).Sort(ctx, common.SortAscending, startField)
3938

4039
if tv.Error() != nil {
4140
return NewMetricsTraversalStepFromError(tv.Error())
4241
}
4342

43+
tv.GraphTraversal.RLock()
44+
defer tv.GraphTraversal.RUnlock()
45+
4446
metrics := make(map[string][]common.Metric)
4547
it := ctx.PaginationRange.Iterator()
4648
gslice := tv.GraphTraversal.Graph.GetContext().TimeSlice
4749

48-
tv.GraphTraversal.RLock()
49-
defer tv.GraphTraversal.RUnlock()
50-
5150
nodeloop:
5251
for _, n := range tv.GetNodes() {
5352
if it.Done() {

scripts/ci/run-tests-utils.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ tests_run() {
2626
fi
2727

2828
make test.functionals.batch \
29-
GOFLAGS="$GOFLAGS" VERBOSE=true TAGS="$TAGS" GORACE="history_size=5" TIMEOUT=20m \
29+
GOFLAGS="$GOFLAGS" VERBOSE=true TAGS="$TAGS" GORACE="history_size=7" TIMEOUT=20m \
3030
WITH_HELM="$WITH_HELM" WITH_EBPF="$WITH_EBPF" WITH_K8S="$WITH_K8S" WITH_ISTIO="$WITH_ISTIO" \
3131
ARGS="$ARGS" TEST_PATTERN="$TEST_PATTERN" 2>&1 | tee $LOGFILE
3232
RETCODE=$?

0 commit comments

Comments
 (0)