Skip to content

Commit 20b6cab

Browse files
authored
GODRIVER-1632 fixing function for retryable writes (#433)
1 parent 09ccd6f commit 20b6cab

File tree

8 files changed

+16
-50
lines changed

8 files changed

+16
-50
lines changed

mongo/change_stream_deployment.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ func (c *changeStreamDeployment) SelectServer(context.Context, description.Serve
2727
return c, nil
2828
}
2929

30-
func (c *changeStreamDeployment) SupportsRetryWrites() bool {
31-
return false
32-
}
33-
3430
func (c *changeStreamDeployment) Kind() description.TopologyKind {
3531
return c.topologyKind
3632
}

mongo/client_test.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ func (md mockDeployment) SelectServer(context.Context, description.ServerSelecto
4343
return nil, nil
4444
}
4545

46-
func (md mockDeployment) SupportsRetryWrites() bool {
47-
return false
48-
}
49-
5046
func (md mockDeployment) Kind() description.TopologyKind {
5147
return description.Single
5248
}

mongo/integration/mtest/opmsg_deployment.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,6 @@ func (md *mockDeployment) SelectServer(context.Context, description.ServerSelect
111111
return md, nil
112112
}
113113

114-
// SupportsRetry implements the Deployment interface. It always returns true to allow for testing
115-
// retryability.
116-
func (md *mockDeployment) SupportsRetryWrites() bool {
117-
return true
118-
}
119-
120114
// Kind implements the Deployment interface. It always returns description.Single.
121115
func (md *mockDeployment) Kind() description.TopologyKind {
122116
return description.Single

x/mongo/driver/description/server.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,3 +391,8 @@ func decodeStringMap(element bsoncore.Element, name string) (map[string]string,
391391
}
392392
return m, nil
393393
}
394+
395+
// SupportsRetryWrites returns true if this description represents a server that supports retryable writes.
396+
func (s Server) SupportsRetryWrites() bool {
397+
return s.SessionTimeoutMinutes != 0 && s.Kind != Standalone
398+
}

x/mongo/driver/driver.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
// Deployment is implemented by types that can select a server from a deployment.
1111
type Deployment interface {
1212
SelectServer(context.Context, description.ServerSelector) (Server, error)
13-
SupportsRetryWrites() bool
1413
Kind() description.TopologyKind
1514
}
1615

@@ -114,10 +113,6 @@ func (ssd SingleServerDeployment) SelectServer(context.Context, description.Serv
114113
return ssd.Server, nil
115114
}
116115

117-
// SupportsRetryWrites implements the Deployment interface. It always returns Type(0), because a single
118-
// server does not support retryability.
119-
func (SingleServerDeployment) SupportsRetryWrites() bool { return false }
120-
121116
// Kind implements the Deployment interface. It always returns description.Single.
122117
func (SingleServerDeployment) Kind() description.TopologyKind { return description.Single }
123118

@@ -137,10 +132,6 @@ func (ssd SingleConnectionDeployment) SelectServer(context.Context, description.
137132
return ssd, nil
138133
}
139134

140-
// SupportsRetryWrites implements the Deployment interface. It always returns Type(0), because a single
141-
// connection does not support retryability.
142-
func (ssd SingleConnectionDeployment) SupportsRetryWrites() bool { return false }
143-
144135
// Kind implements the Deployment interface. It always returns description.Single.
145136
func (ssd SingleConnectionDeployment) Kind() description.TopologyKind { return description.Single }
146137

x/mongo/driver/operation.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@ func (op Operation) retryable(desc description.Server) bool {
539539
if op.Client != nil && (op.Client.Committing || op.Client.Aborting) {
540540
return true
541541
}
542-
if op.Deployment.SupportsRetryWrites() &&
542+
if desc.SupportsRetryWrites() &&
543543
desc.WireVersion != nil && desc.WireVersion.Max >= 6 &&
544544
op.Client != nil && !(op.Client.TransactionInProgress() || op.Client.TransactionStarting()) &&
545545
writeconcern.AckWrite(op.WriteConcern) {

x/mongo/driver/operation_test.go

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,6 @@ func TestOperation(t *testing.T) {
113113
}
114114
})
115115
t.Run("retryableWrite", func(t *testing.T) {
116-
deploymentRetry := new(mockDeployment)
117-
deploymentRetry.returns.retry = true
118-
119-
deploymentNoRetry := new(mockDeployment)
120-
121116
sessPool := session.NewPool(nil)
122117
id, err := uuid.New()
123118
noerr(t, err)
@@ -139,31 +134,33 @@ func TestOperation(t *testing.T) {
139134
wcAck := writeconcern.New(writeconcern.WMajority())
140135
wcUnack := writeconcern.New(writeconcern.W(0))
141136

142-
descRetryable := description.Server{WireVersion: &description.VersionRange{Min: 0, Max: 7}}
143-
descNotRetryable := description.Server{WireVersion: &description.VersionRange{Min: 0, Max: 5}}
137+
descRetryable := description.Server{WireVersion: &description.VersionRange{Min: 0, Max: 7}, SessionTimeoutMinutes: 1}
138+
descNotRetryableWireVersion := description.Server{WireVersion: &description.VersionRange{Min: 0, Max: 5}, SessionTimeoutMinutes: 1}
139+
descNotRetryableStandalone := description.Server{WireVersion: &description.VersionRange{Min: 0, Max: 7}, SessionTimeoutMinutes: 1, Kind: description.Standalone}
144140

145141
testCases := []struct {
146142
name string
147143
op Operation
148144
desc description.Server
149145
want Type
150146
}{
151-
{"deployment doesn't support", Operation{Deployment: deploymentNoRetry}, description.Server{}, Type(0)},
152-
{"wire version too low", Operation{Deployment: deploymentRetry, Client: sess, WriteConcern: wcAck}, descNotRetryable, Type(0)},
147+
{"deployment doesn't support", Operation{}, description.Server{}, Type(0)},
148+
{"wire version too low", Operation{Client: sess, WriteConcern: wcAck}, descNotRetryableWireVersion, Type(0)},
149+
{"standalone not supported", Operation{Client: sess, WriteConcern: wcAck}, descNotRetryableStandalone, Type(0)},
153150
{
154151
"transaction in progress",
155-
Operation{Deployment: deploymentRetry, Client: sessInProgressTransaction, WriteConcern: wcAck},
152+
Operation{Client: sessInProgressTransaction, WriteConcern: wcAck},
156153
descRetryable, Type(0),
157154
},
158155
{
159156
"transaction starting",
160-
Operation{Deployment: deploymentRetry, Client: sessStartingTransaction, WriteConcern: wcAck},
157+
Operation{Client: sessStartingTransaction, WriteConcern: wcAck},
161158
descRetryable, Type(0),
162159
},
163-
{"unacknowledged write concern", Operation{Deployment: deploymentRetry, Client: sess, WriteConcern: wcUnack}, descRetryable, Type(0)},
160+
{"unacknowledged write concern", Operation{Client: sess, WriteConcern: wcUnack}, descRetryable, Type(0)},
164161
{
165162
"acknowledged write concern",
166-
Operation{Deployment: deploymentRetry, Client: sess, WriteConcern: wcAck, Type: Write},
163+
Operation{Client: sess, WriteConcern: wcAck, Type: Write},
167164
descRetryable, Write,
168165
},
169166
}
@@ -625,9 +622,6 @@ func (m *mockDeployment) SelectServer(ctx context.Context, desc description.Serv
625622
return m.returns.server, m.returns.err
626623
}
627624

628-
func (m *mockDeployment) SupportsRetryWrites() bool {
629-
return m.returns.retry
630-
}
631625
func (m *mockDeployment) Kind() description.TopologyKind { return m.returns.kind }
632626

633627
type mockServerSelector struct{}

x/mongo/driver/topology/topology.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -290,16 +290,6 @@ func (t *Topology) RequestImmediateCheck() {
290290
t.serversLock.Unlock()
291291
}
292292

293-
// SupportsSessions returns true if the topology supports sessions.
294-
func (t *Topology) SupportsSessions() bool {
295-
return t.Description().SessionTimeoutMinutes != 0 && t.Description().Kind != description.Single
296-
}
297-
298-
// SupportsRetryWrites returns true if the topology supports retryable writes, which it does if it supports sessions.
299-
func (t *Topology) SupportsRetryWrites() bool {
300-
return t.SupportsSessions()
301-
}
302-
303293
// SelectServer selects a server with given a selector. SelectServer complies with the
304294
// server selection spec, and will time out after severSelectionTimeout or when the
305295
// parent context is done.

0 commit comments

Comments
 (0)