From 66a22245f480c50d278214864d27a5dc99ac3a64 Mon Sep 17 00:00:00 2001 From: hamid ghaf Date: Thu, 31 Mar 2022 22:10:26 +0000 Subject: [PATCH 1/2] backport of commit 4ca1742f10b702265268a936942249f373a544a6 --- helper/fairshare/jobmanager.go | 7 ++++++- physical/raft/raft.go | 7 ++++++- vault/raft.go | 7 ++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/helper/fairshare/jobmanager.go b/helper/fairshare/jobmanager.go index a878d29fc426f..75c7662fc7656 100644 --- a/helper/fairshare/jobmanager.go +++ b/helper/fairshare/jobmanager.go @@ -265,6 +265,10 @@ func (j *JobManager) assignWork() { j.wg.Add(1) go func() { + // ticker is used to prevent memory leak of using time.After in + // for - select pattern. + ticker := time.NewTicker(50 * time.Millisecond) + defer ticker.Stop() for { for { // assign work while there are jobs to distribute @@ -291,13 +295,14 @@ func (j *JobManager) assignWork() { } } + ticker.Reset(50 * time.Millisecond) select { case <-j.quit: j.wg.Done() return case <-j.newWork: // listen for wake-up when an empty job manager has been given work - case <-time.After(50 * time.Millisecond): + case <-ticker.C: // periodically check if new workers can be assigned. with the // fairsharing worker distribution it can be the case that there // is work waiting, but no queues are eligible for another worker diff --git a/physical/raft/raft.go b/physical/raft/raft.go index 3cfbc9ed529f7..410c01835d816 100644 --- a/physical/raft/raft.go +++ b/physical/raft/raft.go @@ -864,11 +864,16 @@ func (b *RaftBackend) SetupCluster(ctx context.Context, opts SetupOpts) error { // StartAsLeader is only set during init, recovery mode, storage migration, // and tests. if opts.StartAsLeader { + // ticker is used to prevent memory leak of using time.After in + // for - select pattern. + ticker := time.NewTicker(10 * time.Millisecond) + defer ticker.Stop() for { if raftObj.State() == raft.Leader { break } + ticker.Reset(10 * time.Millisecond) select { case <-ctx.Done(): future := raftObj.Shutdown() @@ -877,7 +882,7 @@ func (b *RaftBackend) SetupCluster(ctx context.Context, opts SetupOpts) error { } return errors.New("shutdown while waiting for leadership") - case <-time.After(10 * time.Millisecond): + case <-ticker.C: } } } diff --git a/vault/raft.go b/vault/raft.go index 8c5c6ed0c07bb..a22c67cfa0a82 100644 --- a/vault/raft.go +++ b/vault/raft.go @@ -481,6 +481,10 @@ func (c *Core) raftTLSRotatePhased(ctx context.Context, logger hclog.Logger, raf defer keyCheckInterval.Stop() var backoff bool + // ticker is used to prevent memory leak of using time.After in + // for - select pattern. + ticker := time.NewTicker(time.Until(nextRotationTime)) + defer ticker.Stop() for { // If we encountered and error we should try to create the key // again. @@ -489,13 +493,14 @@ func (c *Core) raftTLSRotatePhased(ctx context.Context, logger hclog.Logger, raf backoff = false } + ticker.Reset(time.Until(nextRotationTime)) select { case <-keyCheckInterval.C: err := checkCommitted() if err != nil { logger.Error("failed to activate TLS key", "error", err) } - case <-time.After(time.Until(nextRotationTime)): + case <-ticker.C: // It's time to rotate the keys next, err := rotateKeyring() if err != nil { From cb325e984aeea0964a14e3d8466774939da77e01 Mon Sep 17 00:00:00 2001 From: hamid ghaf Date: Thu, 31 Mar 2022 22:28:08 +0000 Subject: [PATCH 2/2] backport of commit b7067500f381fca0d58af8203eb278050affe552 --- changelog/14814.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelog/14814.txt diff --git a/changelog/14814.txt b/changelog/14814.txt new file mode 100644 index 0000000000000..0583fb7c3086e --- /dev/null +++ b/changelog/14814.txt @@ -0,0 +1,3 @@ +```release-note:bug +core: time.After() used in a select statement can lead to memory leak +```