From 927c783e20e0ceacb4ddadee1dc7c2416a0d5114 Mon Sep 17 00:00:00 2001 From: Wallace Reis Date: Wed, 7 Nov 2018 23:30:29 +0000 Subject: [PATCH 1/2] Fix typo --- lib/MongoDB/MongoClient.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/MongoDB/MongoClient.pm b/lib/MongoDB/MongoClient.pm index 8a10d65b..b5069de1 100644 --- a/lib/MongoDB/MongoClient.pm +++ b/lib/MongoDB/MongoClient.pm @@ -2024,7 +2024,7 @@ L. =head1 SERVER SELECTION For a single server deployment or a direct connection to a mongod or -mongos, all reads and writes and sent to that server. Any read-preference +mongos, all reads and writes are sent to that server. Any read-preference is ignored. When connected to a deployment with multiple servers, such as a replica set From 2e7dd6a080e080853ad4e8c4ad5c4f4058dc2e91 Mon Sep 17 00:00:00 2001 From: Wallace Reis Date: Wed, 7 Nov 2018 23:31:07 +0000 Subject: [PATCH 2/2] PERL-785: Update logic for idle server Call "ping" on a socket that has been idle for socketCheckIntervalMS. --- lib/MongoDB/MongoClient.pm | 1 + lib/MongoDB/_Topology.pm | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/MongoDB/MongoClient.pm b/lib/MongoDB/MongoClient.pm index b5069de1..94cb487b 100644 --- a/lib/MongoDB/MongoClient.pm +++ b/lib/MongoDB/MongoClient.pm @@ -1193,6 +1193,7 @@ sub _build__topology { monitoring_callback => $self->monitoring_callback, compressors => $self->compressors, zlib_compression_level => $self->zlib_compression_level, + socket_check_interval_sec => $self->socket_check_interval_ms / 1000, ); } diff --git a/lib/MongoDB/_Topology.pm b/lib/MongoDB/_Topology.pm index 14d4440e..a2c5d012 100644 --- a/lib/MongoDB/_Topology.pm +++ b/lib/MongoDB/_Topology.pm @@ -829,6 +829,23 @@ sub _get_server_in_latency_window { return $in_window[ int( rand(@in_window) ) ]->{server}; } +my $PRIMARY = MongoDB::ReadPreference->new(mode => 'primaryPreferred' ); + +sub _ping_server { + my ($self, $link) = @_; + return eval { + my $op = MongoDB::Op::_Command->_new( + db_name => 'admin', + query => [ping => 1], + query_flags => {}, + bson_codec => $self->bson_codec, + read_preference => $PRIMARY, + monitoring_callback => $self->monitoring_callback, + ); + $op->execute( $link )->output; + }; +} + sub _get_server_link { my ( $self, $server, $method, $read_pref ) = @_; my $address = $server->address; @@ -840,6 +857,10 @@ sub _get_server_link { # for idle links, refresh the server and verify validity if ( time - $link->last_used > $self->socket_check_interval_sec ) { + return $link if $self->_ping_server; + $self->mark_server_unknown( + $server, 'Lost connection with the server' + ); $self->check_address($address); # topology might have dropped the server @@ -1018,8 +1039,6 @@ sub _selection_timeout { } } -my $PRIMARY = MongoDB::ReadPreference->new; - sub _generate_ismaster_request { my ( $self, $link, $should_perform_handshake ) = @_; my @opts;