@@ -407,7 +407,7 @@ defmodule Mongo do
407
407
opts = Mongo . retryable_reads ( opts )
408
408
409
409
with { :ok , session } <- Session . start_implicit_session ( topology_pid , :read , opts ) ,
410
- result <- exec_command_session ( session , cmd , opts ) ,
410
+ result <- exec_command_session ( topology_pid , session , cmd , opts ) ,
411
411
:ok <- Session . end_implict_session ( topology_pid , session ) do
412
412
case result do
413
413
{ :error , error } ->
@@ -429,7 +429,7 @@ defmodule Mongo do
429
429
opts = Mongo . retryable_writes ( opts , acknowledged? ( cmd [ :writeConcerns ] ) )
430
430
431
431
with { :ok , session } <- Session . start_implicit_session ( topology_pid , :write , opts ) ,
432
- result <- exec_command_session ( session , cmd , opts ) ,
432
+ result <- exec_command_session ( topology_pid , session , cmd , opts ) ,
433
433
:ok <- Session . end_implict_session ( topology_pid , session ) do
434
434
result
435
435
else
@@ -723,20 +723,28 @@ defmodule Mongo do
723
723
end
724
724
725
725
@ doc false
726
- @ spec exec_command_session ( GenServer . server , BSON . document , Keyword . t ) :: { :ok , BSON . document | nil } | { :error , Mongo.Error . t }
727
- def exec_command_session ( session , cmd , opts ) do
728
- with { :ok , conn , new_cmd } <- Session . bind_session ( session , cmd ) ,
726
+ @ spec exec_command_session ( GenServer . server , GenServer . server , BSON . document , Keyword . t ) :: { :ok , BSON . document | nil } | { :error , Mongo.Error . t }
727
+ def exec_command_session ( topology_pid , session , cmd , opts ) do
728
+ with { :ok , conn , new_cmd , address } <- Session . bind_session ( session , cmd ) ,
729
729
{ :ok , _cmd , { doc , event } } <- DBConnection . execute ( conn , % Query { action: :command } , [ new_cmd ] , defaults ( opts ) ) ,
730
730
doc <- Session . update_session ( session , doc , opts ) ,
731
- { :ok , doc } <- check_for_error ( doc , event ) do
731
+ { :ok , doc } <- check_for_error ( doc , event , address ) do
732
732
{ :ok , doc }
733
733
else
734
734
{ :error , error } ->
735
735
## todo update Topology
736
+ IO . inspect ( error )
737
+ if error . not_master_or_recovering do
738
+ IO . inspect ( "ok" )
739
+ server_description = Mongo.ServerDescription . from_is_master_error ( error . address , error )
740
+ GenServer . cast ( topology_pid , { :server_description , server_description } )
741
+ end
742
+ #require IEx; IEx.pry
743
+ #:debugger.start()
736
744
case Error . should_retry_write ( error , cmd , opts ) do
737
745
true ->
738
746
with :ok <- Session . select_server ( session , opts ) do
739
- exec_command_session ( session , cmd , Keyword . put ( opts , :write_counter , 2 ) )
747
+ exec_command_session ( topology_pid , session , cmd , Keyword . put ( opts , :write_counter , 2 ) )
740
748
end
741
749
false -> { :error , error }
742
750
end
@@ -748,13 +756,13 @@ defmodule Mongo do
748
756
@ spec exec_command ( GenServer . server , BSON . document , Keyword . t ) :: { :ok , BSON . document | nil } | { :error , Mongo.Error . t }
749
757
def exec_command ( conn , cmd , opts ) do
750
758
with { :ok , _cmd , { doc , event } } <- DBConnection . execute ( conn , % Query { action: :command } , [ cmd ] , defaults ( opts ) ) ,
751
- { :ok , doc } <- check_for_error ( doc , event ) do
759
+ { :ok , doc } <- check_for_error ( doc , event , conn ) do
752
760
{ :ok , doc }
753
761
end
754
762
755
763
end
756
764
757
- defp check_for_error ( % { "ok" => ok } = response , { event , duration } ) when ok == 1 do
765
+ defp check_for_error ( % { "ok" => ok } = response , { event , duration } , conn ) when ok == 1 do
758
766
Events . notify ( % CommandSucceededEvent {
759
767
reply: response ,
760
768
duration: duration ,
@@ -765,9 +773,9 @@ defmodule Mongo do
765
773
} , :commands )
766
774
{ :ok , response }
767
775
end
768
- defp check_for_error ( doc , { event , duration } ) do
776
+ defp check_for_error ( doc , { event , duration } , address ) do
769
777
770
- error = Mongo.Error . exception ( doc )
778
+ error = Mongo.Error . exception ( doc , address )
771
779
772
780
Events . notify ( % CommandFailedEvent {
773
781
failure: error ,
0 commit comments