Skip to content

Commit

Permalink
Merge branch 'master' into cherry-pick-master-a94713a92b082d288656771…
Browse files Browse the repository at this point in the history
…76e2680a8f54efc28
  • Loading branch information
blink1073 authored Sep 30, 2024
2 parents 73f9aaf + 4fa9e22 commit 93dd220
Show file tree
Hide file tree
Showing 24 changed files with 893 additions and 621 deletions.
14 changes: 13 additions & 1 deletion .evergreen/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ functions:
params:
shell: "bash"
working_dir: src/go.mongodb.org/mongo-driver
include_expansions_in_env: ["TOPOLOGY", "AUTH", "SSL", "MONGODB_URI", "CRYPT_SHARED_LIB_PATH", "SKIP_CRYPT_SHARED_LIB", "RACE", "MONGO_GO_DRIVER_COMPRESSOR", "REQUIRE_API_VERSION", "LOAD_BALANCER"]
include_expansions_in_env: ["TOPOLOGY", "AUTH", "SSL", "SKIP_CSOT_TESTS", "MONGODB_URI", "CRYPT_SHARED_LIB_PATH", "SKIP_CRYPT_SHARED_LIB", "RACE", "MONGO_GO_DRIVER_COMPRESSOR", "REQUIRE_API_VERSION", "LOAD_BALANCER"]
script: |
${PREPARE_SHELL}
bash ${PROJECT_DIRECTORY}/.evergreen/run-tests.sh
Expand Down Expand Up @@ -2005,6 +2005,8 @@ axes:
GCC_PATH: "/cygdrive/c/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin"
GO_DIST: "C:\\golang\\go1.22"
VENV_BIN_DIR: "Scripts"
# CSOT tests are unreliable on our slow Windows hosts.
SKIP_CSOT_TESTS: true
- id: "rhel87-64"
display_name: "RHEL 8.7"
run_on: rhel8.7-large
Expand All @@ -2016,6 +2018,8 @@ axes:
batchtime: 1440 # Run at most once per 24 hours.
variables:
GO_DIST: "/opt/golang/go1.22"
# CSOT tests are unreliable on our slow macOS hosts.
SKIP_CSOT_TESTS: true

# OSes that require >= 4.0 for SSL
- id: os-ssl-40
Expand All @@ -2029,6 +2033,8 @@ axes:
GCC_PATH: "/cygdrive/c/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin"
GO_DIST: "C:\\golang\\go1.22"
VENV_BIN_DIR: "Scripts"
# CSOT tests are unreliable on our slow Windows hosts.
SKIP_CSOT_TESTS: true
- id: "rhel87-64"
display_name: "RHEL 8.7"
run_on: rhel8.7-large
Expand All @@ -2040,6 +2046,8 @@ axes:
batchtime: 1440 # Run at most once per 24 hours.
variables:
GO_DIST: "/opt/golang/go1.22"
# CSOT tests are unreliable on our slow macOS hosts.
SKIP_CSOT_TESTS: true

- id: ocsp-rhel-87
display_name: OS
Expand All @@ -2061,6 +2069,8 @@ axes:
GCC_PATH: "/cygdrive/c/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin"
GO_DIST: "C:\\golang\\go1.22"
SKIP_ECS_AUTH_TEST: true
# CSOT tests are unreliable on our slow Windows hosts.
SKIP_CSOT_TESTS: true
- id: "ubuntu2004-64"
display_name: "Ubuntu 20.04"
run_on: ubuntu2004-test
Expand All @@ -2075,6 +2085,8 @@ axes:
SKIP_ECS_AUTH_TEST: true
SKIP_EC2_AUTH_TEST: true
SKIP_WEB_IDENTITY_AUTH_TEST: true
# CSOT tests are unreliable on our slow macOS hosts.
SKIP_CSOT_TESTS: true

- id: os-faas-80
display_name: OS
Expand Down
1 change: 1 addition & 0 deletions .evergreen/run-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ fi

AUTH=${AUTH} \
SSL=${SSL} \
SKIP_CSOT_TESTS=${SKIP_CSOT_TESTS} \
MONGO_GO_DRIVER_CA_FILE=${MONGO_GO_DRIVER_CA_FILE} \
MONGO_GO_DRIVER_KEY_FILE=${MONGO_GO_DRIVER_KEY_FILE} \
MONGO_GO_DRIVER_PKCS8_ENCRYPTED_KEY_FILE=${MONGO_GO_DRIVER_PKCS8_ENCRYPTED_KEY_FILE} \
Expand Down
63 changes: 63 additions & 0 deletions internal/failpoint/failpoint.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// Copyright (C) MongoDB, Inc. 2024-present.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0

package failpoint

import (
"go.mongodb.org/mongo-driver/v2/bson"
)

