Skip to content

Commit 0d3c5aa

Browse files
committed
JAVA-2636: Move logic from InternalStreamConnection to CommandMessage for getting the BsonDocument to use for command monitoring.
Take advantage of the observation that a command with a payload is likely to be small (minus the payload) so it's a reasonable approach to simple convert the BSON back into a BsonDocument and then add the payload as a BsonArray initialized with a List<ByteBufBsonDocument> from the OP_MSG payload.
1 parent dd71640 commit 0d3c5aa

11 files changed

+112
-474
lines changed

driver-core/src/main/com/mongodb/connection/ByteBufBsonDocument.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class ByteBufBsonDocument extends AbstractByteBufBsonDocument {
4141

4242
private final transient ByteBuf byteBuf;
4343

44-
static List<ByteBufBsonDocument> create(final ResponseBuffers responseBuffers) {
44+
static List<ByteBufBsonDocument> createList(final ResponseBuffers responseBuffers) {
4545
int numDocuments = responseBuffers.getReplyHeader().getNumberReturned();
4646
ByteBuf documentsBuffer = responseBuffers.getBodyByteBuffer();
4747
documentsBuffer.order(ByteOrder.LITTLE_ENDIAN);
@@ -57,11 +57,7 @@ static List<ByteBufBsonDocument> create(final ResponseBuffers responseBuffers) {
5757
return documents;
5858
}
5959

60-
static ByteBufBsonDocument createOne(final ByteBufferBsonOutput bsonOutput, final int startPosition) {
61-
return create(bsonOutput, startPosition).get(0);
62-
}
63-
64-
static List<ByteBufBsonDocument> create(final ByteBufferBsonOutput bsonOutput, final int startPosition) {
60+
static List<ByteBufBsonDocument> createList(final ByteBufferBsonOutput bsonOutput, final int startPosition) {
6561
List<ByteBuf> duplicateByteBuffers = bsonOutput.getByteBuffers();
6662
CompositeByteBuf outputByteBuf = new CompositeByteBuf(duplicateByteBuffers);
6763
outputByteBuf.position(startPosition);
@@ -82,6 +78,20 @@ static List<ByteBufBsonDocument> create(final ByteBufferBsonOutput bsonOutput, f
8278
return documents;
8379
}
8480

81+
static ByteBufBsonDocument createOne(final ByteBufferBsonOutput bsonOutput, final int startPosition) {
82+
List<ByteBuf> duplicateByteBuffers = bsonOutput.getByteBuffers();
83+
CompositeByteBuf outputByteBuf = new CompositeByteBuf(duplicateByteBuffers);
84+
outputByteBuf.position(startPosition);
85+
int documentSizeInBytes = outputByteBuf.getInt();
86+
ByteBuf slice = outputByteBuf.duplicate();
87+
slice.position(startPosition);
88+
slice.limit(startPosition + documentSizeInBytes);
89+
for (ByteBuf byteBuffer : duplicateByteBuffers) {
90+
byteBuffer.release();
91+
}
92+
return new ByteBufBsonDocument(slice);
93+
}
94+
8595
@Override
8696
@SuppressWarnings("deprecation")
8797
public String toJson() {
@@ -130,6 +140,10 @@ public BsonDocument clone() {
130140
return new RawBsonDocument(clonedBytes);
131141
}
132142

143+
int getSizeInBytes() {
144+
return byteBuf.getInt(byteBuf.position());
145+
}
146+
133147
BsonDocument toBsonDocument() {
134148
ByteBuf duplicateByteBuf = byteBuf.duplicate();
135149
BsonBinaryReader bsonReader = new BsonBinaryReader(new ByteBufferBsonInput(duplicateByteBuf));

driver-core/src/main/com/mongodb/connection/ByteBufPayloadBsonDocument.java

Lines changed: 0 additions & 139 deletions
This file was deleted.

driver-core/src/main/com/mongodb/connection/CommandMessage.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.mongodb.MongoNamespace;
2121
import com.mongodb.ReadPreference;
2222
import com.mongodb.internal.validator.MappedFieldNameValidator;
23+
import org.bson.BsonArray;
2324
import org.bson.BsonBinaryWriter;
2425
import org.bson.BsonDocument;
2526
import org.bson.BsonElement;
@@ -29,6 +30,7 @@
2930
import org.bson.codecs.EncoderContext;
3031
import org.bson.io.BsonOutput;
3132

33+
import java.nio.charset.Charset;
3234
import java.util.ArrayList;
3335
import java.util.HashMap;
3436
import java.util.List;
@@ -68,6 +70,31 @@ final class CommandMessage extends RequestMessage {
6870
this.readPreference = readPreference;
6971
}
7072

73+
BsonDocument getCommandDocument(final ByteBufferBsonOutput bsonOutput) {
74+
ByteBufBsonDocument byteBufBsonDocument = ByteBufBsonDocument.createOne(bsonOutput,
75+
getEncodingMetadata().getFirstDocumentPosition());
76+
BsonDocument commandBsonDocument;
77+
78+
if (useOpMsg() && containsPayload()) {
79+
commandBsonDocument = byteBufBsonDocument.toBsonDocument();
80+
81+
int payloadStartPosition = getEncodingMetadata().getFirstDocumentPosition()
82+
+ byteBufBsonDocument.getSizeInBytes()
83+
+ 1 // payload type
84+
+ 4 // payload size
85+
+ payload.getPayloadName().getBytes(Charset.forName("UTF-8")).length + 1; // null-terminated UTF-8 payload name
86+
commandBsonDocument.append(payload.getPayloadName(),
87+
new BsonArray(ByteBufBsonDocument.createList(bsonOutput, payloadStartPosition)));
88+
} else {
89+
commandBsonDocument = byteBufBsonDocument;
90+
}
91+
92+
if (commandBsonDocument.containsKey("$query")) {
93+
commandBsonDocument = commandBsonDocument.getDocument("$query");
94+
}
95+
return commandBsonDocument;
96+
}
97+
7198
boolean containsPayload() {
7299
return payload != null;
73100
}

driver-core/src/main/com/mongodb/connection/GetMoreProtocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ private BsonDocument asGetMoreCommandResponseDocument(final QueryResult<T> query
179179
List<ByteBufBsonDocument> rawResultDocuments = Collections.emptyList();
180180
if (responseBuffers.getReplyHeader().getNumberReturned() != 0) {
181181
responseBuffers.reset();
182-
rawResultDocuments = ByteBufBsonDocument.create(responseBuffers);
182+
rawResultDocuments = ByteBufBsonDocument.createList(responseBuffers);
183183
}
184184

185185
BsonDocument cursorDocument = new BsonDocument("id",

driver-core/src/main/com/mongodb/connection/InsertProtocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void onResult(final WriteConcernResult result, final Throwable t) {
8383
@Override
8484
protected BsonDocument getAsWriteCommand(final ByteBufferBsonOutput bsonOutput, final int firstDocumentPosition) {
8585
return getBaseCommandDocument("insert")
86-
.append("documents", new BsonArray(ByteBufBsonDocument.create(bsonOutput, firstDocumentPosition)));
86+
.append("documents", new BsonArray(ByteBufBsonDocument.createList(bsonOutput, firstDocumentPosition)));
8787

8888
}
8989

driver-core/src/main/com/mongodb/connection/InternalStreamConnection.java

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -675,28 +675,13 @@ public String getCommandName() {
675675
public void sendStartedEvent(final ByteBufferBsonOutput bsonOutput) {
676676
if ((commandListener != null || sendCompressor != null) && opened()) {
677677

678-
AbstractByteBufBsonDocument byteBufBsonDocument;
679-
if (message.containsPayload()) {
680-
byteBufBsonDocument = ByteBufPayloadBsonDocument.create(bsonOutput,
681-
message.getEncodingMetadata().getFirstDocumentPosition());
682-
} else {
683-
byteBufBsonDocument = ByteBufBsonDocument.createOne(bsonOutput,
684-
message.getEncodingMetadata().getFirstDocumentPosition());
685-
}
686-
687-
BsonDocument commandBsonDocument = byteBufBsonDocument;
688-
if (byteBufBsonDocument.containsKey("$query")) {
689-
commandBsonDocument = byteBufBsonDocument.getDocument("$query");
690-
commandName = commandBsonDocument.keySet().iterator().next();
691-
} else {
692-
commandName = byteBufBsonDocument.getFirstKey();
693-
}
678+
BsonDocument commandDocument = message.getCommandDocument(bsonOutput);
679+
commandName = commandDocument.getFirstKey();
694680

695681
BsonDocument commandDocumentForEvent = (SECURITY_SENSITIVE_COMMANDS.contains(commandName))
696-
? new BsonDocument() : commandBsonDocument;
682+
? new BsonDocument() : commandDocument;
697683
sendCommandStartedEvent(message, new MongoNamespace(message.getCollectionName()).getDatabaseName(), commandName,
698684
commandDocumentForEvent, getDescription(), commandListener);
699-
700685
}
701686
}
702687

driver-core/src/main/com/mongodb/connection/QueryProtocol.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ private BsonDocument asFindCommandDocument(final ByteBufferBsonOutput bsonOutput
413413

414414
boolean isExplain = false;
415415

416-
List<ByteBufBsonDocument> documents = ByteBufBsonDocument.create(bsonOutput, firstDocumentPosition);
416+
List<ByteBufBsonDocument> documents = ByteBufBsonDocument.createList(bsonOutput, firstDocumentPosition);
417417

418418
ByteBufBsonDocument rawQueryDocument = documents.get(0);
419419
for (Map.Entry<String, BsonValue> cur : rawQueryDocument.entrySet()) {
@@ -474,7 +474,7 @@ private BsonDocument asFindCommandResponseDocument(final ResponseBuffers respons
474474
List<ByteBufBsonDocument> rawResultDocuments = Collections.emptyList();
475475
if (responseBuffers.getReplyHeader().getNumberReturned() > 0) {
476476
responseBuffers.reset();
477-
rawResultDocuments = ByteBufBsonDocument.create(responseBuffers);
477+
rawResultDocuments = ByteBufBsonDocument.createList(responseBuffers);
478478
}
479479

480480
if (isExplain) {

driver-core/src/main/com/mongodb/connection/UpdateProtocol.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public void onResult(final WriteConcernResult result, final Throwable t) {
8282

8383
@Override
8484
protected BsonDocument getAsWriteCommand(final ByteBufferBsonOutput bsonOutput, final int firstDocumentPosition) {
85-
List<ByteBufBsonDocument> documents = ByteBufBsonDocument.create(bsonOutput, firstDocumentPosition);
85+
List<ByteBufBsonDocument> documents = ByteBufBsonDocument.createList(bsonOutput, firstDocumentPosition);
8686
BsonDocument updateDocument = new BsonDocument("q", documents.get(0)).append("u", documents.get(1));
8787
if (updateRequest.isMulti()) {
8888
updateDocument.append("multi", BsonBoolean.TRUE);

driver-core/src/test/functional/com/mongodb/connection/WriteCommandProtocolCommandEventSpecification.groovy

Whitespace-only changes.

0 commit comments

Comments
 (0)