From 8c3ecc5292fed204f90dbd174fc36e7b72245149 Mon Sep 17 00:00:00 2001 From: Roshan Date: Thu, 26 Mar 2026 15:02:45 +0000 Subject: [PATCH] [jaegermcp] Fix searchDepth clamped to zero when maxResults is unlimited When MaxSearchResults is 0 (unlimited), the searchDepth clamp `if searchDepth > h.maxResults` evaluates as `10 > 0 == true` and sets searchDepth to 0. This causes the storage query to return no results even though the config intends no limit. Guard the clamp with `h.maxResults > 0` so that an unlimited config preserves the requested or default search depth. Found while reviewing #8242. Signed-off-by: Roshan Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Roshan --- .../internal/handlers/search_traces.go | 2 +- .../internal/handlers/search_traces_test.go | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/cmd/jaeger/internal/extension/jaegermcp/internal/handlers/search_traces.go b/cmd/jaeger/internal/extension/jaegermcp/internal/handlers/search_traces.go index fca9d883867..3d2ae7ca226 100644 --- a/cmd/jaeger/internal/extension/jaegermcp/internal/handlers/search_traces.go +++ b/cmd/jaeger/internal/extension/jaegermcp/internal/handlers/search_traces.go @@ -147,7 +147,7 @@ func (h *searchTracesHandler) buildQuery(input types.SearchTracesInput) (querysv if searchDepth <= 0 { searchDepth = defaultSearchDepth } - if searchDepth > h.maxResults { + if h.maxResults > 0 && searchDepth > h.maxResults { searchDepth = h.maxResults } diff --git a/cmd/jaeger/internal/extension/jaegermcp/internal/handlers/search_traces_test.go b/cmd/jaeger/internal/extension/jaegermcp/internal/handlers/search_traces_test.go index eb4c3059b70..dfbf5b135c3 100644 --- a/cmd/jaeger/internal/extension/jaegermcp/internal/handlers/search_traces_test.go +++ b/cmd/jaeger/internal/extension/jaegermcp/internal/handlers/search_traces_test.go @@ -513,3 +513,28 @@ func TestSearchTracesHandler_Handle_LimitEnforced(t *testing.T) { // Returned traces are capped at exactly the limit (5 traces, limit=3 → exactly 3 traces) assert.Len(t, output.Traces, 3) } + +func TestSearchTracesHandler_Handle_SearchDepthNotClampedWhenUnlimited(t *testing.T) { + testTrace := createTestTrace("trace001", "svc", "/a", false) + + mock := &mockQueryService{ + findTracesFunc: func(_ context.Context, query querysvc.TraceQueryParams) iter.Seq2[[]ptrace.Traces, error] { + // When maxResults=0 (unlimited), searchDepth must not be clamped to 0 + assert.Equal(t, 50, query.SearchDepth) + return func(yield func([]ptrace.Traces, error) bool) { + yield([]ptrace.Traces{testTrace}, nil) + } + }, + } + + handler := &searchTracesHandler{queryService: mock, maxResults: 0} + + input := types.SearchTracesInput{ + StartTimeMin: "-1h", + ServiceName: "svc", + SearchDepth: 50, + } + + _, _, err := handler.handle(context.Background(), &mcp.CallToolRequest{}, input) + require.NoError(t, err) +}