sensu-plugins-mongodb-mrtrotl 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1 -0
  3. data/LICENSE +22 -0
  4. data/README.md +27 -0
  5. data/bin/check-mongodb-metric.rb +144 -0
  6. data/bin/check-mongodb-query-count.rb +267 -0
  7. data/bin/check-mongodb.py +1644 -0
  8. data/bin/check-mongodb.rb +5 -0
  9. data/bin/metrics-mongodb-replication.rb +254 -0
  10. data/bin/metrics-mongodb.rb +133 -0
  11. data/lib/bson/__init__.py +1347 -0
  12. data/lib/bson/__pycache__/__init__.cpython-310.pyc +0 -0
  13. data/lib/bson/__pycache__/_helpers.cpython-310.pyc +0 -0
  14. data/lib/bson/__pycache__/binary.cpython-310.pyc +0 -0
  15. data/lib/bson/__pycache__/code.cpython-310.pyc +0 -0
  16. data/lib/bson/__pycache__/codec_options.cpython-310.pyc +0 -0
  17. data/lib/bson/__pycache__/dbref.cpython-310.pyc +0 -0
  18. data/lib/bson/__pycache__/decimal128.cpython-310.pyc +0 -0
  19. data/lib/bson/__pycache__/errors.cpython-310.pyc +0 -0
  20. data/lib/bson/__pycache__/int64.cpython-310.pyc +0 -0
  21. data/lib/bson/__pycache__/json_util.cpython-310.pyc +0 -0
  22. data/lib/bson/__pycache__/max_key.cpython-310.pyc +0 -0
  23. data/lib/bson/__pycache__/min_key.cpython-310.pyc +0 -0
  24. data/lib/bson/__pycache__/objectid.cpython-310.pyc +0 -0
  25. data/lib/bson/__pycache__/raw_bson.cpython-310.pyc +0 -0
  26. data/lib/bson/__pycache__/regex.cpython-310.pyc +0 -0
  27. data/lib/bson/__pycache__/son.cpython-310.pyc +0 -0
  28. data/lib/bson/__pycache__/timestamp.cpython-310.pyc +0 -0
  29. data/lib/bson/__pycache__/tz_util.cpython-310.pyc +0 -0
  30. data/lib/bson/_cbson.cpython-310-x86_64-linux-gnu.so +0 -0
  31. data/lib/bson/_helpers.py +41 -0
  32. data/lib/bson/binary.py +364 -0
  33. data/lib/bson/code.py +101 -0
  34. data/lib/bson/codec_options.py +414 -0
  35. data/lib/bson/codec_options.pyi +100 -0
  36. data/lib/bson/dbref.py +133 -0
  37. data/lib/bson/decimal128.py +314 -0
  38. data/lib/bson/errors.py +35 -0
  39. data/lib/bson/int64.py +39 -0
  40. data/lib/bson/json_util.py +874 -0
  41. data/lib/bson/max_key.py +55 -0
  42. data/lib/bson/min_key.py +55 -0
  43. data/lib/bson/objectid.py +286 -0
  44. data/lib/bson/py.typed +2 -0
  45. data/lib/bson/raw_bson.py +175 -0
  46. data/lib/bson/regex.py +135 -0
  47. data/lib/bson/son.py +208 -0
  48. data/lib/bson/timestamp.py +124 -0
  49. data/lib/bson/tz_util.py +52 -0
  50. data/lib/gridfs/__init__.py +1015 -0
  51. data/lib/gridfs/__pycache__/__init__.cpython-310.pyc +0 -0
  52. data/lib/gridfs/__pycache__/errors.cpython-310.pyc +0 -0
  53. data/lib/gridfs/__pycache__/grid_file.cpython-310.pyc +0 -0
  54. data/lib/gridfs/errors.py +33 -0
  55. data/lib/gridfs/grid_file.py +907 -0
  56. data/lib/gridfs/py.typed +2 -0
  57. data/lib/pymongo/__init__.py +185 -0
  58. data/lib/pymongo/__pycache__/__init__.cpython-310.pyc +0 -0
  59. data/lib/pymongo/__pycache__/_csot.cpython-310.pyc +0 -0
  60. data/lib/pymongo/__pycache__/aggregation.cpython-310.pyc +0 -0
  61. data/lib/pymongo/__pycache__/auth.cpython-310.pyc +0 -0
  62. data/lib/pymongo/__pycache__/auth_aws.cpython-310.pyc +0 -0
  63. data/lib/pymongo/__pycache__/bulk.cpython-310.pyc +0 -0
  64. data/lib/pymongo/__pycache__/change_stream.cpython-310.pyc +0 -0
  65. data/lib/pymongo/__pycache__/client_options.cpython-310.pyc +0 -0
  66. data/lib/pymongo/__pycache__/client_session.cpython-310.pyc +0 -0
  67. data/lib/pymongo/__pycache__/collation.cpython-310.pyc +0 -0
  68. data/lib/pymongo/__pycache__/collection.cpython-310.pyc +0 -0
  69. data/lib/pymongo/__pycache__/command_cursor.cpython-310.pyc +0 -0
  70. data/lib/pymongo/__pycache__/common.cpython-310.pyc +0 -0
  71. data/lib/pymongo/__pycache__/compression_support.cpython-310.pyc +0 -0
  72. data/lib/pymongo/__pycache__/cursor.cpython-310.pyc +0 -0
  73. data/lib/pymongo/__pycache__/daemon.cpython-310.pyc +0 -0
  74. data/lib/pymongo/__pycache__/database.cpython-310.pyc +0 -0
  75. data/lib/pymongo/__pycache__/driver_info.cpython-310.pyc +0 -0
  76. data/lib/pymongo/__pycache__/encryption.cpython-310.pyc +0 -0
  77. data/lib/pymongo/__pycache__/encryption_options.cpython-310.pyc +0 -0
  78. data/lib/pymongo/__pycache__/errors.cpython-310.pyc +0 -0
  79. data/lib/pymongo/__pycache__/event_loggers.cpython-310.pyc +0 -0
  80. data/lib/pymongo/__pycache__/hello.cpython-310.pyc +0 -0
  81. data/lib/pymongo/__pycache__/helpers.cpython-310.pyc +0 -0
  82. data/lib/pymongo/__pycache__/max_staleness_selectors.cpython-310.pyc +0 -0
  83. data/lib/pymongo/__pycache__/message.cpython-310.pyc +0 -0
  84. data/lib/pymongo/__pycache__/mongo_client.cpython-310.pyc +0 -0
  85. data/lib/pymongo/__pycache__/monitor.cpython-310.pyc +0 -0
  86. data/lib/pymongo/__pycache__/monitoring.cpython-310.pyc +0 -0
  87. data/lib/pymongo/__pycache__/network.cpython-310.pyc +0 -0
  88. data/lib/pymongo/__pycache__/ocsp_cache.cpython-310.pyc +0 -0
  89. data/lib/pymongo/__pycache__/ocsp_support.cpython-310.pyc +0 -0
  90. data/lib/pymongo/__pycache__/operations.cpython-310.pyc +0 -0
  91. data/lib/pymongo/__pycache__/periodic_executor.cpython-310.pyc +0 -0
  92. data/lib/pymongo/__pycache__/pool.cpython-310.pyc +0 -0
  93. data/lib/pymongo/__pycache__/pyopenssl_context.cpython-310.pyc +0 -0
  94. data/lib/pymongo/__pycache__/read_concern.cpython-310.pyc +0 -0
  95. data/lib/pymongo/__pycache__/read_preferences.cpython-310.pyc +0 -0
  96. data/lib/pymongo/__pycache__/response.cpython-310.pyc +0 -0
  97. data/lib/pymongo/__pycache__/results.cpython-310.pyc +0 -0
  98. data/lib/pymongo/__pycache__/saslprep.cpython-310.pyc +0 -0
  99. data/lib/pymongo/__pycache__/server.cpython-310.pyc +0 -0
  100. data/lib/pymongo/__pycache__/server_api.cpython-310.pyc +0 -0
  101. data/lib/pymongo/__pycache__/server_description.cpython-310.pyc +0 -0
  102. data/lib/pymongo/__pycache__/server_selectors.cpython-310.pyc +0 -0
  103. data/lib/pymongo/__pycache__/server_type.cpython-310.pyc +0 -0
  104. data/lib/pymongo/__pycache__/settings.cpython-310.pyc +0 -0
  105. data/lib/pymongo/__pycache__/socket_checker.cpython-310.pyc +0 -0
  106. data/lib/pymongo/__pycache__/srv_resolver.cpython-310.pyc +0 -0
  107. data/lib/pymongo/__pycache__/ssl_context.cpython-310.pyc +0 -0
  108. data/lib/pymongo/__pycache__/ssl_support.cpython-310.pyc +0 -0
  109. data/lib/pymongo/__pycache__/topology.cpython-310.pyc +0 -0
  110. data/lib/pymongo/__pycache__/topology_description.cpython-310.pyc +0 -0
  111. data/lib/pymongo/__pycache__/typings.cpython-310.pyc +0 -0
  112. data/lib/pymongo/__pycache__/uri_parser.cpython-310.pyc +0 -0
  113. data/lib/pymongo/__pycache__/write_concern.cpython-310.pyc +0 -0
  114. data/lib/pymongo/_cmessage.cpython-310-x86_64-linux-gnu.so +0 -0
  115. data/lib/pymongo/_csot.py +118 -0
  116. data/lib/pymongo/aggregation.py +229 -0
  117. data/lib/pymongo/auth.py +549 -0
  118. data/lib/pymongo/auth_aws.py +94 -0
  119. data/lib/pymongo/bulk.py +513 -0
  120. data/lib/pymongo/change_stream.py +457 -0
  121. data/lib/pymongo/client_options.py +302 -0
  122. data/lib/pymongo/client_session.py +1112 -0
  123. data/lib/pymongo/collation.py +224 -0
  124. data/lib/pymongo/collection.py +3204 -0
  125. data/lib/pymongo/command_cursor.py +353 -0
  126. data/lib/pymongo/common.py +984 -0
  127. data/lib/pymongo/compression_support.py +149 -0
  128. data/lib/pymongo/cursor.py +1345 -0
  129. data/lib/pymongo/daemon.py +141 -0
  130. data/lib/pymongo/database.py +1202 -0
  131. data/lib/pymongo/driver_info.py +42 -0
  132. data/lib/pymongo/encryption.py +884 -0
  133. data/lib/pymongo/encryption_options.py +221 -0
  134. data/lib/pymongo/errors.py +365 -0
  135. data/lib/pymongo/event_loggers.py +221 -0
  136. data/lib/pymongo/hello.py +219 -0
  137. data/lib/pymongo/helpers.py +259 -0
  138. data/lib/pymongo/max_staleness_selectors.py +114 -0
  139. data/lib/pymongo/message.py +1440 -0
  140. data/lib/pymongo/mongo_client.py +2144 -0
  141. data/lib/pymongo/monitor.py +440 -0
  142. data/lib/pymongo/monitoring.py +1801 -0
  143. data/lib/pymongo/network.py +311 -0
  144. data/lib/pymongo/ocsp_cache.py +87 -0
  145. data/lib/pymongo/ocsp_support.py +372 -0
  146. data/lib/pymongo/operations.py +507 -0
  147. data/lib/pymongo/periodic_executor.py +183 -0
  148. data/lib/pymongo/pool.py +1660 -0
  149. data/lib/pymongo/py.typed +2 -0
  150. data/lib/pymongo/pyopenssl_context.py +383 -0
  151. data/lib/pymongo/read_concern.py +75 -0
  152. data/lib/pymongo/read_preferences.py +609 -0
  153. data/lib/pymongo/response.py +109 -0
  154. data/lib/pymongo/results.py +217 -0
  155. data/lib/pymongo/saslprep.py +113 -0
  156. data/lib/pymongo/server.py +247 -0
  157. data/lib/pymongo/server_api.py +170 -0
  158. data/lib/pymongo/server_description.py +285 -0
  159. data/lib/pymongo/server_selectors.py +153 -0
  160. data/lib/pymongo/server_type.py +32 -0
  161. data/lib/pymongo/settings.py +159 -0
  162. data/lib/pymongo/socket_checker.py +104 -0
  163. data/lib/pymongo/srv_resolver.py +126 -0
  164. data/lib/pymongo/ssl_context.py +39 -0
  165. data/lib/pymongo/ssl_support.py +99 -0
  166. data/lib/pymongo/topology.py +890 -0
  167. data/lib/pymongo/topology_description.py +639 -0
  168. data/lib/pymongo/typings.py +39 -0
  169. data/lib/pymongo/uri_parser.py +624 -0
  170. data/lib/pymongo/write_concern.py +129 -0
  171. data/lib/pymongo-4.2.0.dist-info/INSTALLER +1 -0
  172. data/lib/pymongo-4.2.0.dist-info/LICENSE +201 -0
  173. data/lib/pymongo-4.2.0.dist-info/METADATA +250 -0
  174. data/lib/pymongo-4.2.0.dist-info/RECORD +167 -0
  175. data/lib/pymongo-4.2.0.dist-info/REQUESTED +0 -0
  176. data/lib/pymongo-4.2.0.dist-info/WHEEL +6 -0
  177. data/lib/pymongo-4.2.0.dist-info/top_level.txt +3 -0
  178. data/lib/sensu-plugins-mongodb/metrics.rb +391 -0
  179. data/lib/sensu-plugins-mongodb/version.rb +9 -0
  180. data/lib/sensu-plugins-mongodb.rb +1 -0
  181. metadata +407 -0
