diff --git a/pkg/sql/crdb_internal.go b/pkg/sql/crdb_internal.go index 0f4f3c364b9d..a2e928837881 100644 --- a/pkg/sql/crdb_internal.go +++ b/pkg/sql/crdb_internal.go @@ -72,6 +72,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/util/stop" "github.com/cockroachdb/cockroach/pkg/util/timeutil" "github.com/cockroachdb/cockroach/pkg/util/tracing" + "github.com/cockroachdb/cockroach/pkg/util/tracing/collector" "github.com/cockroachdb/errors" ) @@ -1286,7 +1287,8 @@ CREATE TABLE crdb_internal.cluster_inflight_traces ( } traceCollector := p.ExecCfg().TraceCollector - for iter := traceCollector.StartIter(ctx, traceID); iter.Valid(); iter.Next() { + var iter *collector.Iterator + for iter, err = traceCollector.StartIter(ctx, traceID); err == nil && iter.Valid(); iter.Next() { nodeID, recording := iter.Value() traceString := recording.String() traceJaegerJSON, err := recording.ToJaegerJSON("", "", fmt.Sprintf("node %d", nodeID)) @@ -1301,6 +1303,12 @@ CREATE TABLE crdb_internal.cluster_inflight_traces ( return false, err } } + if err != nil { + return false, err + } + if iter.Error() != nil { + return false, iter.Error() + } return true, nil }}}, diff --git a/pkg/util/tracing/collector/collector.go b/pkg/util/tracing/collector/collector.go index 10753aa8edd5..a2432ff60ba9 100644 --- a/pkg/util/tracing/collector/collector.go +++ b/pkg/util/tracing/collector/collector.go @@ -87,11 +87,12 @@ type Iterator struct { // StartIter fetches the live nodes in the cluster, and configures the underlying // Iterator that is used to access recorded spans in a streaming fashion. -func (t *TraceCollector) StartIter(ctx context.Context, traceID uint64) *Iterator { +func (t *TraceCollector) StartIter(ctx context.Context, traceID uint64) (*Iterator, error) { tc := &Iterator{ctx: ctx, traceID: traceID, collector: t} - tc.liveNodes, tc.iterErr = nodesFromNodeLiveness(ctx, t.nodeliveness) - if tc.iterErr != nil { - return nil + var err error + tc.liveNodes, err = nodesFromNodeLiveness(ctx, t.nodeliveness) + if err != nil { + return nil, err } // Calling Next() positions the Iterator in a valid state. It will fetch the @@ -99,7 +100,7 @@ func (t *TraceCollector) StartIter(ctx context.Context, traceID uint64) *Iterato // nodes. tc.Next() - return tc + return tc, nil } // Valid returns whether the Iterator is in a valid state to read values from. diff --git a/pkg/util/tracing/collector/collector_test.go b/pkg/util/tracing/collector/collector_test.go index e90b332a008b..55c4af5f7171 100644 --- a/pkg/util/tracing/collector/collector_test.go +++ b/pkg/util/tracing/collector/collector_test.go @@ -133,10 +133,12 @@ func TestTracingCollectorGetSpanRecordings(t *testing.T) { res := make(map[roachpb.NodeID][]tracing.Recording) var iter *collector.Iterator - for iter = traceCollector.StartIter(ctx, traceID); iter.Valid(); iter.Next() { + var err error + for iter, err = traceCollector.StartIter(ctx, traceID); err == nil && iter.Valid(); iter.Next() { nodeID, recording := iter.Value() res[nodeID] = append(res[nodeID], recording) } + require.NoError(t, err) require.NoError(t, iter.Error()) return res }