diff --git a/internal/consistency/diff/table_diff.go b/internal/consistency/diff/table_diff.go index d5a3d77..7fd9e28 100644 --- a/internal/consistency/diff/table_diff.go +++ b/internal/consistency/diff/table_diff.go @@ -873,7 +873,6 @@ func (t *TableDiffTask) RunChecks(skipValidation bool) (err error) { if err != nil { return fmt.Errorf("failed to connect to node %s: %w", hostname, err) } - defer conn.Close() currCols, err := queries.GetColumns(t.Ctx, conn, schema, table) if err != nil { @@ -930,6 +929,8 @@ func (t *TableDiffTask) RunChecks(skipValidation bool) (err error) { if t.TableFilter != "" { logger.Info("Applying table filter for diff: %s", t.TableFilter) } + + conn.Close() } logger.Info("Connections successful to nodes in cluster") @@ -1001,13 +1002,14 @@ func (t *TableDiffTask) cleanupFilteredView() { logger.Warn("table-diff: failed to get connection for filtered view cleanup on node %s: %v", name, err) continue } - defer pool.Close() if _, err := pool.Exec(t.Ctx, dropSQL); err != nil { logger.Warn("table-diff: failed to drop filtered view %s.%s on node %s: %v", t.Schema, t.FilteredViewName, name, err) } else { logger.Info("table-diff: dropped filtered view %s.%s on node %s", t.Schema, t.FilteredViewName, name) } + + pool.Close() } t.FilteredViewCreated = false diff --git a/pkg/common/utils.go b/pkg/common/utils.go index a09d685..8116ab9 100644 --- a/pkg/common/utils.go +++ b/pkg/common/utils.go @@ -1216,15 +1216,22 @@ func WriteDiffReport(diffResult types.DiffOutput, schema, table, format string) ) jsonFileName := outputPrefix + ".json" - jsonData, err := json.MarshalIndent(diffResult, "", " ") + // Stream JSON directly to file — avoids holding a second full copy in memory + f, err := os.Create(jsonFileName) if err != nil { - logger.Error("ERROR marshalling diff output to JSON: %v", err) - return "", "", fmt.Errorf("failed to marshal diffs: %w", err) - } - - if err := os.WriteFile(jsonFileName, jsonData, 0644); err != nil { - logger.Error("ERROR writing diff output to file %s: %v", jsonFileName, err) - return "", "", fmt.Errorf("failed to write diffs file: %w", err) + logger.Error("ERROR creating diff output file %s: %v", jsonFileName, err) + return "", "", fmt.Errorf("failed to create diffs file: %w", err) + } + enc := json.NewEncoder(f) + enc.SetIndent("", " ") + if err := enc.Encode(diffResult); err != nil { + logger.Error("ERROR writing diff output to JSON: %v", err) + f.Close() + return "", "", fmt.Errorf("failed to write diffs: %w", err) + } + if err := f.Close(); err != nil { + logger.Error("ERROR closing diff output file %s: %v", jsonFileName, err) + return "", "", fmt.Errorf("failed to close diffs file: %w", err) } logger.Warn("%s TABLES DO NOT MATCH", CrossMark)