24
24
import com .mongodb .connection .ClusterConnectionMode ;
25
25
import com .mongodb .internal .TimeoutContext ;
26
26
import com .mongodb .internal .connection .MessageSequences .EmptyMessageSequences ;
27
- import com .mongodb .internal .operation .ClientBulkWriteOperation .ClientBulkWriteCommand ;
28
27
import com .mongodb .internal .session .SessionContext ;
29
28
import com .mongodb .lang .Nullable ;
30
29
import org .bson .BsonArray ;
57
56
import static com .mongodb .connection .ServerType .STANDALONE ;
58
57
import static com .mongodb .internal .connection .BsonWriterHelper .appendElementsToDocument ;
59
58
import static com .mongodb .internal .connection .BsonWriterHelper .backpatchLength ;
60
- import static com .mongodb .internal .connection .BsonWriterHelper .writeOpsAndNsInfo ;
59
+ import static com .mongodb .internal .connection .BsonWriterHelper .writeDocumentsOfDualMessageSequences ;
61
60
import static com .mongodb .internal .connection .BsonWriterHelper .writePayload ;
62
61
import static com .mongodb .internal .connection .ByteBufBsonDocument .createList ;
63
62
import static com .mongodb .internal .connection .ByteBufBsonDocument .createOne ;
@@ -81,11 +80,11 @@ public final class CommandMessage extends RequestMessage {
81
80
private final MessageSequences sequences ;
82
81
private final boolean responseExpected ;
83
82
/**
84
- * {@code null} iff either {@link #sequences} is not of the {@link ClientBulkWriteCommand.OpsAndNsInfo } type,
83
+ * {@code null} iff either {@link #sequences} is not of the {@link DualMessageSequences } type,
85
84
* or it is of that type, but it has not been {@linkplain #encodeMessageBodyWithMetadata(ByteBufferBsonOutput, OperationContext) encoded}.
86
85
*/
87
86
@ Nullable
88
- private Boolean opsAndNsInfoRequireResponse ;
87
+ private Boolean dualMessageSequencesRequireResponse ;
89
88
private final ClusterConnectionMode clusterConnectionMode ;
90
89
private final ServerApi serverApi ;
91
90
@@ -122,7 +121,7 @@ public final class CommandMessage extends RequestMessage {
122
121
this .commandFieldNameValidator = commandFieldNameValidator ;
123
122
this .readPreference = readPreference ;
124
123
this .responseExpected = responseExpected ;
125
- opsAndNsInfoRequireResponse = null ;
124
+ dualMessageSequencesRequireResponse = null ;
126
125
this .exhaustAllowed = exhaustAllowed ;
127
126
this .sequences = sequences ;
128
127
this .clusterConnectionMode = notNull ("clusterConnectionMode" , clusterConnectionMode );
@@ -206,12 +205,11 @@ boolean isResponseExpected() {
206
205
if (responseExpected ) {
207
206
return true ;
208
207
} else {
209
- if (sequences instanceof ValidatableSplittablePayload ) {
210
- ValidatableSplittablePayload validatableSplittablePayload = (ValidatableSplittablePayload ) sequences ;
211
- SplittablePayload payload = validatableSplittablePayload .getSplittablePayload ();
208
+ if (sequences instanceof SplittablePayload ) {
209
+ SplittablePayload payload = (SplittablePayload ) sequences ;
212
210
return payload .isOrdered () && payload .hasAnotherSplit ();
213
- } else if (sequences instanceof ClientBulkWriteCommand . OpsAndNsInfo ) {
214
- return assertNotNull (opsAndNsInfoRequireResponse );
211
+ } else if (sequences instanceof DualMessageSequences ) {
212
+ return assertNotNull (dualMessageSequencesRequireResponse );
215
213
} else if (!(sequences instanceof EmptyMessageSequences )) {
216
214
fail (sequences .toString ());
217
215
}
@@ -233,38 +231,34 @@ protected EncodingMetadata encodeMessageBodyWithMetadata(final ByteBufferBsonOut
233
231
bsonOutput .writeByte (0 ); // payload type
234
232
commandStartPosition = bsonOutput .getPosition ();
235
233
ArrayList <BsonElement > extraElements = getExtraElements (operationContext );
236
- // `OpsAndNsInfo ` requires validation only if no response is expected, otherwise we must rely on the server validation
237
- boolean validateDocumentSizeLimits = !(sequences instanceof ClientBulkWriteCommand . OpsAndNsInfo ) || !responseExpected ;
234
+ // `DualMessageSequences ` requires validation only if no response is expected, otherwise we must rely on the server validation
235
+ boolean validateDocumentSizeLimits = !(sequences instanceof DualMessageSequences ) || !responseExpected ;
238
236
239
237
int commandDocumentSizeInBytes = writeDocument (command , bsonOutput , commandFieldNameValidator , validateDocumentSizeLimits );
240
- if (sequences instanceof ValidatableSplittablePayload ) {
238
+ if (sequences instanceof SplittablePayload ) {
241
239
appendElementsToDocument (bsonOutput , commandStartPosition , extraElements );
242
- ValidatableSplittablePayload validatableSplittablePayload = (ValidatableSplittablePayload ) sequences ;
243
- SplittablePayload payload = validatableSplittablePayload .getSplittablePayload ();
240
+ SplittablePayload payload = (SplittablePayload ) sequences ;
244
241
writeOpMsgSectionWithPayloadType1 (bsonOutput , payload .getPayloadName (), () -> {
245
242
writePayload (
246
- new BsonBinaryWriter (bsonOutput , validatableSplittablePayload .getFieldNameValidator ()),
243
+ new BsonBinaryWriter (bsonOutput , payload .getFieldNameValidator ()),
247
244
bsonOutput , getSettings (), messageStartPosition , payload , getSettings ().getMaxDocumentSize ()
248
245
);
249
246
return null ;
250
247
});
251
- } else if (sequences instanceof ClientBulkWriteCommand . OpsAndNsInfo ) {
252
- ClientBulkWriteCommand . OpsAndNsInfo opsAndNsInfo = (ClientBulkWriteCommand . OpsAndNsInfo ) sequences ;
248
+ } else if (sequences instanceof DualMessageSequences ) {
249
+ DualMessageSequences dualMessageSequences = (DualMessageSequences ) sequences ;
253
250
try (ByteBufferBsonOutput .Branch bsonOutputBranch2 = bsonOutput .branch ();
254
251
ByteBufferBsonOutput .Branch bsonOutputBranch1 = bsonOutput .branch ()) {
255
- ClientBulkWriteCommand . OpsAndNsInfo . EncodeResult opsAndNsInfoEncodeResult = writeOpMsgSectionWithPayloadType1 (
256
- bsonOutputBranch1 , "ops" , () ->
257
- writeOpMsgSectionWithPayloadType1 (bsonOutputBranch2 , "nsInfo" , () ->
258
- writeOpsAndNsInfo (
259
- opsAndNsInfo , commandDocumentSizeInBytes , bsonOutputBranch1 ,
252
+ DualMessageSequences . EncodeDocumentsResult encodeDocumentsResult = writeOpMsgSectionWithPayloadType1 (
253
+ bsonOutputBranch1 , dualMessageSequences . getFirstSequenceId () , () ->
254
+ writeOpMsgSectionWithPayloadType1 (bsonOutputBranch2 , dualMessageSequences . getSecondSequenceId () , () ->
255
+ writeDocumentsOfDualMessageSequences (
256
+ dualMessageSequences , commandDocumentSizeInBytes , bsonOutputBranch1 ,
260
257
bsonOutputBranch2 , getSettings (), validateDocumentSizeLimits )
261
258
)
262
259
);
263
- opsAndNsInfoRequireResponse = opsAndNsInfoEncodeResult .isServerResponseRequired ();
264
- Long txnNumber = opsAndNsInfoEncodeResult .getTxnNumber ();
265
- if (txnNumber != null ) {
266
- extraElements .add (new BsonElement (TXN_NUMBER_KEY , new BsonInt64 (txnNumber )));
267
- }
260
+ dualMessageSequencesRequireResponse = encodeDocumentsResult .isServerResponseRequired ();
261
+ extraElements .addAll (encodeDocumentsResult .getExtraElements ());
268
262
appendElementsToDocument (bsonOutput , commandStartPosition , extraElements );
269
263
}
270
264
} else if (sequences instanceof EmptyMessageSequences ) {
@@ -391,6 +385,11 @@ private void addReadConcernDocument(final List<BsonElement> extraElements, final
391
385
}
392
386
}
393
387
388
+ /**
389
+ * @param sequenceId The identifier of the sequence contained in the {@code OP_MSG} section to be written.
390
+ * @param writeDocumentsAction The action that writes the documents of the sequence.
391
+ * @see <a href="https://github.com/mongodb/specifications/blob/master/source/message/OP_MSG.md">OP_MSG</a>
392
+ */
394
393
private <R > R writeOpMsgSectionWithPayloadType1 (
395
394
final ByteBufferBsonOutput bsonOutput ,
396
395
final String sequenceId ,
0 commit comments