From 6f39255fc835fdf11bd09797ea719c983963e018 Mon Sep 17 00:00:00 2001
From: Daniel Moran <danxmoran@gmail.com>
Date: Mon, 13 Sep 2021 14:39:50 -0400
Subject: [PATCH] fix: ensure files are closed before they are deleted or moved
 in `deletetsm` (#22458)

* Close files before deleting parent dir in tests
* Use platform-independent function to rename output
* Close source TSM file before overwriting it
---
 cmd/influxd/inspect/delete_tsm/delete_tsm.go      | 6 +++++-
 cmd/influxd/inspect/delete_tsm/delete_tsm_test.go | 4 +++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/cmd/influxd/inspect/delete_tsm/delete_tsm.go b/cmd/influxd/inspect/delete_tsm/delete_tsm.go
index 9e7ebc6245..314dca6263 100644
--- a/cmd/influxd/inspect/delete_tsm/delete_tsm.go
+++ b/cmd/influxd/inspect/delete_tsm/delete_tsm.go
@@ -7,6 +7,7 @@ import (
 	"time"
 
 	"github.com/influxdata/influxdb/v2/models"
+	"github.com/influxdata/influxdb/v2/pkg/file"
 	"github.com/influxdata/influxdb/v2/tsdb/engine/tsm1"
 	"github.com/spf13/cobra"
 )
@@ -141,9 +142,12 @@ func (a *args) process(cmd *cobra.Command, path string) error {
 	if err := w.Close(); err != nil {
 		return fmt.Errorf("failed to close TSM Writer: %w", err)
 	}
+	if err := r.Close(); err != nil {
+		return fmt.Errorf("failed to close TSM Reader: %w", err)
+	}
 
 	// Replace original file with new file.
-	if err := os.Rename(outputPath, path); err != nil {
+	if err := file.RenameFile(outputPath, path); err != nil {
 		return fmt.Errorf("failed to update TSM file %q: %w", path, err)
 	}
 	if !hasData {
diff --git a/cmd/influxd/inspect/delete_tsm/delete_tsm_test.go b/cmd/influxd/inspect/delete_tsm/delete_tsm_test.go
index f2346169f8..caf7000f14 100644
--- a/cmd/influxd/inspect/delete_tsm/delete_tsm_test.go
+++ b/cmd/influxd/inspect/delete_tsm/delete_tsm_test.go
@@ -164,9 +164,12 @@ func createTSMFile(t *testing.T, params tsmParams) (string, string) {
 		file, err = os.CreateTemp(dir, "*.txt")
 	}
 	require.NoError(t, err)
+	defer file.Close()
 
 	w, err := tsm1.NewTSMWriter(file)
 	require.NoError(t, err)
+	defer w.Close()
+
 	for _, key := range params.keys {
 		values := []tsm1.Value{tsm1.NewValue(0, 1.0)}
 		require.NoError(t, w.Write([]byte(key), values))
@@ -179,7 +182,6 @@ func createTSMFile(t *testing.T, params tsmParams) (string, string) {
 	if params.invalid {
 		require.NoError(t, binary.Write(file, binary.BigEndian, []byte("foobar\n")))
 	}
-	require.NoError(t, w.Close())
 
 	return dir, file.Name()
 }