Skip to content

Commit 3a7ec76

Browse files
committed
removing atomic value and altering tests for replaceErrors for disconnected topology
1 parent 8210c5b commit 3a7ec76

File tree

4 files changed

+95
-25
lines changed

4 files changed

+95
-25
lines changed

mongo/client.go

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"errors"
1212
"fmt"
1313
"net/http"
14-
"sync/atomic"
1514
"time"
1615

1716
"go.mongodb.org/mongo-driver/v2/bson"
@@ -74,7 +73,6 @@ type Client struct {
7473
timeout *time.Duration
7574
httpClient *http.Client
7675
logger *logger.Logger
77-
closed atomic.Value
7876

7977
// client-side encryption fields
8078
keyVaultClientFLE *Client
@@ -252,8 +250,6 @@ func newClient(opts ...options.Lister[options.ClientOptions]) (*Client, error) {
252250
return nil, fmt.Errorf("invalid logger options: %w", err)
253251
}
254252

255-
client.closed.Store(false)
256-
257253
return client, nil
258254
}
259255

@@ -315,10 +311,6 @@ func (c *Client) connect() error {
315311
// or write operations. If this method returns with no errors, all connections
316312
// associated with this Client have been closed.
317313
func (c *Client) Disconnect(ctx context.Context) error {
318-
if c.closed.Load().(bool) {
319-
return ErrClientDisconnected
320-
}
321-
322314
if c.logger != nil {
323315
defer c.logger.Close()
324316
}
@@ -358,8 +350,6 @@ func (c *Client) Disconnect(ctx context.Context) error {
358350
c.cryptFLE.Close()
359351
}
360352

361-
c.closed.Store(true)
362-
363353
if disconnector, ok := c.deployment.(driver.Disconnector); ok {
364354
return replaceErrors(disconnector.Disconnect(ctx))
365355
}
@@ -379,10 +369,6 @@ func (c *Client) Disconnect(ctx context.Context) error {
379369
// Using Ping reduces application resilience because applications starting up will error if the server is temporarily
380370
// unavailable or is failing over (e.g. during autoscaling due to a load spike).
381371
func (c *Client) Ping(ctx context.Context, rp *readpref.ReadPref) error {
382-
if c.closed.Load().(bool) {
383-
return ErrClientDisconnected
384-
}
385-
386372
if ctx == nil {
387373
ctx = context.Background()
388374
}
@@ -878,10 +864,6 @@ func (c *Client) UseSessionWithOptions(
878864
// documentation).
879865
func (c *Client) Watch(ctx context.Context, pipeline interface{},
880866
opts ...options.Lister[options.ChangeStreamOptions]) (*ChangeStream, error) {
881-
if c.closed.Load().(bool) {
882-
return nil, ErrClientDisconnected
883-
}
884-
885867
csConfig := changeStreamConfig{
886868
readConcern: c.readConcern,
887869
readPreference: c.readPreference,

mongo/client_test.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"go.mongodb.org/mongo-driver/v2/internal/assert"
2020
"go.mongodb.org/mongo-driver/v2/internal/integtest"
2121
"go.mongodb.org/mongo-driver/v2/internal/mongoutil"
22+
"go.mongodb.org/mongo-driver/v2/internal/require"
2223
"go.mongodb.org/mongo-driver/v2/mongo/options"
2324
"go.mongodb.org/mongo-driver/v2/mongo/readconcern"
2425
"go.mongodb.org/mongo-driver/v2/mongo/readpref"
@@ -52,18 +53,25 @@ func TestClient(t *testing.T) {
5253
assert.Equal(t, dbName, db.Name(), "expected db name %v, got %v", dbName, db.Name())
5354
assert.Equal(t, client, db.Client(), "expected client %v, got %v", client, db.Client())
5455
})
55-
t.Run("client disconnect error", func(t *testing.T) {
56+
t.Run("replaceErrors for disconnected topology", func(t *testing.T) {
5657
client := setupClient()
57-
assert.Equal(t, false, client.closed.Load().(bool), "expected value %v, got %v", false, client.closed.Load().(bool))
5858

59-
err := client.Disconnect(bgCtx)
60-
assert.Equal(t, nil, err, "expected nil, got %v", err)
61-
assert.Equal(t, true, client.closed.Load().(bool), "expected error %v, got %v", true, client.closed.Load().(bool))
59+
topo, ok := client.deployment.(*topology.Topology)
60+
require.True(t, ok, "client deployment is not a topology")
61+
62+
err := topo.Disconnect(context.Background())
63+
require.NoError(t, err)
64+
65+
_, err = client.ListDatabases(bgCtx, bson.D{})
66+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
6267

6368
err = client.Ping(bgCtx, nil)
6469
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
6570

66-
_, err = client.Watch(bgCtx, nil, nil)
71+
err = client.Disconnect(bgCtx)
72+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
73+
74+
_, err = client.Watch(bgCtx, []bson.D{})
6775
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
6876
})
6977
t.Run("nil document error", func(t *testing.T) {

mongo/collection_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@ package mongo
88

99
import (
1010
"bytes"
11+
"context"
1112
"errors"
1213
"testing"
1314

1415
"go.mongodb.org/mongo-driver/v2/bson"
1516
"go.mongodb.org/mongo-driver/v2/internal/assert"
1617
"go.mongodb.org/mongo-driver/v2/internal/ptrutil"
18+
"go.mongodb.org/mongo-driver/v2/internal/require"
1719
"go.mongodb.org/mongo-driver/v2/mongo/options"
1820
"go.mongodb.org/mongo-driver/v2/mongo/readconcern"
1921
"go.mongodb.org/mongo-driver/v2/mongo/readpref"
2022
"go.mongodb.org/mongo-driver/v2/mongo/writeconcern"
2123
"go.mongodb.org/mongo-driver/v2/x/bsonx/bsoncore"
24+
"go.mongodb.org/mongo-driver/v2/x/mongo/driver/topology"
2225
)
2326

2427
const (
@@ -78,6 +81,65 @@ func TestCollection(t *testing.T) {
7881
}
7982
compareColls(t, expected, coll)
8083
})
84+
t.Run("replaceErrors for disconnected topology", func(t *testing.T) {
85+
coll := setupColl("foo")
86+
doc := bson.D{}
87+
update := bson.D{{"$update", bson.D{{"x", 1}}}}
88+
89+
topo, ok := coll.client.deployment.(*topology.Topology)
90+
require.True(t, ok, "client deployment is not a topology")
91+
92+
err := topo.Disconnect(context.Background())
93+
require.NoError(t, err)
94+
95+
_, err = coll.InsertOne(bgCtx, doc)
96+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
97+
98+
_, err = coll.InsertMany(bgCtx, []interface{}{doc})
99+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
100+
101+
_, err = coll.DeleteOne(bgCtx, doc)
102+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
103+
104+
_, err = coll.DeleteMany(bgCtx, doc)
105+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
106+
107+
_, err = coll.UpdateOne(bgCtx, doc, update)
108+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
109+
110+
_, err = coll.UpdateMany(bgCtx, doc, update)
111+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
112+
113+
_, err = coll.ReplaceOne(bgCtx, doc, doc)
114+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
115+
116+
_, err = coll.Aggregate(bgCtx, Pipeline{})
117+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
118+
119+
_, err = coll.EstimatedDocumentCount(bgCtx)
120+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
121+
122+
_, err = coll.CountDocuments(bgCtx, doc)
123+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
124+
125+
err = coll.Distinct(bgCtx, "x", doc).Err()
126+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
127+
128+
_, err = coll.Find(bgCtx, doc)
129+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
130+
131+
err = coll.FindOne(bgCtx, doc).Err()
132+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
133+
134+
err = coll.FindOneAndDelete(bgCtx, doc).Err()
135+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
136+
137+
err = coll.FindOneAndReplace(bgCtx, doc, doc).Err()
138+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
139+
140+
err = coll.FindOneAndUpdate(bgCtx, doc, update).Err()
141+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
142+
})
81143
t.Run("database accessor", func(t *testing.T) {
82144
coll := setupColl("bar")
83145
dbName := coll.Database().Name()

mongo/database_test.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"go.mongodb.org/mongo-driver/v2/bson"
1616
"go.mongodb.org/mongo-driver/v2/internal/assert"
17+
"go.mongodb.org/mongo-driver/v2/internal/require"
1718
"go.mongodb.org/mongo-driver/v2/mongo/options"
1819
"go.mongodb.org/mongo-driver/v2/mongo/readconcern"
1920
"go.mongodb.org/mongo-driver/v2/mongo/readpref"
@@ -83,9 +84,26 @@ func TestDatabase(t *testing.T) {
8384
compareDbs(t, expected, got)
8485
})
8586
})
87+
t.Run("replaceErrors for disconnected topology", func(t *testing.T) {
88+
db := setupDb("foo")
89+
90+
topo, ok := db.client.deployment.(*topology.Topology)
91+
require.True(t, ok, "client deployment is not a topology")
92+
93+
err := topo.Disconnect(context.Background())
94+
require.NoError(t, err)
95+
96+
err = db.RunCommand(bgCtx, bson.D{{"x", 1}}).Err()
97+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
98+
99+
err = db.Drop(bgCtx)
100+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
101+
102+
_, err = db.ListCollections(bgCtx, bson.D{})
103+
assert.Equal(t, ErrClientDisconnected, err, "expected error %v, got %v", ErrClientDisconnected, err)
104+
})
86105
t.Run("TransientTransactionError label", func(t *testing.T) {
87106
client := setupClient(options.Client().ApplyURI("mongodb://nonexistent").SetServerSelectionTimeout(3 * time.Second))
88-
assert.Equal(t, false, client.closed.Load().(bool), "expected value %v, got %v", false, client.closed.Load().(bool))
89107
defer func() { _ = client.Disconnect(bgCtx) }()
90108

91109
t.Run("negative case of non-transaction", func(t *testing.T) {

0 commit comments

Comments
 (0)