Skip to content

Commit 8663c1c

Browse files
committed
Caches limits from isMaster response
1 parent 110aff7 commit 8663c1c

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

lib/mongo/mongo_db_connection.ex

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ defmodule Mongo.MongoDBConnection do
2525
database: Keyword.fetch!(opts, :database),
2626
write_concern: Map.new(write_concern),
2727
wire_version: nil,
28+
limits: nil,
2829
auth_mechanism: opts[:auth_mechanism] || nil,
2930
connection_type: Keyword.fetch!(opts, :connection_type),
3031
topology_pid: Keyword.fetch!(opts, :topology_pid),
@@ -55,7 +56,9 @@ defmodule Mongo.MongoDBConnection do
5556
end
5657

5758
case result do
58-
{:ok, state} -> {:ok, state}
59+
{:ok, state} ->
60+
# IO.puts inspect state
61+
{:ok, state}
5962

6063
{:disconnect, reason, state} ->
6164
reason = case reason do
@@ -118,13 +121,38 @@ defmodule Mongo.MongoDBConnection do
118121
# wire version
119122
# https://github.com/mongodb/mongo/blob/master/src/mongo/db/wire_version.h
120123
case Utils.command(-1, [ismaster: 1], state) do
121-
{:ok, %{"ok" => ok, "maxWireVersion" => version}} when ok == 1 -> {:ok, %{state | wire_version: version}}
124+
{:ok, %{"ok" => ok, "maxWireVersion" => version} = response} when ok == 1 -> {:ok, %{update_limits(state, response) | wire_version: version}}
122125
{:ok, %{"ok" => ok}} when ok == 1 -> {:ok, %{state | wire_version: 0}}
123126
{:ok, %{"ok" => ok, "errmsg" => msg, "code" => code}} when ok == 0 ->
124127
err = Mongo.Error.exception(message: msg, code: code)
125128
{:disconnect, err, state}
126129
{:disconnect, _, _} = error -> error
127130
end
131+
132+
133+
end
134+
135+
##
136+
#
137+
# Updates the limits from the isMaster response:
138+
#
139+
# isMaster.maxBsonObjectSize / 16 * 1024 * 1024
140+
# isMaster.maxMessageSizeBytes / 48000000
141+
# isMaster.maxWriteBatchSize / 100,000
142+
# isMaster.localTime
143+
# isMaster.compression
144+
# isMaster.readOnly
145+
# isMaster.logicalSessionTimeoutMinutes
146+
#
147+
defp update_limits(state, result) do
148+
limits = %{max_bson_object_size: (result["maxBsonObjectSize"] || 16_777_216),
149+
max_message_size_bytes: (result["maxMessageSizeBytes"] || 48_000_000),
150+
max_write_batch_size: (result["maxWriteBatchSize"] || 100_000),
151+
compression: result["compression"],
152+
read_only: (result["readOnly"] || false),
153+
logical_session_timeout_minutes: result["logicalSessionTimeoutMinutes"]}
154+
155+
%{state | limits: limits}
128156
end
129157

130158
@impl true

0 commit comments

Comments
 (0)