-
Type:
Bug
-
Resolution: Fixed
-
Priority:
Major - P3
-
Affects Version/s: 3.6.2
-
Component/s: None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
Not sure if this is a bug or intended behavior, but I wasn't able to find a workaround.
I created a sharded cluster with 1 mongos using this Node.js script: https://github.com/Automattic/mongoose/blob/ebdbe41171000a3900ac075114d952b76441d768/tools/sharded.js , and I enabled sharding:
$ mongo --port 51000 MongoDB shell version v4.2.3-rc1 connecting to: mongodb://127.0.0.1:51000/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("399d5b08-5423-45a7-aac8-17dfb97586a5") } MongoDB server version: 4.2.3-rc1 Server has startup warnings: 2020-09-18T14:02:23.050-0400 I CONTROL [main] 2020-09-18T14:02:23.050-0400 I CONTROL [main] ** WARNING: Access control is not enabled for the database. 2020-09-18T14:02:23.050-0400 I CONTROL [main] ** Read and write access to data and configuration is unrestricted. 2020-09-18T14:02:23.050-0400 I CONTROL [main] mongos> use test switched to db test mongos> db.createCollection('activity') { "ok" : 1, "operationTime" : Timestamp(1600452398, 2), "$clusterTime" : { "clusterTime" : Timestamp(1600452398, 2), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } mongos> mongos> sh.shardCollection('test.activity', {domain: 1, sender: 1 ,objecttype:1 }) { "collectionsharded" : "test.activity", "collectionUUID" : UUID("1a615b36-6461-445a-a791-2aa65bf7c1d4"), "ok" : 1, "operationTime" : Timestamp(1600452428, 8), "$clusterTime" : { "clusterTime" : Timestamp(1600452428, 8), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } } mongos>
With this setup, the below script consistently throws a "MongoError: Must run update to shard key field in a multi-statement transaction or with retryWrites: true" error:
'use strict'; const { MongoClient } = require('mongodb'); run().catch(err => console.log(err)); async function run() { const client = await MongoClient.connect('mongodb://localhost:51000/test?retryWrites=true', { useNewUrlParser: true, useUnifiedTopology: true }); const db = client.db(); await db.collection('activity').deleteMany({}); await db.collection('activity').insertOne({ domain: 'a', sender: 'b', objecttype: 'chair', hash: 'random1' }); console.log(client.topology.description); await db.collection('activity').updateOne( { domain: 'a', sender: 'b', objecttype: 'chair', hash: 'random1'}, { '$set': { domain: 'example.com', sender: 'joe@example.com', objecttype: 'chair', foo: 'bar'} } ); console.log('Done'); }
The console.log(client.topology.description) line prints:
TopologyDescription {
type: 'Single',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map {
'localhost:51000' => ServerDescription {
address: 'localhost:51000',
error: undefined,
roundTripTime: 9,
lastUpdateTime: 261861846,
lastWriteDate: null,
opTime: null,
type: 'Mongos',
topologyVersion: undefined,
minWireVersion: 0,
maxWireVersion: 8,
maxBsonObjectSize: 16777216,
maxMessageSizeBytes: 48000000,
maxWriteBatchSize: 100000,
hosts: [],
passives: [],
arbiters: [],
tags: [],
logicalSessionTimeoutMinutes: 30,
'$clusterTime': [Object]
}
},
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: 30,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: 8
}
As far as I can tell, this issue is due to the driver thinking that the mongos is a standalone. If you turn off useUnifiedTopology, this script succeeds.
- is depended on by
-
COMPASS-4478 Support for updates in sharded collections
-
- Closed
-