flwr-nightly 1.16.0.dev20250204__py3-none-any.whl → 1.16.0.dev20250205__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flwr/common/exit_handlers.py +17 -29
- flwr/server/superlink/fleet/grpc_rere/server_interceptor.py +12 -3
- {flwr_nightly-1.16.0.dev20250204.dist-info → flwr_nightly-1.16.0.dev20250205.dist-info}/METADATA +1 -1
- {flwr_nightly-1.16.0.dev20250204.dist-info → flwr_nightly-1.16.0.dev20250205.dist-info}/RECORD +7 -7
- {flwr_nightly-1.16.0.dev20250204.dist-info → flwr_nightly-1.16.0.dev20250205.dist-info}/LICENSE +0 -0
- {flwr_nightly-1.16.0.dev20250204.dist-info → flwr_nightly-1.16.0.dev20250205.dist-info}/WHEEL +0 -0
- {flwr_nightly-1.16.0.dev20250204.dist-info → flwr_nightly-1.16.0.dev20250205.dist-info}/entry_points.txt +0 -0
flwr/common/exit_handlers.py
CHANGED
@@ -15,10 +15,10 @@
|
|
15
15
|
"""Common function to register exit handlers for server and client."""
|
16
16
|
|
17
17
|
|
18
|
-
|
18
|
+
import signal
|
19
19
|
from threading import Thread
|
20
20
|
from types import FrameType
|
21
|
-
from typing import Optional
|
21
|
+
from typing import Callable, Optional
|
22
22
|
|
23
23
|
from grpc import Server
|
24
24
|
|
@@ -26,12 +26,15 @@ from flwr.common.telemetry import EventType
|
|
26
26
|
|
27
27
|
from .exit import ExitCode, flwr_exit
|
28
28
|
|
29
|
-
SIGNAL_TO_EXIT_CODE = {
|
30
|
-
SIGINT: ExitCode.GRACEFUL_EXIT_SIGINT,
|
31
|
-
|
32
|
-
SIGTERM: ExitCode.GRACEFUL_EXIT_SIGTERM,
|
29
|
+
SIGNAL_TO_EXIT_CODE: dict[int, int] = {
|
30
|
+
signal.SIGINT: ExitCode.GRACEFUL_EXIT_SIGINT,
|
31
|
+
signal.SIGTERM: ExitCode.GRACEFUL_EXIT_SIGTERM,
|
33
32
|
}
|
34
33
|
|
34
|
+
# SIGQUIT is not available on Windows
|
35
|
+
if hasattr(signal, "SIGQUIT"):
|
36
|
+
SIGNAL_TO_EXIT_CODE[signal.SIGQUIT] = ExitCode.GRACEFUL_EXIT_SIGQUIT
|
37
|
+
|
35
38
|
|
36
39
|
def register_exit_handlers(
|
37
40
|
event_type: EventType,
|
@@ -54,23 +57,16 @@ def register_exit_handlers(
|
|
54
57
|
An optional list of threads that need to be gracefully
|
55
58
|
terminated before exiting.
|
56
59
|
"""
|
57
|
-
default_handlers = {
|
58
|
-
|
59
|
-
|
60
|
-
SIGTERM: None,
|
61
|
-
}
|
62
|
-
|
63
|
-
def graceful_exit_handler( # type: ignore
|
64
|
-
signalnum,
|
65
|
-
frame: FrameType, # pylint: disable=unused-argument
|
66
|
-
) -> None:
|
60
|
+
default_handlers: dict[int, Callable[[int, FrameType], None]] = {}
|
61
|
+
|
62
|
+
def graceful_exit_handler(signalnum: int, _frame: FrameType) -> None:
|
67
63
|
"""Exit handler to be registered with `signal.signal`.
|
68
64
|
|
69
65
|
When called will reset signal handler to original signal handler from
|
70
66
|
default_handlers.
|
71
67
|
"""
|
72
68
|
# Reset to default handler
|
73
|
-
signal(signalnum, default_handlers[signalnum])
|
69
|
+
signal.signal(signalnum, default_handlers[signalnum]) # type: ignore
|
74
70
|
|
75
71
|
if grpc_servers is not None:
|
76
72
|
for grpc_server in grpc_servers:
|
@@ -87,15 +83,7 @@ def register_exit_handlers(
|
|
87
83
|
event_type=event_type,
|
88
84
|
)
|
89
85
|
|
90
|
-
|
91
|
-
|
92
|
-
graceful_exit_handler
|
93
|
-
|
94
|
-
default_handlers[SIGQUIT] = signal( # type: ignore
|
95
|
-
SIGQUIT,
|
96
|
-
graceful_exit_handler, # type: ignore
|
97
|
-
)
|
98
|
-
default_handlers[SIGTERM] = signal( # type: ignore
|
99
|
-
SIGTERM,
|
100
|
-
graceful_exit_handler, # type: ignore
|
101
|
-
)
|
86
|
+
# Register signal handlers
|
87
|
+
for sig in SIGNAL_TO_EXIT_CODE:
|
88
|
+
default_handler = signal.signal(sig, graceful_exit_handler) # type: ignore
|
89
|
+
default_handlers[sig] = default_handler # type: ignore
|
@@ -43,9 +43,11 @@ MIN_TIMESTAMP_DIFF = -SYSTEM_TIME_TOLERANCE
|
|
43
43
|
MAX_TIMESTAMP_DIFF = TIMESTAMP_TOLERANCE + SYSTEM_TIME_TOLERANCE
|
44
44
|
|
45
45
|
|
46
|
-
def _unary_unary_rpc_terminator(
|
46
|
+
def _unary_unary_rpc_terminator(
|
47
|
+
message: str, code: Any = grpc.StatusCode.UNAUTHENTICATED
|
48
|
+
) -> grpc.RpcMethodHandler:
|
47
49
|
def terminate(_request: GrpcMessage, context: grpc.ServicerContext) -> GrpcMessage:
|
48
|
-
context.abort(
|
50
|
+
context.abort(code, message)
|
49
51
|
raise RuntimeError("Should not reach this point") # Make mypy happy
|
50
52
|
|
51
53
|
return grpc.unary_unary_rpc_method_handler(terminate)
|
@@ -68,7 +70,7 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
|
|
68
70
|
self.state_factory = state_factory
|
69
71
|
self.auto_auth = auto_auth
|
70
72
|
|
71
|
-
def intercept_service(
|
73
|
+
def intercept_service( # pylint: disable=too-many-return-statements
|
72
74
|
self,
|
73
75
|
continuation: Callable[[Any], Any],
|
74
76
|
handler_call_details: grpc.HandlerCallDetails,
|
@@ -79,6 +81,13 @@ class AuthenticateServerInterceptor(grpc.ServerInterceptor): # type: ignore
|
|
79
81
|
metadata sent by the node. Continue RPC call if node is authenticated, else,
|
80
82
|
terminate RPC call by setting context to abort.
|
81
83
|
"""
|
84
|
+
# Filter out non-Fleet service calls
|
85
|
+
if not handler_call_details.method.startswith("/flwr.proto.Fleet/"):
|
86
|
+
return _unary_unary_rpc_terminator(
|
87
|
+
"This request should be sent to a different service.",
|
88
|
+
grpc.StatusCode.FAILED_PRECONDITION,
|
89
|
+
)
|
90
|
+
|
82
91
|
state = self.state_factory.state()
|
83
92
|
metadata_dict = dict(handler_call_details.invocation_metadata)
|
84
93
|
|
{flwr_nightly-1.16.0.dev20250204.dist-info → flwr_nightly-1.16.0.dev20250205.dist-info}/RECORD
RENAMED
@@ -126,7 +126,7 @@ flwr/common/dp.py,sha256=vddkvyjV2FhRoN4VuU2LeAM1UBn7dQB8_W-Qdiveal8,1978
|
|
126
126
|
flwr/common/exit/__init__.py,sha256=-ZOJYLaNnR729a7VzZiFsLiqngzKQh3xc27svYStZ_Q,826
|
127
127
|
flwr/common/exit/exit.py,sha256=DmZFyksp-w1sFDQekq5Z-qfnr-ivCAv78aQkqj-TDps,3458
|
128
128
|
flwr/common/exit/exit_code.py,sha256=PNEnCrZfOILjfDAFu5m-2YWEJBrk97xglq4zCUlqV7E,3470
|
129
|
-
flwr/common/exit_handlers.py,sha256=
|
129
|
+
flwr/common/exit_handlers.py,sha256=yclujry30954o0lI7vtknTajskPCvK8TXw2V3RdldXU,3174
|
130
130
|
flwr/common/grpc.py,sha256=K60AIvIqH0CvkkiqBfw5HoxQfbFOL2DrhKPjbZ8raIE,9786
|
131
131
|
flwr/common/logger.py,sha256=Hund1C6bEhMw3GemlzuFK22tXZ27YeHLrFB0b4LP5f8,13041
|
132
132
|
flwr/common/message.py,sha256=Zv4ID2BLQsbff0F03DI_MeFoHbSqVZAdDD9NcKYv6Zo,13832
|
@@ -280,7 +280,7 @@ flwr/server/superlink/fleet/grpc_bidi/grpc_client_proxy.py,sha256=h3EhqgelegVC4E
|
|
280
280
|
flwr/server/superlink/fleet/grpc_bidi/grpc_server.py,sha256=mxPxyEF0IW0vV41Bqk1zfKOdRDEvXPwzJyMiRMg7nTI,5173
|
281
281
|
flwr/server/superlink/fleet/grpc_rere/__init__.py,sha256=j2hyC342am-_Hgp1g80Y3fGDzfTI6n8QOOn2PyWf4eg,758
|
282
282
|
flwr/server/superlink/fleet/grpc_rere/fleet_servicer.py,sha256=syWWZgsU3PHvIuvSoJxUTbEdkOtyV6psXAbRowNE_yY,5533
|
283
|
-
flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=
|
283
|
+
flwr/server/superlink/fleet/grpc_rere/server_interceptor.py,sha256=KPgAcnYsKPPI7_iYNSnqGbyv4tsqZuBqrTiREwVBJiM,6984
|
284
284
|
flwr/server/superlink/fleet/message_handler/__init__.py,sha256=h8oLD7uo5lKICPy0rRdKRjTYe62u8PKkT_fA4xF5JPA,731
|
285
285
|
flwr/server/superlink/fleet/message_handler/message_handler.py,sha256=DM53K4yLOmzXikTe6i6KJ0v8IvlJKDifvFEV09GFKhI,5510
|
286
286
|
flwr/server/superlink/fleet/rest_rere/__init__.py,sha256=5jbYbAn75sGv-gBwOPDySE0kz96F6dTYLeMrGqNi4lM,735
|
@@ -327,8 +327,8 @@ flwr/superexec/exec_servicer.py,sha256=X10ILT-AoGMrB3IgI2mBe9i-QcIVUAl9bucuqVOPY
|
|
327
327
|
flwr/superexec/exec_user_auth_interceptor.py,sha256=K06OU-l4LnYhTDg071hGJuOaQWEJbZsYi5qxUmmtiG0,3704
|
328
328
|
flwr/superexec/executor.py,sha256=_B55WW2TD1fBINpabSSDRenVHXYmvlfhv-k8hJKU4lQ,3115
|
329
329
|
flwr/superexec/simulation.py,sha256=WQDon15oqpMopAZnwRZoTICYCfHqtkvFSqiTQ2hLD_g,4088
|
330
|
-
flwr_nightly-1.16.0.
|
331
|
-
flwr_nightly-1.16.0.
|
332
|
-
flwr_nightly-1.16.0.
|
333
|
-
flwr_nightly-1.16.0.
|
334
|
-
flwr_nightly-1.16.0.
|
330
|
+
flwr_nightly-1.16.0.dev20250205.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
331
|
+
flwr_nightly-1.16.0.dev20250205.dist-info/METADATA,sha256=WKm99h3uLWPbfmQCecvvugCPsm4Ukwm1Sx5kF4VTvzM,15873
|
332
|
+
flwr_nightly-1.16.0.dev20250205.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
333
|
+
flwr_nightly-1.16.0.dev20250205.dist-info/entry_points.txt,sha256=JlNxX3qhaV18_2yj5a3kJW1ESxm31cal9iS_N_pf1Rk,538
|
334
|
+
flwr_nightly-1.16.0.dev20250205.dist-info/RECORD,,
|
{flwr_nightly-1.16.0.dev20250204.dist-info → flwr_nightly-1.16.0.dev20250205.dist-info}/LICENSE
RENAMED
File without changes
|
{flwr_nightly-1.16.0.dev20250204.dist-info → flwr_nightly-1.16.0.dev20250205.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|