Skip to content

Commit f065da7

Browse files
bootjpclaude
andcommitted
Fix execTxn to prioritize pipeline-level errors over results
Pipeline-level errors (connection/transport failures) were only checked when results were empty. Now checked first to avoid silently ignoring transport errors when partial results are returned. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1a70ea0 commit f065da7

2 files changed

Lines changed: 8 additions & 6 deletions

File tree

proxy/proxy.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -348,13 +348,14 @@ func (p *ProxyServer) execTxn(conn redcon.Conn, state *proxyConnState) {
348348
cmds = append(cmds, []any{"EXEC"})
349349

350350
results, err := p.dual.Primary().Pipeline(ctx, cmds)
351-
if len(results) > 0 {
351+
if err != nil {
352+
// Pipeline-level error (connection/transport failure) takes precedence.
353+
writeRedisError(conn, err)
354+
} else if len(results) > 0 {
352355
// Write the EXEC result (last command in the pipeline).
353356
lastResult := results[len(results)-1]
354357
resp, rErr := lastResult.Result()
355358
writeResponse(conn, resp, rErr)
356-
} else if err != nil {
357-
writeRedisError(conn, err)
358359
}
359360

360361
// Async replay to secondary (bounded)

proxy/pubsub.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,12 +369,13 @@ func (s *pubsubSession) execTxn() {
369369
results, err := s.proxy.dual.Primary().Pipeline(ctx, cmds)
370370

371371
s.mu.Lock()
372-
if len(results) > 0 {
372+
if err != nil {
373+
// Pipeline-level error (connection/transport failure) takes precedence.
374+
writeRedisError(s.dconn, err)
375+
} else if len(results) > 0 {
373376
lastResult := results[len(results)-1]
374377
resp, rErr := lastResult.Result()
375378
writeResponse(s.dconn, resp, rErr)
376-
} else if err != nil {
377-
writeRedisError(s.dconn, err)
378379
}
379380
_ = s.dconn.Flush()
380381
s.mu.Unlock()

0 commit comments

Comments
 (0)