@@ -993,23 +993,30 @@ public virtual void Reconnect()
993
993
/// </summary>
994
994
public virtual void RequestDone ( )
995
995
{
996
+ int threadId = Thread . CurrentThread . ManagedThreadId ;
997
+ MongoConnection connectionToRelease = null ;
998
+
996
999
lock ( _serverLock )
997
1000
{
998
- int threadId = Thread . CurrentThread . ManagedThreadId ;
999
1001
Request request ;
1000
1002
if ( _requests . TryGetValue ( threadId , out request ) )
1001
1003
{
1002
1004
if ( -- request . NestingLevel == 0 )
1003
1005
{
1004
1006
_requests . Remove ( threadId ) ;
1005
- ReleaseConnection ( request . Connection ) ;
1007
+ connectionToRelease = request . Connection ;
1006
1008
}
1007
1009
}
1008
1010
else
1009
1011
{
1010
1012
throw new InvalidOperationException ( "Thread is not in a request (did you call RequestStart?)." ) ;
1011
1013
}
1012
1014
}
1015
+
1016
+ if ( connectionToRelease != null )
1017
+ {
1018
+ connectionToRelease . ServerInstance . ReleaseConnection ( connectionToRelease ) ;
1019
+ }
1013
1020
}
1014
1021
1015
1022
/// <summary>
@@ -1034,9 +1041,10 @@ public virtual IDisposable RequestStart(MongoDatabase initialDatabase)
1034
1041
/// <returns>A helper object that implements IDisposable and calls <see cref="RequestDone"/> from the Dispose method.</returns>
1035
1042
public virtual IDisposable RequestStart ( MongoDatabase initialDatabase , bool slaveOk )
1036
1043
{
1044
+ int threadId = Thread . CurrentThread . ManagedThreadId ;
1045
+
1037
1046
lock ( _serverLock )
1038
1047
{
1039
- int threadId = Thread . CurrentThread . ManagedThreadId ;
1040
1048
Request request ;
1041
1049
if ( _requests . TryGetValue ( threadId , out request ) )
1042
1050
{
@@ -1045,15 +1053,18 @@ public virtual IDisposable RequestStart(MongoDatabase initialDatabase, bool slav
1045
1053
throw new InvalidOperationException ( "A nested call to RequestStart with slaveOk false is not allowed when the original call to RequestStart was made with slaveOk true." ) ;
1046
1054
}
1047
1055
request . NestingLevel ++ ;
1048
- }
1049
- else
1050
- {
1051
- var serverInstance = ChooseServerInstance ( slaveOk ) ;
1052
- var connection = serverInstance . AcquireConnection ( initialDatabase ) ;
1053
- request = new Request ( connection , slaveOk ) ;
1054
- _requests . Add ( threadId , request ) ;
1056
+ return new RequestStartResult ( this ) ;
1055
1057
}
1056
1058
1059
+ }
1060
+
1061
+ var serverInstance = ChooseServerInstance ( slaveOk ) ;
1062
+ var connection = serverInstance . AcquireConnection ( initialDatabase ) ;
1063
+
1064
+ lock ( _serverLock )
1065
+ {
1066
+ var request = new Request ( connection , slaveOk ) ;
1067
+ _requests . Add ( threadId , request ) ;
1057
1068
return new RequestStartResult ( this ) ;
1058
1069
}
1059
1070
}
@@ -1068,9 +1079,10 @@ public virtual IDisposable RequestStart(MongoDatabase initialDatabase, bool slav
1068
1079
/// <returns>A helper object that implements IDisposable and calls <see cref="RequestDone"/> from the Dispose method.</returns>
1069
1080
public virtual IDisposable RequestStart ( MongoDatabase initialDatabase , MongoServerInstance serverInstance )
1070
1081
{
1082
+ int threadId = Thread . CurrentThread . ManagedThreadId ;
1083
+
1071
1084
lock ( _serverLock )
1072
1085
{
1073
- int threadId = Thread . CurrentThread . ManagedThreadId ;
1074
1086
Request request ;
1075
1087
if ( _requests . TryGetValue ( threadId , out request ) )
1076
1088
{
@@ -1079,15 +1091,17 @@ public virtual IDisposable RequestStart(MongoDatabase initialDatabase, MongoServ
1079
1091
throw new InvalidOperationException ( "The server instance passed to a nested call to RequestStart does not match the server instance of the current Request." ) ;
1080
1092
}
1081
1093
request . NestingLevel ++ ;
1094
+ return new RequestStartResult ( this ) ;
1082
1095
}
1083
- else
1084
- {
1085
- var connection = serverInstance . AcquireConnection ( initialDatabase ) ;
1086
- var slaveOk = serverInstance . IsSecondary ;
1087
- request = new Request ( connection , slaveOk ) ;
1088
- _requests . Add ( threadId , request ) ;
1089
- }
1096
+ }
1090
1097
1098
+ var connection = serverInstance . AcquireConnection ( initialDatabase ) ;
1099
+ var slaveOk = serverInstance . IsSecondary ;
1100
+
1101
+ lock ( _serverLock )
1102
+ {
1103
+ var request = new Request ( connection , slaveOk ) ;
1104
+ _requests . Add ( threadId , request ) ;
1091
1105
return new RequestStartResult ( this ) ;
1092
1106
}
1093
1107
}
0 commit comments