Skip to content

Commit adb576f

Browse files
committed
Write to data key collection with majority write concern
JAVA-3464
1 parent 8fce5f0 commit adb576f

File tree

4 files changed

+31
-4
lines changed

4 files changed

+31
-4
lines changed

driver-async/src/main/com/mongodb/async/client/vault/ClientEncryptionImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.mongodb.ClientEncryptionSettings;
2020
import com.mongodb.MongoNamespace;
21+
import com.mongodb.WriteConcern;
2122
import com.mongodb.async.SingleResultCallback;
2223
import com.mongodb.async.client.internal.Crypt;
2324
import com.mongodb.async.client.internal.Crypts;
@@ -60,6 +61,7 @@ public void onResult(final RawBsonDocument dataKeyDocument, final Throwable t) {
6061
MongoNamespace namespace = new MongoNamespace(options.getKeyVaultNamespace());
6162
keyVaultClient.getDatabase(namespace.getDatabaseName())
6263
.getCollection(namespace.getCollectionName(), BsonDocument.class)
64+
.withWriteConcern(WriteConcern.MAJORITY)
6365
.insertOne(dataKeyDocument, new SingleResultCallback<Void>() {
6466
@Override
6567
public void onResult(final Void result, final Throwable t) {

driver-async/src/test/functional/com/mongodb/async/client/ClientSideEncryptionProseTestSpecification.groovy

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ import com.mongodb.AutoEncryptionSettings
2020
import com.mongodb.ClientEncryptionSettings
2121
import com.mongodb.MongoClientException
2222
import com.mongodb.MongoNamespace
23+
import com.mongodb.WriteConcern
2324
import com.mongodb.async.FutureResultCallback
2425
import com.mongodb.async.client.vault.ClientEncryption
2526
import com.mongodb.async.client.vault.ClientEncryptions
2627
import com.mongodb.client.model.vault.DataKeyOptions
2728
import com.mongodb.client.model.vault.EncryptOptions
29+
import com.mongodb.event.CommandStartedEvent
30+
import com.mongodb.internal.connection.TestCommandListener
2831
import org.bson.BsonBinarySubType
2932
import org.bson.BsonDocument
3033
import org.bson.BsonString
@@ -34,7 +37,6 @@ import static com.mongodb.ClusterFixture.serverVersionAtLeast
3437
import static com.mongodb.async.client.Fixture.getDefaultDatabaseName
3538
import static com.mongodb.async.client.Fixture.getMongoClient
3639
import static com.mongodb.async.client.Fixture.getMongoClientBuilderFromConnectionString
37-
import static com.mongodb.async.client.Fixture.getMongoClientSettings
3840
import static com.mongodb.client.model.Filters.eq
3941
import static java.util.Collections.singletonMap
4042
import static org.junit.Assume.assumeFalse
@@ -51,6 +53,7 @@ class ClientSideEncryptionProseTestSpecification extends FunctionalSpecification
5153
private MongoClient autoEncryptingClient
5254
private ClientEncryption clientEncryption
5355
private MongoCollection<BsonDocument> autoEncryptingDataCollection
56+
private TestCommandListener commandListener
5457

5558
def setup() {
5659
assumeFalse(isNotAtLeastJava8())
@@ -93,8 +96,12 @@ class ClientSideEncryptionProseTestSpecification extends FunctionalSpecification
9396
autoEncryptingDataCollection = autoEncryptingClient.getDatabase(autoEncryptingCollectionNamespace.databaseName)
9497
.getCollection(autoEncryptingCollectionNamespace.collectionName, BsonDocument)
9598

99+
commandListener = new TestCommandListener()
100+
96101
clientEncryption = ClientEncryptions.create(ClientEncryptionSettings.builder()
97-
.keyVaultMongoClientSettings(getMongoClientSettings())
102+
.keyVaultMongoClientSettings(getMongoClientBuilderFromConnectionString()
103+
.addCommandListener(commandListener)
104+
.build())
98105
.keyVaultNamespace(keyVaultNamespace.fullName)
99106
.kmsProviders(providerProperties)
100107
.build())
@@ -107,6 +114,11 @@ class ClientSideEncryptionProseTestSpecification extends FunctionalSpecification
107114
def localDataKeyId = callback.get()
108115

109116
then:
117+
commandListener.getCommandStartedEvents().size() == 1
118+
def event = commandListener.getCommandStartedEvents().get(0) as CommandStartedEvent
119+
event.getCommand().containsKey('writeConcern')
120+
event.getCommand().getDocument('writeConcern') == WriteConcern.MAJORITY.asDocument()
121+
110122
localDataKeyId != null
111123
localDataKeyId.type == BsonBinarySubType.UUID_STANDARD.value
112124

driver-sync/src/main/com/mongodb/client/internal/ClientEncryptionImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.mongodb.ClientEncryptionSettings;
2020
import com.mongodb.MongoNamespace;
21+
import com.mongodb.WriteConcern;
2122
import com.mongodb.client.MongoClient;
2223
import com.mongodb.client.MongoClients;
2324
import com.mongodb.client.model.vault.DataKeyOptions;
@@ -51,6 +52,7 @@ public BsonBinary createDataKey(final String kmsProvider, final DataKeyOptions d
5152

5253
MongoNamespace namespace = new MongoNamespace(options.getKeyVaultNamespace());
5354
keyVaultClient.getDatabase(namespace.getDatabaseName()).getCollection(namespace.getCollectionName(), BsonDocument.class)
55+
.withWriteConcern(WriteConcern.MAJORITY)
5456
.insertOne(dataKeyDocument);
5557
return dataKeyDocument.getBinary("_id");
5658
}

driver-sync/src/test/functional/com/mongodb/client/ClientSideEncryptionProseTestSpecification.groovy

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ import com.mongodb.AutoEncryptionSettings
2020
import com.mongodb.ClientEncryptionSettings
2121
import com.mongodb.MongoClientException
2222
import com.mongodb.MongoNamespace
23+
import com.mongodb.WriteConcern
2324
import com.mongodb.client.model.vault.DataKeyOptions
2425
import com.mongodb.client.model.vault.EncryptOptions
2526
import com.mongodb.client.vault.ClientEncryption
2627
import com.mongodb.client.vault.ClientEncryptions
28+
import com.mongodb.event.CommandStartedEvent
29+
import com.mongodb.internal.connection.TestCommandListener
2730
import org.bson.BsonBinarySubType
2831
import org.bson.BsonDocument
2932
import org.bson.BsonString
@@ -32,7 +35,6 @@ import static com.mongodb.ClusterFixture.isNotAtLeastJava8
3235
import static com.mongodb.ClusterFixture.serverVersionAtLeast
3336
import static com.mongodb.client.Fixture.getDefaultDatabaseName
3437
import static com.mongodb.client.Fixture.getMongoClient
35-
import static com.mongodb.client.Fixture.getMongoClientSettings
3638
import static com.mongodb.client.Fixture.getMongoClientSettingsBuilder
3739
import static com.mongodb.client.model.Filters.eq
3840
import static java.util.Collections.singletonMap
@@ -53,6 +55,7 @@ class ClientSideEncryptionProseTestSpecification extends FunctionalSpecification
5355
private MongoClient autoEncryptingClient
5456
private ClientEncryption clientEncryption
5557
private MongoCollection<BsonDocument> autoEncryptingDataCollection
58+
private TestCommandListener commandListener
5659

5760
def setup() {
5861
assumeFalse(isNotAtLeastJava8())
@@ -95,8 +98,11 @@ class ClientSideEncryptionProseTestSpecification extends FunctionalSpecification
9598
autoEncryptingDataCollection = autoEncryptingClient.getDatabase(autoEncryptingCollectionNamespace.databaseName)
9699
.getCollection(autoEncryptingCollectionNamespace.collectionName, BsonDocument)
97100

101+
commandListener = new TestCommandListener()
98102
clientEncryption = ClientEncryptions.create(ClientEncryptionSettings.builder()
99-
.keyVaultMongoClientSettings(getMongoClientSettings())
103+
.keyVaultMongoClientSettings(getMongoClientSettingsBuilder()
104+
.addCommandListener(commandListener)
105+
.build())
100106
.keyVaultNamespace(keyVaultNamespace.fullName)
101107
.kmsProviders(providerProperties)
102108
.build())
@@ -107,6 +113,11 @@ class ClientSideEncryptionProseTestSpecification extends FunctionalSpecification
107113
def localDataKeyId = clientEncryption.createDataKey('local', new DataKeyOptions().keyAltNames(['local_altname']))
108114

109115
then:
116+
commandListener.getCommandStartedEvents().size() == 1
117+
def event = commandListener.getCommandStartedEvents().get(0) as CommandStartedEvent
118+
event.getCommand().containsKey('writeConcern')
119+
event.getCommand().getDocument('writeConcern') == WriteConcern.MAJORITY.asDocument()
120+
110121
localDataKeyId != null
111122
localDataKeyId.type == BsonBinarySubType.UUID_STANDARD.value
112123
dataKeyCollection.find(eq('masterKey.provider', 'local')).into([]).size() == 1

0 commit comments

Comments
 (0)