Skip to content

Commit

Permalink
DRIVERS-3036 Remove the BSON document size validation requirement for…
Browse files Browse the repository at this point in the history
… the client bulk write operation (#1725)
  • Loading branch information
stIncMale authored Nov 8, 2024
1 parent fc7996d commit 3a4e2da
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 60 deletions.
27 changes: 11 additions & 16 deletions source/crud/bulk-write.md
Original file line number Diff line number Diff line change
Expand Up @@ -634,22 +634,6 @@ write concern containing the following message:

> Cannot request unacknowledged write concern and ordered writes
### Size Limits

The server reports a `maxBsonObjectSize` in its `hello` response. This value defines the maximum size for documents that
are inserted into the database. Documents that are sent to the server but are not intended to be inserted into the
database (e.g. command documents) have a size limit of `maxBsonObjectSize + 16KiB`. When an acknowledged write concern
is used, drivers MUST NOT perform any checks related to these size limits and MUST rely on the server to raise an error
if a limit is exceeded. However, when an unacknowledged write concern is used, drivers MUST raise an error if one of the
following limits is exceeded:

- The size of a document to be inserted MUST NOT exceed `maxBsonObjectSize`. This applies to the `document` field of an
`InsertOneModel` and the `replacement` field of a `ReplaceOneModel`.
- The size of an entry in the `ops` array MUST NOT exceed `maxBsonObjectSize + 16KiB`.
- The size of the `bulkWrite` command document MUST NOT exceed `maxBsonObjectSize + 16KiB`.

See [SERVER-10643](https://jira.mongodb.org/browse/SERVER-10643) for more details on these size limits.

## Auto-Encryption

If `MongoClient.bulkWrite` is called on a `MongoClient` configured with `AutoEncryptionOpts`, drivers MUST return an
Expand Down Expand Up @@ -922,8 +906,19 @@ number was determined by constructing `OP_MSG` messages with various fields atta
Drivers are required to use this value even if they are capable of determining the exact size of the message prior to
batch-splitting to standardize implementations across drivers and simplify batch-splitting testing.

### Why is there no requirement to validate the size of a BSON document?

Following
["_Where possible, depend on server to return errors_"](https://github.com/mongodb/specifications/blob/f8dbd2469f18d093f917efa1f758024bca5d3aaa/source/driver-mantras.md#where-possible-depend-on-server-to-return-errors),
drivers should rely on the server to return errors about exceeded size limits. Such reliance is not possible for
unacknowledged writes. This specification previously required drivers to check size limits for unacknowledged writes.
The requirement has since been removed. Checking size limits complicates some driver implementations. Returning a driver
error in this specific situation does not seem helpful enough to require size checks.

## **Changelog**

- 2024-11-05: Updated the requirements regarding the size validation.

- 2024-10-07: Error if `w:0` is used with `ordered=true` or `verboseResults=true`.

- 2024-10-01: Add sort option to `replaceOne` and `updateOne`.
Expand Down
47 changes: 3 additions & 44 deletions source/crud/tests/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -370,56 +370,15 @@ Assert that a CommandStartedEvent was observed for the `killCursors` command.

### 10. `MongoClient.bulkWrite` returns error for unacknowledged too-large insert

This test must only be run on 8.0+ servers. This test must be skipped on Atlas Serverless.

Construct a `MongoClient` (referred to as `client`).

Perform a `hello` command using `client` and record the following values from the response: `maxBsonObjectSize`.

Then, construct the following document (referred to as `document`):

```javascript
{
"a": "b".repeat(maxBsonObjectSize)
}
```
Removed.

#### With insert

Construct the following write model (referred to as `model`):

```javascript
InsertOne: {
"namespace": "db.coll",
"document": document
}
```

Construct as list of write models (referred to as `models`) with the one `model`.

Call `MongoClient.bulkWrite` with `models`. Pass `BulkWriteOptions` with `ordered` set to `false` and `writeConcern` set
to an unacknowledged write concern.

Expect a client-side error due the size.
Removed.

#### With replace

Construct the following write model (referred to as `model`):

```javascript
ReplaceOne: {
"namespace": "db.coll",
"filter": {},
"replacement": document
}
```

Construct as list of write models (referred to as `models`) with the one `model`.

Call `MongoClient.bulkWrite` with `models`. Pass `BulkWriteOptions` with `ordered` set to `false` and `writeConcern` set
to an unacknowledged write concern.

Expect a client-side error due the size.
Removed.

### 11. `MongoClient.bulkWrite` batch splits when the addition of a new namespace exceeds the maximum message size

Expand Down

0 comments on commit 3a4e2da

Please sign in to comment.