@@ -0,0 +1,2 @@
1
+ # PEP-561 Support File.
2
+ # "Package maintainers who wish to support type checking of their code MUST add a marker file named py.typed to their package supporting typing".
@@ -0,0 +1,185 @@
1
+ # Copyright 2009-present MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Python driver for MongoDB."""
16
+
17
+ from typing import ContextManager, Optional, Tuple, Union
18
+
19
+ __all__ = [
20
+ "ASCENDING",
21
+ "DESCENDING",
22
+ "GEO2D",
23
+ "GEOSPHERE",
24
+ "HASHED",
25
+ "TEXT",
26
+ "version_tuple",
27
+ "get_version_string",
28
+ "__version__",
29
+ "version",
30
+ "ReturnDocument",
31
+ "MAX_SUPPORTED_WIRE_VERSION",
32
+ "MIN_SUPPORTED_WIRE_VERSION",
33
+ "CursorType",
34
+ "MongoClient",
35
+ "DeleteMany",
36
+ "DeleteOne",
37
+ "IndexModel",
38
+ "InsertOne",
39
+ "ReplaceOne",
40
+ "UpdateMany",
41
+ "UpdateOne",
42
+ "ReadPreference",
43
+ "WriteConcern",
44
+ "has_c",
45
+ "timeout",
46
+ ]
47
+
48
+ ASCENDING = 1
49
+ """Ascending sort order."""
50
+ DESCENDING = -1
51
+ """Descending sort order."""
52
+
53
+ GEO2D = "2d"
54
+ """Index specifier for a 2-dimensional `geospatial index`_.
55
+
56
+ .. _geospatial index: http://mongodb.com/docs/manual/core/2d/
57
+ """
58
+
59
+ GEOSPHERE = "2dsphere"
60
+ """Index specifier for a `spherical geospatial index`_.
61
+
62
+ .. versionadded:: 2.5
63
+
64
+ .. _spherical geospatial index: http://mongodb.com/docs/manual/core/2dsphere/
65
+ """
66
+
67
+ HASHED = "hashed"
68
+ """Index specifier for a `hashed index`_.
69
+
70
+ .. versionadded:: 2.5
71
+
72
+ .. _hashed index: http://mongodb.com/docs/manual/core/index-hashed/
73
+ """
74
+
75
+ TEXT = "text"
76
+ """Index specifier for a `text index`_.
77
+
78
+ .. seealso:: MongoDB's `Atlas Search
79
+ <https://docs.atlas.mongodb.com/atlas-search/>`_ which offers more advanced
80
+ text search functionality.
81
+
82
+ .. versionadded:: 2.7.1
83
+
84
+ .. _text index: http://mongodb.com/docs/manual/core/index-text/
85
+ """
86
+
87
+ version_tuple: Tuple[Union[int, str], ...] = (4, 2, 0)
88
+
89
+
90
+ def get_version_string() -> str:
91
+ if isinstance(version_tuple[-1], str):
92
+ return ".".join(map(str, version_tuple[:-1])) + version_tuple[-1]
93
+ return ".".join(map(str, version_tuple))
94
+
95
+
96
+ __version__: str = get_version_string()
97
+ version = __version__
98
+
99
+ """Current version of PyMongo."""
100
+
101
+ from pymongo import _csot
102
+ from pymongo.collection import ReturnDocument
103
+ from pymongo.common import MAX_SUPPORTED_WIRE_VERSION, MIN_SUPPORTED_WIRE_VERSION
104
+ from pymongo.cursor import CursorType
105
+ from pymongo.mongo_client import MongoClient
106
+ from pymongo.operations import (
107
+ DeleteMany,
108
+ DeleteOne,
109
+ IndexModel,
110
+ InsertOne,
111
+ ReplaceOne,
112
+ UpdateMany,
113
+ UpdateOne,
114
+ )
115
+ from pymongo.read_preferences import ReadPreference
116
+ from pymongo.write_concern import WriteConcern
117
+
118
+
119
+ def has_c() -> bool:
120
+ """Is the C extension installed?"""
121
+ try:
122
+ from pymongo import _cmessage # type: ignore[attr-defined] # noqa: F401
123
+
124
+ return True
125
+ except ImportError:
126
+ return False
127
+
128
+
129
+ def timeout(seconds: Optional[float]) -> ContextManager:
130
+ """**(Provisional)** Apply the given timeout for a block of operations.
131
+
132
+ .. note:: :func:`~pymongo.timeout` is currently provisional. Backwards
133
+ incompatible changes may occur before becoming officially supported.
134
+
135
+ Use :func:`~pymongo.timeout` in a with-statement::
136
+
137
+ with pymongo.timeout(5):
138
+ client.db.coll.insert_one({})
139
+ client.db.coll2.insert_one({})
140
+
141
+ When the with-statement is entered, a deadline is set for the entire
142
+ block. When that deadline is exceeded, any blocking pymongo operation
143
+ will raise a timeout exception. For example::
144
+
145
+ try:
146
+ with pymongo.timeout(5):
147
+ client.db.coll.insert_one({})
148
+ time.sleep(5)
149
+ # The deadline has now expired, the next operation will raise
150
+ # a timeout exception.
151
+ client.db.coll2.insert_one({})
152
+ except PyMongoError as exc:
153
+ if exc.timeout:
154
+ print(f"block timed out: {exc!r}")
155
+ else:
156
+ print(f"failed with non-timeout error: {exc!r}")
157
+
158
+ When nesting :func:`~pymongo.timeout`, the newly computed deadline is capped to at most
159
+ the existing deadline. The deadline can only be shortened, not extended.
160
+ When exiting the block, the previous deadline is restored::
161
+
162
+ with pymongo.timeout(5):
163
+ coll.find_one() # Uses the 5 second deadline.
164
+ with pymongo.timeout(3):
165
+ coll.find_one() # Uses the 3 second deadline.
166
+ coll.find_one() # Uses the original 5 second deadline.
167
+ with pymongo.timeout(10):
168
+ coll.find_one() # Still uses the original 5 second deadline.
169
+ coll.find_one() # Uses the original 5 second deadline.
170
+
171
+ :Parameters:
172
+ - `seconds`: A non-negative floating point number expressing seconds, or None.
173
+
174
+ :Raises:
175
+ - :py:class:`ValueError`: When `seconds` is negative.
176
+
177
+ .. versionadded:: 4.2
178
+ """
179
+ if not isinstance(seconds, (int, float, type(None))):
180
+ raise TypeError("timeout must be None, an int, or a float")
181
+ if seconds and seconds < 0:
182
+ raise ValueError("timeout cannot be negative")
183
+ if seconds is not None:
184
+ seconds = float(seconds)
185
+ return _csot._TimeoutContext(seconds)
@@ -0,0 +1,118 @@
1
+ # Copyright 2022-present MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"); you
4
+ # may not use this file except in compliance with the License. You
5
+ # may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
12
+ # implied. See the License for the specific language governing
13
+ # permissions and limitations under the License.
14
+
15
+ """Internal helpers for CSOT."""
16
+
17
+ import functools
18
+ import time
19
+ from contextvars import ContextVar, Token
20
+ from typing import Any, Callable, MutableMapping, Optional, Tuple, TypeVar, cast
21
+
22
+ from pymongo.write_concern import WriteConcern
23
+
24
+ TIMEOUT: ContextVar[Optional[float]] = ContextVar("TIMEOUT", default=None)
25
+ RTT: ContextVar[float] = ContextVar("RTT", default=0.0)
26
+ DEADLINE: ContextVar[float] = ContextVar("DEADLINE", default=float("inf"))
27
+
28
+
29
+ def get_timeout() -> Optional[float]:
30
+ return TIMEOUT.get(None)
31
+
32
+
33
+ def get_rtt() -> float:
34
+ return RTT.get()
35
+
36
+
37
+ def get_deadline() -> float:
38
+ return DEADLINE.get()
39
+
40
+
41
+ def set_rtt(rtt: float) -> None:
42
+ RTT.set(rtt)
43
+
44
+
45
+ def remaining() -> Optional[float]:
46
+ if not get_timeout():
47
+ return None
48
+ return DEADLINE.get() - time.monotonic()
49
+
50
+
51
+ def clamp_remaining(max_timeout: float) -> float:
52
+ """Return the remaining timeout clamped to a max value."""
53
+ timeout = remaining()
54
+ if timeout is None:
55
+ return max_timeout
56
+ return min(timeout, max_timeout)
57
+
58
+
59
+ class _TimeoutContext(object):
60
+ """Internal timeout context manager.
61
+
62
+ Use :func:`pymongo.timeout` instead::
63
+
64
+ with pymongo.timeout(0.5):
65
+ client.test.test.insert_one({})
66
+ """
67
+
68
+ __slots__ = ("_timeout", "_tokens")
69
+
70
+ def __init__(self, timeout: Optional[float]):
71
+ self._timeout = timeout
72
+ self._tokens: Optional[Tuple[Token, Token, Token]] = None
73
+
74
+ def __enter__(self):
75
+ timeout_token = TIMEOUT.set(self._timeout)
76
+ prev_deadline = DEADLINE.get()
77
+ next_deadline = time.monotonic() + self._timeout if self._timeout else float("inf")
78
+ deadline_token = DEADLINE.set(min(prev_deadline, next_deadline))
79
+ rtt_token = RTT.set(0.0)
80
+ self._tokens = (timeout_token, deadline_token, rtt_token)
81
+ return self
82
+
83
+ def __exit__(self, exc_type, exc_val, exc_tb):
84
+ if self._tokens:
85
+ timeout_token, deadline_token, rtt_token = self._tokens
86
+ TIMEOUT.reset(timeout_token)
87
+ DEADLINE.reset(deadline_token)
88
+ RTT.reset(rtt_token)
89
+
90
+
91
+ # See https://mypy.readthedocs.io/en/stable/generics.html?#decorator-factories
92
+ F = TypeVar("F", bound=Callable[..., Any])
93
+
94
+
95
+ def apply(func: F) -> F:
96
+ """Apply the client's timeoutMS to this operation."""
97
+
98
+ @functools.wraps(func)
99
+ def csot_wrapper(self, *args, **kwargs):
100
+ if get_timeout() is None:
101
+ timeout = self._timeout
102
+ if timeout is not None:
103
+ with _TimeoutContext(timeout):
104
+ return func(self, *args, **kwargs)
105
+ return func(self, *args, **kwargs)
106
+
107
+ return cast(F, csot_wrapper)
108
+
109
+
110
+ def apply_write_concern(cmd: MutableMapping, write_concern: Optional[WriteConcern]) -> None:
111
+ """Apply the given write concern to a command."""
112
+ if not write_concern or write_concern.is_server_default:
113
+ return
114
+ wc = write_concern.document
115
+ if get_timeout() is not None:
116
+ wc.pop("wtimeout", None)
117
+ if wc:
118
+ cmd["writeConcern"] = wc