#7651·flower

push_messages() raises IndexError on an empty messages_list instead of the no-op the servicer expects

Author: Atishyy27Created Jul 20, 2026Updated Jul 20, 2026

Describe the bug

push_messages() in framework/py/flwr/server/superlink/fleet/message_handler/message_handler.py indexes request.messages_list[0] unconditionally. An empty messages_list is a legitimate request: Fleet.PushMessages in fleet_servicer.py already has an explicit branch for it and logs "No replies to push", but it still calls push_messages() regardless, which then raises IndexError.

Steps/Code to Reproduce

python
from flwr.proto.fleet_pb2 import PushMessagesRequest
from flwr.server.superlink.fleet.message_handler.message_handler import push_messages
from flwr.server.superlink.linkstate.linkstate_factory import LinkStateFactory
from flwr.supercore.constant import FLWR_IN_MEMORY_DB_NAME
from flwr.supercore.object_store import ObjectStoreFactory
from flwr.superlink.federation import NoOpFederationManager

state = LinkStateFactory(FLWR_IN_MEMORY_DB_NAME, NoOpFederationManager(), ObjectStoreFactory()).state()
push_messages(request=PushMessagesRequest(messages_list=[], message_object_trees=[]), state=state)

Output:

IndexError: list index out of range

Expected Results

An empty messages_list should return a no-op PushMessagesResponse, matching what the servicer's own log message already implies happens.

Actual Results

IndexError, unhandled by the servicer, so the gRPC call fails.

Additional context

Have a fix + regression test ready to send as a PR.