add nested poll check mcp
This commit is contained in:
@@ -6,6 +6,7 @@ import json
|
|||||||
import signal
|
import signal
|
||||||
import ssl
|
import ssl
|
||||||
import threading
|
import threading
|
||||||
|
import time
|
||||||
from urllib import error, request
|
from urllib import error, request
|
||||||
|
|
||||||
|
|
||||||
@@ -16,6 +17,7 @@ def _hard_timeout(seconds: int):
|
|||||||
return
|
return
|
||||||
previous_handler = signal.getsignal(signal.SIGALRM)
|
previous_handler = signal.getsignal(signal.SIGALRM)
|
||||||
previous_timer = signal.getitimer(signal.ITIMER_REAL)
|
previous_timer = signal.getitimer(signal.ITIMER_REAL)
|
||||||
|
started = time.monotonic()
|
||||||
|
|
||||||
def _raise_timeout(_signum, _frame):
|
def _raise_timeout(_signum, _frame):
|
||||||
raise TimeoutError(f"mcp_call_timeout_{seconds}s")
|
raise TimeoutError(f"mcp_call_timeout_{seconds}s")
|
||||||
@@ -25,7 +27,9 @@ def _hard_timeout(seconds: int):
|
|||||||
try:
|
try:
|
||||||
yield
|
yield
|
||||||
finally:
|
finally:
|
||||||
signal.setitimer(signal.ITIMER_REAL, previous_timer[0], previous_timer[1])
|
elapsed = time.monotonic() - started
|
||||||
|
remaining = max(0.0, previous_timer[0] - elapsed) if previous_timer[0] else 0.0
|
||||||
|
signal.setitimer(signal.ITIMER_REAL, remaining, previous_timer[1])
|
||||||
signal.signal(signal.SIGALRM, previous_handler)
|
signal.signal(signal.SIGALRM, previous_handler)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ def _cycle_timeout(seconds: int):
|
|||||||
return
|
return
|
||||||
previous_handler = signal.getsignal(signal.SIGALRM)
|
previous_handler = signal.getsignal(signal.SIGALRM)
|
||||||
previous_timer = signal.getitimer(signal.ITIMER_REAL)
|
previous_timer = signal.getitimer(signal.ITIMER_REAL)
|
||||||
|
started = time.monotonic()
|
||||||
|
|
||||||
def _raise_timeout(_signum, _frame):
|
def _raise_timeout(_signum, _frame):
|
||||||
raise TimeoutError(f"status_cycle_timeout_{seconds}s")
|
raise TimeoutError(f"status_cycle_timeout_{seconds}s")
|
||||||
@@ -47,7 +48,9 @@ def _cycle_timeout(seconds: int):
|
|||||||
try:
|
try:
|
||||||
yield
|
yield
|
||||||
finally:
|
finally:
|
||||||
signal.setitimer(signal.ITIMER_REAL, previous_timer[0], previous_timer[1])
|
elapsed = time.monotonic() - started
|
||||||
|
remaining = max(0.0, previous_timer[0] - elapsed) if previous_timer[0] else 0.0
|
||||||
|
signal.setitimer(signal.ITIMER_REAL, remaining, previous_timer[1])
|
||||||
signal.signal(signal.SIGALRM, previous_handler)
|
signal.signal(signal.SIGALRM, previous_handler)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import json
|
import json
|
||||||
|
import signal
|
||||||
import unittest
|
import unittest
|
||||||
from urllib.error import HTTPError
|
from urllib.error import HTTPError
|
||||||
from unittest.mock import Mock, patch
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
from fgai.graylog_mcp import GraylogMcpClient
|
from fgai.graylog_mcp import GraylogMcpClient, _hard_timeout
|
||||||
|
|
||||||
|
|
||||||
class _Response:
|
class _Response:
|
||||||
@@ -83,6 +84,21 @@ class GraylogMcpTests(unittest.TestCase):
|
|||||||
self.assertEqual(opener.open.call_args.kwargs["timeout"], 15)
|
self.assertEqual(opener.open.call_args.kwargs["timeout"], 15)
|
||||||
self.assertEqual(build_opener.call_args.args[0].proxies, {})
|
self.assertEqual(build_opener.call_args.args[0].proxies, {})
|
||||||
|
|
||||||
|
def test_hard_timeout_preserves_outer_timer_remaining_time(self):
|
||||||
|
previous_handler = signal.getsignal(signal.SIGALRM)
|
||||||
|
previous_timer = signal.getitimer(signal.ITIMER_REAL)
|
||||||
|
try:
|
||||||
|
signal.setitimer(signal.ITIMER_REAL, 20)
|
||||||
|
with patch("fgai.graylog_mcp.time.monotonic", side_effect=[100.0, 103.0]):
|
||||||
|
with _hard_timeout(5):
|
||||||
|
pass
|
||||||
|
remaining = signal.getitimer(signal.ITIMER_REAL)[0]
|
||||||
|
self.assertGreater(remaining, 16)
|
||||||
|
self.assertLessEqual(remaining, 17.5)
|
||||||
|
finally:
|
||||||
|
signal.setitimer(signal.ITIMER_REAL, previous_timer[0], previous_timer[1])
|
||||||
|
signal.signal(signal.SIGALRM, previous_handler)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Reference in New Issue
Block a user