From ec3643dec9d8ac9dda3754b4a0a1bc0dd593d270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ask=20Bj=C3=B8rn=20Hansen?= Date: Sun, 24 May 2026 10:48:23 -0700 Subject: [PATCH] fix(chdb): return error on log_scores row scan failure Previously a per-row scan error was logged and skipped with continue, so a decode failure (e.g. the UInt64->int64 regression) produced a 200 response with partial or empty data and no signal to the client. Fail the request instead so the HTTP handlers return 500. Also check rows.Err() after iteration. --- chdb/logscores.go | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/chdb/logscores.go b/chdb/logscores.go index 7f5069c..b00e8e0 100644 --- a/chdb/logscores.go +++ b/chdb/logscores.go @@ -122,13 +122,19 @@ func (d *ClickHouse) Logscores(ctx context.Context, serverID, monitorID int, sin for rows.Next() { row, err := scanLogScore(rows) if err != nil { - log.Error("could not parse row", "err", err) - continue + // Fail the whole request so the caller returns a 500 rather than + // silently serving partial/empty data. If this turns into frequent + // user-facing errors, we could tolerate a few (or a small + // percentage of) row errors per request when the rest is good data. + log.ErrorContext(ctx, "could not parse row", "err", err) + return nil, fmt.Errorf("could not parse log_scores row: %w", err) } rv = append(rv, row) } - - // log.InfoContext(ctx, "returning data", "rv", rv) + if err := rows.Err(); err != nil { + log.ErrorContext(ctx, "rows error", "err", err) + return nil, fmt.Errorf("database error") + } return rv, nil } @@ -210,11 +216,19 @@ func (d *ClickHouse) LogscoresTimeRange(ctx context.Context, serverID, monitorID for rows.Next() { row, err := scanLogScore(rows) if err != nil { - log.Error("could not parse row", "err", err) - continue + // Fail the whole request so the caller returns a 500 rather than + // silently serving partial/empty data. If this turns into frequent + // user-facing errors, we could tolerate a few (or a small + // percentage of) row errors per request when the rest is good data. + log.ErrorContext(ctx, "could not parse row", "err", err) + return nil, fmt.Errorf("could not parse log_scores row: %w", err) } rv = append(rv, row) } + if err := rows.Err(); err != nil { + log.ErrorContext(ctx, "rows error", "err", err) + return nil, fmt.Errorf("database error") + } log.InfoContext( ctx, "time range query results",