const (
// ModeAlwaysOn is the fail point mode that enables the fail point for an
// indefinite number of matching commands.
ModeAlwaysOn = "alwaysOn"

// ModeOff is the fail point mode that disables the fail point.
ModeOff = "off"
)

// FailPoint is used to configure a server fail point. It is intended to be
// passed as the command argument to RunCommand.
//
// For more information about fail points, see
// https://github.com/mongodb/specifications/tree/HEAD/source/transactions/tests#server-fail-point
type FailPoint struct {
ConfigureFailPoint string `bson:"configureFailPoint"`
// Mode should be a string, FailPointMode, or map[string]interface{}
Mode interface{} `bson:"mode"`
Data Data `bson:"data"`
}

// Mode configures when a fail point will be enabled. It is used to set the
// FailPoint.Mode field.
type Mode struct {
Times int32 `bson:"times"`
Skip int32 `bson:"skip"`
}

// Data configures how a fail point will behave. It is used to set the
// FailPoint.Data field.
type Data struct {
FailCommands []string `bson:"failCommands,omitempty"`
CloseConnection bool `bson:"closeConnection,omitempty"`
ErrorCode int32 `bson:"errorCode,omitempty"`
FailBeforeCommitExceptionCode int32 `bson:"failBeforeCommitExceptionCode,omitempty"`
ErrorLabels *[]string `bson:"errorLabels,omitempty"`
WriteConcernError *WriteConcernError `bson:"writeConcernError,omitempty"`
BlockConnection bool `bson:"blockConnection,omitempty"`
BlockTimeMS int32 `bson:"blockTimeMS,omitempty"`
AppName string `bson:"appName,omitempty"`
}

// WriteConcernError is the write concern error to return when the fail point is
// triggered. It is used to set the FailPoint.Data.WriteConcernError field.
type WriteConcernError struct {
Code int32 `bson:"code"`
Name string `bson:"codeName"`
Errmsg string `bson:"errmsg"`
ErrorLabels *[]string `bson:"errorLabels,omitempty"`
ErrInfo bson.Raw `bson:"errInfo,omitempty"`
}
19 changes: 10 additions & 9 deletions internal/integration/change_stream_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"go.mongodb.org/mongo-driver/v2/event"
"go.mongodb.org/mongo-driver/v2/internal/assert"
"go.mongodb.org/mongo-driver/v2/internal/eventtest"
"go.mongodb.org/mongo-driver/v2/internal/failpoint"
"go.mongodb.org/mongo-driver/v2/internal/integration/mtest"
"go.mongodb.org/mongo-driver/v2/internal/require"
"go.mongodb.org/mongo-driver/v2/mongo"
Expand Down Expand Up @@ -523,12 +524,12 @@ func TestChangeStream_ReplicaSet(t *testing.T) {
SetReadConcern(mtest.MajorityRc).
SetRetryReads(false))

mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 1,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"aggregate"},
CloseConnection: true,
},
Expand All @@ -546,12 +547,12 @@ func TestChangeStream_ReplicaSet(t *testing.T) {
SetReadConcern(mtest.MajorityRc).
SetRetryReads(false))

mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 1,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"getMore"},
CloseConnection: true,
},
Expand All @@ -574,12 +575,12 @@ func TestChangeStream_ReplicaSet(t *testing.T) {
SetPoolMonitor(tpm.PoolMonitor).
SetRetryReads(true))

mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 2,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"aggregate"},
CloseConnection: true,
},
Expand Down
7 changes: 4 additions & 3 deletions internal/integration/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"go.mongodb.org/mongo-driver/v2/event"
"go.mongodb.org/mongo-driver/v2/internal/assert"
"go.mongodb.org/mongo-driver/v2/internal/eventtest"
"go.mongodb.org/mongo-driver/v2/internal/failpoint"
"go.mongodb.org/mongo-driver/v2/internal/handshake"
"go.mongodb.org/mongo-driver/v2/internal/integration/mtest"
"go.mongodb.org/mongo-driver/v2/internal/integtest"
Expand Down Expand Up @@ -678,10 +679,10 @@ func TestClient(t *testing.T) {
_, err := mt.Coll.InsertOne(context.Background(), bson.D{})
require.NoError(mt, err)

mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: "alwaysOn",
Data: mtest.FailPointData{
Mode: failpoint.ModeAlwaysOn,
Data: failpoint.Data{
FailCommands: []string{"find", "insert"},
BlockConnection: true,
BlockTimeMS: 500,
Expand Down
33 changes: 17 additions & 16 deletions internal/integration/crud_prose_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (

"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/internal/assert"
"go.mongodb.org/mongo-driver/v2/internal/failpoint"
"go.mongodb.org/mongo-driver/v2/internal/integration/mtest"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
Expand All @@ -29,14 +30,14 @@ func TestWriteErrorsWithLabels(t *testing.T) {

label := "ExampleError"
mt.Run("InsertMany errors with label", func(mt *mtest.T) {
mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 1,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"insert"},
WriteConcernError: &mtest.WriteConcernErrorData{
WriteConcernError: &failpoint.WriteConcernError{
Code: 100,
ErrorLabels: &[]string{label},
},
Expand All @@ -60,14 +61,14 @@ func TestWriteErrorsWithLabels(t *testing.T) {
})

mt.Run("WriteException with label", func(mt *mtest.T) {
mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 1,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"delete"},
WriteConcernError: &mtest.WriteConcernErrorData{
WriteConcernError: &failpoint.WriteConcernError{
Code: 100,
ErrorLabels: &[]string{label},
},
Expand All @@ -83,14 +84,14 @@ func TestWriteErrorsWithLabels(t *testing.T) {
})

mt.Run("BulkWriteException with label", func(mt *mtest.T) {
mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 1,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"delete"},
WriteConcernError: &mtest.WriteConcernErrorData{
WriteConcernError: &failpoint.WriteConcernError{
Code: 100,
ErrorLabels: &[]string{label},
},
Expand Down Expand Up @@ -333,14 +334,14 @@ func TestWriteConcernError(t *testing.T) {
errInfoDoc := bsoncore.BuildDocumentFromElements(nil,
bsoncore.AppendDocumentElement(nil, "writeConcern", wcDoc),
)
fp := mtest.FailPoint{
fp := failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 1,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"insert"},
WriteConcernError: &mtest.WriteConcernErrorData{
WriteConcernError: &failpoint.WriteConcernError{
Code: 100,
Name: "UnsatisfiableWriteConcern",
Errmsg: "Not enough data-bearing nodes",
Expand Down
33 changes: 21 additions & 12 deletions internal/integration/csot_prose_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@ package integration
import (
"bytes"
"context"
"os"
"strings"
"testing"
"time"

"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/event"
"go.mongodb.org/mongo-driver/v2/internal/assert"
"go.mongodb.org/mongo-driver/v2/internal/failpoint"
"go.mongodb.org/mongo-driver/v2/internal/integration/mtest"
"go.mongodb.org/mongo-driver/v2/internal/integtest"
"go.mongodb.org/mongo-driver/v2/internal/mongoutil"
Expand All @@ -25,6 +27,13 @@ import (
)

func TestCSOTProse(t *testing.T) {
// Skip CSOT tests when SKIP_CSOT_TESTS=true. In Evergreen, we typically set
// that environment variable on Windows and macOS because the CSOT spec
// tests are unreliable on those hosts.
if os.Getenv("SKIP_CSOT_TESTS") == "true" {
t.Skip("Skipping CSOT test because SKIP_CSOT_TESTS=true")
}

mt := mtest.New(t, mtest.NewOptions().CreateClient(false))

mt.RunOpts("1. multi-batch writes", mtest.NewOptions().MinServerVersion("4.4").
Expand All @@ -35,12 +44,12 @@ func TestCSOTProse(t *testing.T) {
assert.Nil(mt, err, "Drop error: %v", err)

// Configure a fail point to block both inserts of the multi-write for 1010ms (2020ms total).
mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 2,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"insert"},
BlockConnection: true,
BlockTimeMS: 1010,
Expand Down Expand Up @@ -191,12 +200,12 @@ func TestCSOTProse_GridFS(t *testing.T) {
SetHosts([]string{failpointHost}))

// Set a blocking "insert" fail point.
mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 1,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"insert"},
BlockConnection: true,
BlockTimeMS: 1250,
Expand Down Expand Up @@ -251,12 +260,12 @@ func TestCSOTProse_GridFS(t *testing.T) {
SetHosts([]string{failpointHost}))

// Set a blocking "delete" fail point.
mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 1,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"delete"},
BlockConnection: true,
BlockTimeMS: 1250,
Expand Down Expand Up @@ -367,12 +376,12 @@ func TestCSOTProse_GridFS(t *testing.T) {
SetHosts([]string{failpointHost}))

// Set a blocking "insert" fail point.
mt.SetFailPoint(mtest.FailPoint{
mt.SetFailPoint(failpoint.FailPoint{
ConfigureFailPoint: "failCommand",
Mode: mtest.FailPointMode{
Mode: failpoint.Mode{
Times: 1,
},
Data: mtest.FailPointData{
Data: failpoint.Data{
FailCommands: []string{"insert"},
BlockConnection: true,
BlockTimeMS: 200,
Expand Down
Loading

0 comments on commit 93dd220

Please sign in to comment.