Skip to content

Commit 69aa7c5

Browse files
author
Divjot Arora
committed
Return WriteConcernError from bulk writes
GODRIVER-975 Change-Id: Ie363b168fd7e60debd629c4f37040b90318554bd
1 parent 506e97a commit 69aa7c5

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

mongo/collection_internal_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2090,3 +2090,38 @@ func TestCollection_FindOneAndUpdate_WriteConcernError(t *testing.T) {
20902090
t.Errorf("incorrect error type returned: %T", writeErr)
20912091
}
20922092
}
2093+
2094+
func TestCollection_BulkWrite(t *testing.T) {
2095+
t.Run("TestWriteConcernError", func(t *testing.T) {
2096+
if os.Getenv("TOPOLOGY") != "replica_set" {
2097+
t.Skip()
2098+
}
2099+
2100+
filter := bson.D{{"foo", "bar"}}
2101+
update := bson.D{{"$set", bson.D{{"foo", 10}}}}
2102+
2103+
testCases := []struct {
2104+
name string
2105+
models []WriteModel
2106+
}{
2107+
{"insert", []WriteModel{NewInsertOneModel().SetDocument(bson.D{{"foo", 1}})}},
2108+
{"update", []WriteModel{NewUpdateOneModel().SetFilter(filter).SetUpdate(update)}},
2109+
{"delete", []WriteModel{NewDeleteOneModel().SetFilter(filter)}},
2110+
}
2111+
2112+
coll := createTestCollection(t, nil, nil, options.Collection().SetWriteConcern(impossibleWriteConcern))
2113+
for _, tc := range testCases {
2114+
t.Run(tc.name, func(t *testing.T) {
2115+
_, err := coll.BulkWrite(ctx, tc.models)
2116+
require.Error(t, err)
2117+
2118+
bwException, ok := err.(BulkWriteException)
2119+
require.True(t, ok)
2120+
2121+
require.Equal(t, 0, len(bwException.WriteErrors),
2122+
"expected no write errors, got %v", bwException.WriteErrors)
2123+
require.NotNil(t, bwException.WriteConcernError)
2124+
})
2125+
}
2126+
})
2127+
}

x/mongo/driver/bulk_write.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ func runBatch(
164164

165165
batchRes.InsertedCount = int64(res.N)
166166
writeErrors = res.WriteErrors
167+
batchErr.WriteConcernError = res.WriteConcernError
167168
case DeleteOneModel, DeleteManyModel:
168169
res, err := runDelete(ctx, ns, topo, selector, ss, sess, clock, wc, retryWrite, batch, continueOnError, registry)
169170
if err != nil {
@@ -172,6 +173,7 @@ func runBatch(
172173

173174
batchRes.DeletedCount = int64(res.N)
174175
writeErrors = res.WriteErrors
176+
batchErr.WriteConcernError = res.WriteConcernError
175177
case ReplaceOneModel, UpdateOneModel, UpdateManyModel:
176178
res, err := runUpdate(ctx, ns, topo, selector, ss, sess, clock, wc, retryWrite, batch, bypassDocValidation,
177179
continueOnError, registry)
@@ -183,6 +185,7 @@ func runBatch(
183185
batchRes.ModifiedCount = res.ModifiedCount
184186
batchRes.UpsertedCount = int64(len(res.Upserted))
185187
writeErrors = res.WriteErrors
188+
batchErr.WriteConcernError = res.WriteConcernError
186189
for _, upsert := range res.Upserted {
187190
batchRes.UpsertedIDs[upsert.Index] = upsert.ID
188191
}

0 commit comments

Comments
 (0)