Skip to content

Commit

Permalink
mongodb: fix goroutine leak on failed server connections (#3538)
Browse files Browse the repository at this point in the history
Signed-off-by: Luis Rascao <[email protected]>
  • Loading branch information
lrascao committed Sep 10, 2024
1 parent 93f19c9 commit 3830b41
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ require (
github.com/xdg-go/scram v1.1.2
go.etcd.io/etcd/client/v3 v3.5.9
go.mongodb.org/mongo-driver v1.12.1
go.uber.org/goleak v1.2.1
go.uber.org/multierr v1.11.0
go.uber.org/ratelimit v0.3.0
golang.org/x/crypto v0.24.0
Expand Down
4 changes: 2 additions & 2 deletions state/mongodb/mongodb.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,12 +139,12 @@ func (m *MongoDB) Init(ctx context.Context, metadata state.Metadata) (err error)
return fmt.Errorf("error in creating mongodb client: %s", err)
}

m.client = client

if err = client.Ping(ctx, nil); err != nil {
return fmt.Errorf("error in connecting to mongodb, host: %s error: %s", m.metadata.Host, err)
}

m.client = client

// get the write concern
wc, err := getWriteConcernObject(m.metadata.Writeconcern)
if err != nil {
Expand Down
34 changes: 34 additions & 0 deletions state/mongodb/mongodb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,20 @@ limitations under the License.
package mongodb

import (
"context"
"encoding/json"
"io"
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.mongodb.org/mongo-driver/bson"
"go.uber.org/goleak"

"github.com/dapr/components-contrib/metadata"
"github.com/dapr/components-contrib/state"
"github.com/dapr/kit/logger"
)

func TestGetMongoDBMetadata(t *testing.T) {
Expand Down Expand Up @@ -289,3 +293,33 @@ func TestGetMongoDBMetadata(t *testing.T) {
assert.Contains(t, data3, targetMap)
})
}

func TestGoroutineLeak(t *testing.T) {
defer goleak.VerifyNone(t)

t.Run("Valid connection", func(t *testing.T) {
properties := map[string]string{
host: "127.0.0.1",
databaseName: "TestDB",
collectionName: "TestCollection",
username: "username",
password: "password",
}
m := state.Metadata{
Base: metadata.Base{
Name: "mongo",
Properties: properties,
},
}

s := NewMongoDB(logger.NewLogger("test"))
// ignore errors on init
_ = s.Init(context.Background(), m)

// close the connection
closer, ok := s.(io.Closer)
require.True(t, ok)
err := closer.Close()
require.NoError(t, err)
})
}

0 comments on commit 3830b41

Please sign in to comment.