Skip to content

Commit 2e41703

Browse files
committed
fix leaking goroutine
1 parent 033a788 commit 2e41703

File tree

4 files changed

+25
-16
lines changed

4 files changed

+25
-16
lines changed

base/util.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,8 +1870,3 @@ func RotateProfilesIfNeeded(filename string) error {
18701870
}
18711871
return multiErr.ErrorOrNil()
18721872
}
1873-
1874-
// CreateFileInDirectory will create a file in directory specified by filename.
1875-
func CreateFileInDirectory(filename string) (*os.File, error) {
1876-
return os.Create(filename)
1877-
}

rest/server_context.go

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ type ServerContext struct {
9898
DatabaseInitManager *DatabaseInitManager // Manages database initialization (index creation and readiness) independent of database stop/start/reload, when using persistent config
9999
ActiveReplicationsCounter
100100
invalidDatabaseConfigTracking invalidDatabaseConfigs
101+
signalContextFunc context.CancelFunc
101102
// handle sgcollect processes for a given Server
102103
SGCollect *sgCollect
103104
}
@@ -209,7 +210,9 @@ func NewServerContext(ctx context.Context, config *StartupConfig, persistentConf
209210

210211
sc.startStatsLogger(ctx)
211212

212-
sc.registerSignalHandlerForStackTrace(ctx)
213+
signalCtx, cancelFunc := context.WithCancel(ctx)
214+
sc.signalContextFunc = cancelFunc
215+
sc.registerSignalHandlerForStackTrace(signalCtx)
213216

214217
return sc
215218
}
@@ -220,8 +223,14 @@ func (sc *ServerContext) registerSignalHandlerForStackTrace(ctx context.Context)
220223
signalChannel := make(chan os.Signal, 1)
221224
signal.Notify(signalChannel, syscall.SIGUSR1)
222225

226+
defer func() {
227+
signal.Stop(signalChannel)
228+
close(signalChannel)
229+
}()
230+
223231
go func() {
224-
for sig := range signalChannel {
232+
select {
233+
case sig := <-signalChannel:
225234
base.InfofCtx(ctx, base.KeyAll, "Handling signal: %v", sig)
226235
switch sig {
227236
case syscall.SIGUSR1:
@@ -232,6 +241,8 @@ func (sc *ServerContext) registerSignalHandlerForStackTrace(ctx context.Context)
232241
default:
233242
// unhandled signal here
234243
}
244+
case <-ctx.Done():
245+
return
235246
}
236247
}()
237248
}
@@ -304,6 +315,9 @@ func (sc *ServerContext) Close(ctx context.Context) {
304315
base.InfofCtx(ctx, base.KeyAll, "Couldn't stop background config update worker: %v", err)
305316
}
306317

318+
// cancel any signal handlers
319+
sc.signalContextFunc()
320+
307321
sc.lock.Lock()
308322
defer sc.lock.Unlock()
309323

@@ -1882,26 +1896,26 @@ func (sc *ServerContext) logStackTraces(ctx context.Context, timestamp string) {
18821896
_, _ = fmt.Fprintf(os.Stderr, "Stack trace:\n%s\n", stackTrace)
18831897

18841898
filename := filepath.Join(sc.Config.Logging.LogFilePath, stackFilePrefix+timestamp+".log")
1885-
file, err := base.CreateFileInDirectory(filename)
1899+
file, err := os.Create(filename)
18861900
defer func() {
1887-
err = file.Close()
1888-
if err != nil {
1889-
base.WarnfCtx(ctx, "Error closing stack trace file %s: %v", filename, err)
1901+
closeErr := file.Close()
1902+
if closeErr != nil {
1903+
base.WarnfCtx(ctx, "Error closing stack trace file %s: %v", filename, closeErr)
18901904
}
18911905
}()
18921906
if err != nil {
1893-
base.DebugfCtx(ctx, base.KeyAll, "Error opening stack trace file %s: %v", filename, err)
1907+
base.WarnfCtx(ctx, "Error opening stack trace file %s: %v", filename, err)
18941908
}
18951909

18961910
_, err = file.WriteString(fmt.Sprintf("Stack trace:\n%s\n", stackTrace))
18971911
if err != nil {
1898-
base.DebugfCtx(ctx, base.KeyAll, "Error writing stack trace to file %s: %v", filename, err)
1912+
base.WarnfCtx(ctx, "Error writing stack trace to file %s: %v", filename, err)
18991913
}
19001914

19011915
rotatePath := filepath.Join(sc.Config.Logging.LogFilePath, stackFilePrefix+"*.log")
19021916
err = base.RotateProfilesIfNeeded(rotatePath)
19031917
if err != nil {
1904-
base.DebugfCtx(ctx, base.KeyAll, "Error rotating stack trace files in path %s: %v", rotatePath, err)
1918+
base.WarnfCtx(ctx, "Error rotating stack trace files in path %s: %v", rotatePath, err)
19051919
}
19061920
}
19071921

rest/server_context_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,7 @@ func TestCollectStackTraceFile(t *testing.T) {
10771077
timeStamp := "01"
10781078
serverContext.logStackTraces(ctx, timeStamp)
10791079
require.Len(t, getFilenames(t, tempPath), 1)
1080-
slices.Contains(getFilenames(t, tempPath), stackFilePrefix+timeStamp+".log")
1080+
assert.True(t, slices.Contains(getFilenames(t, tempPath), stackFilePrefix+timeStamp+".log"))
10811081

10821082
// trigger rotation and assert we don't go above 10 files
10831083
expectedFiles := make([]string, 0, 10)

rest/stats_context.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ func (statsContext *statsContext) collectMemoryProfile(ctx context.Context, outp
392392

393393
memoryProfile := pprof.Lookup("heap")
394394
filename := filepath.Join(outputDir, pprofPrefix+timestamp+".pb.gz")
395-
file, err := base.CreateFileInDirectory(filename)
395+
file, err := os.Create(filename)
396396
defer func() {
397397
err = file.Close()
398398
if err != nil {

0 commit comments

Comments
 (0)