1
- /* Copyright 2013 -present MongoDB Inc.
1
+ /* Copyright 2010 -present MongoDB Inc.
2
2
*
3
3
* Licensed under the Apache License, Version 2.0 (the "License");
4
4
* you may not use this file except in compliance with the License.
16
16
using System ;
17
17
using System . Buffers . Binary ;
18
18
using System . Collections . Concurrent ;
19
- using System . Collections . Generic ;
20
19
using System . Diagnostics ;
21
20
using System . IO ;
22
- using System . Linq ;
23
21
using System . Net ;
24
22
using System . Threading ;
25
23
using System . Threading . Tasks ;
@@ -582,22 +580,22 @@ private async Task SendBufferAsync(IByteBuffer buffer, CancellationToken cancell
582
580
}
583
581
}
584
582
585
- public void SendMessages ( IEnumerable < RequestMessage > messages , MessageEncoderSettings messageEncoderSettings , CancellationToken cancellationToken )
583
+ public void SendMessage ( RequestMessage message , MessageEncoderSettings messageEncoderSettings , CancellationToken cancellationToken )
586
584
{
587
- Ensure . IsNotNull ( messages , nameof ( messages ) ) ;
585
+ Ensure . IsNotNull ( message , nameof ( message ) ) ;
588
586
ThrowIfCancelledOrDisposedOrNotOpen ( cancellationToken ) ;
589
587
590
- var helper = new SendMessagesHelper ( this , messages , messageEncoderSettings ) ;
588
+ var helper = new SendMessageHelper ( this , message , messageEncoderSettings ) ;
591
589
try
592
590
{
593
- helper . EncodingMessages ( ) ;
594
- using ( var uncompressedBuffer = helper . EncodeMessages ( cancellationToken , out var sentMessages ) )
591
+ helper . EncodingMessage ( ) ;
592
+ using ( var uncompressedBuffer = helper . EncodeMessage ( cancellationToken , out var sentMessage ) )
595
593
{
596
- helper . SendingMessages ( uncompressedBuffer ) ;
594
+ helper . SendingMessage ( uncompressedBuffer ) ;
597
595
int sentLength ;
598
- if ( AnyMessageNeedsToBeCompressed ( sentMessages ) )
596
+ if ( ShouldBeCompressed ( sentMessage ) )
599
597
{
600
- using ( var compressedBuffer = CompressMessages ( sentMessages , uncompressedBuffer , messageEncoderSettings ) )
598
+ using ( var compressedBuffer = CompressMessage ( sentMessage , uncompressedBuffer , messageEncoderSettings ) )
601
599
{
602
600
SendBuffer ( compressedBuffer , cancellationToken ) ;
603
601
sentLength = compressedBuffer . Length ;
@@ -608,33 +606,33 @@ public void SendMessages(IEnumerable<RequestMessage> messages, MessageEncoderSet
608
606
SendBuffer ( uncompressedBuffer , cancellationToken ) ;
609
607
sentLength = uncompressedBuffer . Length ;
610
608
}
611
- helper . SentMessages ( sentLength ) ;
609
+ helper . SentMessage ( sentLength ) ;
612
610
}
613
611
}
614
612
catch ( Exception ex )
615
613
{
616
- helper . FailedSendingMessages ( ex ) ;
614
+ helper . FailedSendingMessage ( ex ) ;
617
615
ThrowOperationCanceledExceptionIfRequired ( ex ) ;
618
616
throw ;
619
617
}
620
618
}
621
619
622
- public async Task SendMessagesAsync ( IEnumerable < RequestMessage > messages , MessageEncoderSettings messageEncoderSettings , CancellationToken cancellationToken )
620
+ public async Task SendMessageAsync ( RequestMessage message , MessageEncoderSettings messageEncoderSettings , CancellationToken cancellationToken )
623
621
{
624
- Ensure . IsNotNull ( messages , nameof ( messages ) ) ;
622
+ Ensure . IsNotNull ( message , nameof ( message ) ) ;
625
623
ThrowIfCancelledOrDisposedOrNotOpen ( cancellationToken ) ;
626
624
627
- var helper = new SendMessagesHelper ( this , messages , messageEncoderSettings ) ;
625
+ var helper = new SendMessageHelper ( this , message , messageEncoderSettings ) ;
628
626
try
629
627
{
630
- helper . EncodingMessages ( ) ;
631
- using ( var uncompressedBuffer = helper . EncodeMessages ( cancellationToken , out var sentMessages ) )
628
+ helper . EncodingMessage ( ) ;
629
+ using ( var uncompressedBuffer = helper . EncodeMessage ( cancellationToken , out var sentMessage ) )
632
630
{
633
- helper . SendingMessages ( uncompressedBuffer ) ;
631
+ helper . SendingMessage ( uncompressedBuffer ) ;
634
632
int sentLength ;
635
- if ( AnyMessageNeedsToBeCompressed ( sentMessages ) )
633
+ if ( ShouldBeCompressed ( sentMessage ) )
636
634
{
637
- using ( var compressedBuffer = CompressMessages ( sentMessages , uncompressedBuffer , messageEncoderSettings ) )
635
+ using ( var compressedBuffer = CompressMessage ( sentMessage , uncompressedBuffer , messageEncoderSettings ) )
638
636
{
639
637
await SendBufferAsync ( compressedBuffer , cancellationToken ) . ConfigureAwait ( false ) ;
640
638
sentLength = compressedBuffer . Length ;
@@ -645,12 +643,12 @@ public async Task SendMessagesAsync(IEnumerable<RequestMessage> messages, Messag
645
643
await SendBufferAsync ( uncompressedBuffer , cancellationToken ) . ConfigureAwait ( false ) ;
646
644
sentLength = uncompressedBuffer . Length ;
647
645
}
648
- helper . SentMessages ( sentLength ) ;
646
+ helper . SentMessage ( sentLength ) ;
649
647
}
650
648
}
651
649
catch ( Exception ex )
652
650
{
653
- helper . FailedSendingMessages ( ex ) ;
651
+ helper . FailedSendingMessage ( ex ) ;
654
652
ThrowOperationCanceledExceptionIfRequired ( ex ) ;
655
653
throw ;
656
654
}
@@ -663,9 +661,9 @@ public void SetReadTimeout(TimeSpan timeout)
663
661
}
664
662
665
663
// private methods
666
- private bool AnyMessageNeedsToBeCompressed ( IEnumerable < RequestMessage > messages )
664
+ private bool ShouldBeCompressed ( RequestMessage message )
667
665
{
668
- return _sendCompressorType . HasValue && messages . Any ( m => m . MayBeCompressed ) ;
666
+ return _sendCompressorType . HasValue && message . MayBeCompressed ;
669
667
}
670
668
671
669
private CompressorType ? ChooseSendCompressorTypeIfAny ( ConnectionDescription connectionDescription )
@@ -674,8 +672,8 @@ private bool AnyMessageNeedsToBeCompressed(IEnumerable<RequestMessage> messages)
674
672
return availableCompressors . Count > 0 ? ( CompressorType ? ) availableCompressors [ 0 ] : null ;
675
673
}
676
674
677
- private IByteBuffer CompressMessages (
678
- IEnumerable < RequestMessage > messages ,
675
+ private IByteBuffer CompressMessage (
676
+ RequestMessage message ,
679
677
IByteBuffer uncompressedBuffer ,
680
678
MessageEncoderSettings messageEncoderSettings )
681
679
{
@@ -685,24 +683,22 @@ private IByteBuffer CompressMessages(
685
683
using ( var uncompressedStream = new ByteBufferStream ( uncompressedBuffer , ownsBuffer : false ) )
686
684
using ( var compressedStream = new ByteBufferStream ( compressedBuffer , ownsBuffer : false ) )
687
685
{
688
- foreach ( var message in messages )
689
- {
690
- var uncompressedMessageLength = uncompressedStream . ReadInt32 ( ) ;
691
- uncompressedStream . Position -= 4 ;
686
+ var uncompressedMessageLength = uncompressedStream . ReadInt32 ( ) ;
687
+ uncompressedStream . Position -= 4 ;
692
688
693
- using ( var uncompressedMessageSlice = uncompressedBuffer . GetSlice ( ( int ) uncompressedStream . Position , uncompressedMessageLength ) )
694
- using ( var uncompressedMessageStream = new ByteBufferStream ( uncompressedMessageSlice , ownsBuffer : false ) )
689
+ using ( var uncompressedMessageSlice = uncompressedBuffer . GetSlice ( ( int ) uncompressedStream . Position , uncompressedMessageLength ) )
690
+ using ( var uncompressedMessageStream = new ByteBufferStream ( uncompressedMessageSlice , ownsBuffer : false ) )
691
+ {
692
+ if ( message . MayBeCompressed )
695
693
{
696
- if ( message . MayBeCompressed )
697
- {
698
- CompressMessage ( message , uncompressedMessageStream , compressedStream , messageEncoderSettings ) ;
699
- }
700
- else
701
- {
702
- uncompressedMessageStream . EfficientCopyTo ( compressedStream ) ;
703
- }
694
+ CompressMessage ( message , uncompressedMessageStream , compressedStream , messageEncoderSettings ) ;
695
+ }
696
+ else
697
+ {
698
+ uncompressedMessageStream . EfficientCopyTo ( compressedStream ) ;
704
699
}
705
700
}
701
+
706
702
compressedBuffer . Length = ( int ) compressedStream . Length ;
707
703
}
708
704
@@ -978,29 +974,27 @@ private Opcode PeekOpcode(BsonStream stream)
978
974
}
979
975
}
980
976
981
- private class SendMessagesHelper
977
+ private class SendMessageHelper
982
978
{
983
979
private readonly Stopwatch _commandStopwatch ;
984
980
private readonly BinaryConnection _connection ;
985
981
private readonly MessageEncoderSettings _messageEncoderSettings ;
986
- private readonly List < RequestMessage > _messages ;
987
- private Lazy < List < int > > _requestIds ;
982
+ private readonly RequestMessage _message ;
988
983
private TimeSpan _serializationDuration ;
989
984
private Stopwatch _networkStopwatch ;
990
985
991
- public SendMessagesHelper ( BinaryConnection connection , IEnumerable < RequestMessage > messages , MessageEncoderSettings messageEncoderSettings )
986
+ public SendMessageHelper ( BinaryConnection connection , RequestMessage message , MessageEncoderSettings messageEncoderSettings )
992
987
{
993
988
_connection = connection ;
994
- _messages = messages . ToList ( ) ;
989
+ _message = message ;
995
990
_messageEncoderSettings = messageEncoderSettings ;
996
991
997
992
_commandStopwatch = Stopwatch . StartNew ( ) ;
998
- _requestIds = new Lazy < List < int > > ( ( ) => _messages . Select ( m => m . RequestId ) . ToList ( ) ) ;
999
993
}
1000
994
1001
- public IByteBuffer EncodeMessages ( CancellationToken cancellationToken , out List < RequestMessage > sentMessages )
995
+ public IByteBuffer EncodeMessage ( CancellationToken cancellationToken , out RequestMessage sentMessage )
1002
996
{
1003
- sentMessages = new List < RequestMessage > ( ) ;
997
+ sentMessage = null ;
1004
998
cancellationToken . ThrowIfCancellationRequested ( ) ;
1005
999
1006
1000
var serializationStopwatch = Stopwatch . StartNew ( ) ;
@@ -1009,21 +1003,17 @@ public IByteBuffer EncodeMessages(CancellationToken cancellationToken, out List<
1009
1003
using ( var stream = new ByteBufferStream ( buffer , ownsBuffer : false ) )
1010
1004
{
1011
1005
var encoderFactory = new BinaryMessageEncoderFactory ( stream , _messageEncoderSettings , compressorSource : null ) ;
1012
- foreach ( var message in _messages )
1013
- {
1014
- if ( message . ShouldBeSent == null || message . ShouldBeSent ( ) )
1015
- {
1016
- var encoder = message . GetEncoder ( encoderFactory ) ;
1017
- encoder . WriteMessage ( message ) ;
1018
- message . WasSent = true ;
1019
- sentMessages . Add ( message ) ;
1020
- }
1021
1006
1022
- // Encoding messages includes serializing the
1023
- // documents, so encoding message could be expensive
1024
- // and worthy of us honoring cancellation here.
1025
- cancellationToken . ThrowIfCancellationRequested ( ) ;
1026
- }
1007
+ var encoder = _message . GetEncoder ( encoderFactory ) ;
1008
+ encoder . WriteMessage ( _message ) ;
1009
+ _message . WasSent = true ;
1010
+ sentMessage = _message ;
1011
+
1012
+ // Encoding messages includes serializing the
1013
+ // documents, so encoding message could be expensive
1014
+ // and worthy of us honoring cancellation here.
1015
+ cancellationToken . ThrowIfCancellationRequested ( ) ;
1016
+
1027
1017
buffer . Length = ( int ) stream . Length ;
1028
1018
buffer . MakeReadOnly ( ) ;
1029
1019
}
@@ -1033,42 +1023,42 @@ public IByteBuffer EncodeMessages(CancellationToken cancellationToken, out List<
1033
1023
return buffer ;
1034
1024
}
1035
1025
1036
- public void EncodingMessages ( )
1026
+ public void EncodingMessage ( )
1037
1027
{
1038
- _connection . _eventLogger . LogAndPublish ( new ConnectionSendingMessagesEvent ( _connection . ConnectionId , _requestIds . Value , EventContext . OperationId ) ) ;
1028
+ _connection . _eventLogger . LogAndPublish ( new ConnectionSendingMessagesEvent ( _connection . ConnectionId , _message . RequestId , EventContext . OperationId ) ) ;
1039
1029
}
1040
1030
1041
- public void FailedSendingMessages ( Exception ex )
1031
+ public void FailedSendingMessage ( Exception ex )
1042
1032
{
1043
1033
if ( _connection . _commandEventHelper . ShouldCallErrorSending )
1044
1034
{
1045
- _connection . _commandEventHelper . ErrorSending ( _messages , _connection . _connectionId , _connection . _description ? . ServiceId , ex , _connection . IsInitializing ) ;
1035
+ _connection . _commandEventHelper . ErrorSending ( _message , _connection . _connectionId , _connection . _description ? . ServiceId , ex , _connection . IsInitializing ) ;
1046
1036
}
1047
1037
1048
- _connection . _eventLogger . LogAndPublish ( new ConnectionSendingMessagesFailedEvent ( _connection . ConnectionId , _requestIds . Value , ex , EventContext . OperationId ) ) ;
1038
+ _connection . _eventLogger . LogAndPublish ( new ConnectionSendingMessagesFailedEvent ( _connection . ConnectionId , _message . RequestId , ex , EventContext . OperationId ) ) ;
1049
1039
}
1050
1040
1051
- public void SendingMessages ( IByteBuffer buffer )
1041
+ public void SendingMessage ( IByteBuffer buffer )
1052
1042
{
1053
1043
if ( _connection . _commandEventHelper . ShouldCallBeforeSending )
1054
1044
{
1055
- _connection . _commandEventHelper . BeforeSending ( _messages , _connection . ConnectionId , _connection . Description ? . ServiceId , buffer , _messageEncoderSettings , _commandStopwatch , _connection . IsInitializing ) ;
1045
+ _connection . _commandEventHelper . BeforeSending ( _message , _connection . ConnectionId , _connection . Description ? . ServiceId , buffer , _messageEncoderSettings , _commandStopwatch , _connection . IsInitializing ) ;
1056
1046
}
1057
1047
1058
1048
_networkStopwatch = Stopwatch . StartNew ( ) ;
1059
1049
}
1060
1050
1061
- public void SentMessages ( int bufferLength )
1051
+ public void SentMessage ( int bufferLength )
1062
1052
{
1063
1053
_networkStopwatch . Stop ( ) ;
1064
1054
var networkDuration = _networkStopwatch . Elapsed ;
1065
1055
1066
1056
if ( _connection . _commandEventHelper . ShouldCallAfterSending )
1067
1057
{
1068
- _connection . _commandEventHelper . AfterSending ( _messages , _connection . _connectionId , _connection . Description ? . ServiceId , _connection . IsInitializing ) ;
1058
+ _connection . _commandEventHelper . AfterSending ( _message , _connection . _connectionId , _connection . Description ? . ServiceId , _connection . IsInitializing ) ;
1069
1059
}
1070
1060
1071
- _connection . _eventLogger . LogAndPublish ( new ConnectionSentMessagesEvent ( _connection . ConnectionId , _requestIds . Value , bufferLength , networkDuration , _serializationDuration , EventContext . OperationId ) ) ;
1061
+ _connection . _eventLogger . LogAndPublish ( new ConnectionSentMessagesEvent ( _connection . ConnectionId , _message . RequestId , bufferLength , networkDuration , _serializationDuration , EventContext . OperationId ) ) ;
1072
1062
}
1073
1063
}
1074
1064
0 commit comments