|
12 | 12 | import traceback |
13 | 13 | import socket |
14 | 14 | import fcntl |
| 15 | +from typing import cast |
15 | 16 |
|
16 | 17 | from . import common |
17 | 18 | from . import context |
|
23 | 24 | from werkzeug.serving import make_server, make_ssl_devcert |
24 | 25 |
|
25 | 26 | from .hooks import ErrorHook |
26 | | -from mgr_module import MgrModule, CommandResult, NotifyType |
| 27 | +from mgr_module import MgrModule, CommandResult, NotifyType, Option |
27 | 28 | from mgr_util import build_url |
28 | 29 |
|
29 | 30 |
|
@@ -193,10 +194,18 @@ def __json__(self): |
193 | 194 |
|
194 | 195 | class Module(MgrModule): |
195 | 196 | MODULE_OPTIONS = [ |
196 | | - {'name': 'server_addr'}, |
197 | | - {'name': 'server_port'}, |
198 | | - {'name': 'key_file'}, |
199 | | - {'name': 'enable_auth', 'type': 'bool', 'default': True}, |
| 197 | + Option(name='server_addr'), |
| 198 | + Option(name='server_port'), |
| 199 | + Option(name='key_file'), |
| 200 | + Option(name='enable_auth', |
| 201 | + type='bool', |
| 202 | + default=True), |
| 203 | + Option(name='max_requests', |
| 204 | + type='int', |
| 205 | + default=500, |
| 206 | + desc='Maximum number of requests to keep in memory. ' |
| 207 | + ' When new request comes in, the oldest request will be removed if the number of requests exceeds the max request number.' |
| 208 | + 'if un-finished request is removed, error message will be logged in the ceph-mgr log.'), |
200 | 209 | ] |
201 | 210 |
|
202 | 211 | COMMANDS = [ |
@@ -243,6 +252,7 @@ def __init__(self, *args, **kwargs): |
243 | 252 |
|
244 | 253 | self.stop_server = False |
245 | 254 | self.serve_event = threading.Event() |
| 255 | + self.max_requests = cast(int, self.get_localized_module_option('max_requests', 500)) |
246 | 256 |
|
247 | 257 |
|
248 | 258 | def serve(self): |
@@ -599,6 +609,16 @@ def submit_request(self, _request, **kwargs): |
599 | 609 | with self.requests_lock: |
600 | 610 | request = CommandsRequest(_request) |
601 | 611 | self.requests.append(request) |
| 612 | + if len(self.requests) > self.max_requests: |
| 613 | + req_to_trim = 0 |
| 614 | + for i, req in enumerate(self.requests): |
| 615 | + if req.is_finished(): |
| 616 | + self.log.error("Trimmed one finished request due to exceeded maximum requests limit") |
| 617 | + req_to_trim = i |
| 618 | + break |
| 619 | + else: |
| 620 | + self.log.error("Trimmed the oldest unfinished request due to exceeded maximum requests limit") |
| 621 | + self.requests.pop(req_to_trim) |
602 | 622 | if kwargs.get('wait', 0): |
603 | 623 | while not request.is_finished(): |
604 | 624 | time.sleep(0.001) |
|
0 commit comments