diff --git a/lib/mongo/client.rb b/lib/mongo/client.rb index 70f5768628..ff14b1ab96 100644 --- a/lib/mongo/client.rb +++ b/lib/mongo/client.rb @@ -1317,7 +1317,7 @@ def do_close # # @api private def get_session!(options = {}) - if options[:session] + if options[:session] && !Session.escaped? return options[:session].validate!(self) end diff --git a/lib/mongo/session.rb b/lib/mongo/session.rb index be9c1f2a42..c3a975fc20 100644 --- a/lib/mongo/session.rb +++ b/lib/mongo/session.rb @@ -17,6 +17,7 @@ require 'mongo/session/session_pool' require 'mongo/session/server_session' +require 'mongo/session/session_escapable' module Mongo diff --git a/lib/mongo/session/session_escapable.rb b/lib/mongo/session/session_escapable.rb new file mode 100644 index 0000000000..c42a6a815f --- /dev/null +++ b/lib/mongo/session/session_escapable.rb @@ -0,0 +1,26 @@ + +module Mongo + + class Session + + class << self + def escape + old_escaped = self.escaped? + self.escaped = true + yield + ensure + self.escaped = old_escaped + end + + def escaped? + !!Thread.current["[mongo]:session:escaped"] + end + + private + + def escaped=(value) + Thread.current["[mongo]:session:escaped"] = !!value + end + end + end +end