@@ -58,6 +58,7 @@ func (bw *clientBulkWrite) execute(ctx context.Context) error {
5858 }
5959 resMap := make ([]interface {}, len (bw .models ))
6060 insIDMap := make (map [int ]interface {})
61+ canRetry := true
6162 for i , v := range bw .models {
6263 var doc bsoncore.Document
6364 var err error
@@ -94,6 +95,7 @@ func (bw *clientBulkWrite) execute(ctx context.Context) error {
9495 bw .client .bsonOpts ,
9596 bw .client .registry )
9697 case * ClientUpdateManyModel :
98+ canRetry = false
9799 nsIdx = getNsIndex (model .Namespace )
98100 if bw .result .UpdateResults == nil {
99101 bw .result .UpdateResults = make (map [int64 ]ClientUpdateResult )
@@ -144,6 +146,7 @@ func (bw *clientBulkWrite) execute(ctx context.Context) error {
144146 bw .client .bsonOpts ,
145147 bw .client .registry )
146148 case * ClientDeleteManyModel :
149+ canRetry = false
147150 nsIdx = getNsIndex (model .Namespace )
148151 if bw .result .DeleteResults == nil {
149152 bw .result .DeleteResults = make (map [int64 ]ClientDeleteResult )
@@ -168,24 +171,22 @@ func (bw *clientBulkWrite) execute(ctx context.Context) error {
168171 Documents : docs ,
169172 Ordered : bw .ordered ,
170173 }
174+ retry := driver .RetryNone
175+ if bw .client .retryWrites && canRetry {
176+ retry = driver .RetryOncePerCommand
177+ }
171178 op := operation .NewCommandFn (bw .newCommand (nsList )).Batches (batches ).
172179 Session (bw .session ).WriteConcern (bw .writeConcern ).CommandMonitor (bw .client .monitor ).
173180 ServerSelector (bw .selector ).ClusterClock (bw .client .clock ).
174- Database ("admin" ).
181+ Database ("admin" ).Type ( driver . Write ). RetryMode ( retry ).
175182 Deployment (bw .client .deployment ).Crypt (bw .client .cryptFLE ).
176183 ServerAPI (bw .client .serverAPI ).Timeout (bw .client .timeout ).
177184 Logger (bw .client .logger ).Authenticator (bw .client .authenticator ).Name ("bulkWrite" )
178- opErr := op .Execute (ctx )
179- var wcErrs []* WriteConcernError
180- if opErr != nil {
181- if errors .Is (opErr , driver .ErrUnacknowledgedWrite ) {
185+ err := op .Execute (ctx )
186+ if err != nil {
187+ if errors .Is (err , driver .ErrUnacknowledgedWrite ) {
182188 return nil
183189 }
184- var writeErr driver.WriteCommandError
185- if errors .As (opErr , & writeErr ) {
186- wcErr := convertDriverWriteConcernError (writeErr .WriteConcernError )
187- wcErrs = append (wcErrs , wcErr )
188- }
189190 }
190191 var res struct {
191192 Ok bool
@@ -212,34 +213,33 @@ func (bw *clientBulkWrite) execute(ctx context.Context) error {
212213 bw .result .UpsertedCount = int64 (res .NUpserted )
213214 errors := make (map [int64 ]WriteError )
214215 for i , cur := range res .Cursor .FirstBatch {
215- switch res := resMap [i ].(type ) {
216+ switch r := resMap [i ].(type ) {
216217 case map [int64 ]ClientDeleteResult :
217- if err := appendDeleteResult (cur , res , errors ); err != nil {
218+ if err := appendDeleteResult (cur , r , errors ); err != nil {
218219 return err
219220 }
220221 case map [int64 ]ClientInsertResult :
221- if err := appendInsertResult (cur , res , errors , insIDMap ); err != nil {
222+ if err := appendInsertResult (cur , r , errors , insIDMap ); err != nil {
222223 return err
223224 }
224225 case map [int64 ]ClientUpdateResult :
225- if err := appendUpdateResult (cur , res , errors ); err != nil {
226+ if err := appendUpdateResult (cur , r , errors ); err != nil {
226227 return err
227228 }
228229 }
229230 }
230- if ! res .Ok || res .NErrors > 0 || opErr != nil {
231+ if ! res .Ok || res .NErrors > 0 {
231232 return ClientBulkWriteException {
232233 TopLevelError : & WriteError {
233234 Code : int (res .Code ),
234235 Message : res .Errmsg ,
235236 Raw : bson .Raw (rawRes ),
236237 },
237- WriteConcernErrors : wcErrs ,
238- WriteErrors : errors ,
239- PartialResult : & bw .result ,
238+ WriteErrors : errors ,
239+ PartialResult : & bw .result ,
240240 }
241241 }
242- return nil
242+ return err
243243}
244244
245245func (bw * clientBulkWrite ) newCommand (nsList []string ) func ([]byte , description.SelectedServer ) ([]byte , error ) {
0 commit comments