def handle_file(self, queue):
"""
Handle incoming file-transfer messages from build slaves.
The file transfer protocol is in some ways very simple (see the chart
in the :doc:`slaves` chapter for an overview of the message sequence)
and in some ways rather complex (read the ZeroMQ guide chapter on file
transfers for more detail on why multiple messages must be allowed in
flight simultaneously).
The "normal" state for a file transfer is to be requesting and
receiving chunks. Anything else, including redundant re-sends, and
transfer completion is handled as an exceptional case.
"""
address, msg, *args = queue.recv_multipart()
try:
try:
transfer = self.active[address]
except KeyError:
transfer = self.new_transfer(msg, *args)
self.active[address] = transfer
else:
self.current_transfer(transfer, msg, *args)
except TransferDone as exc:
self.logger.info(str(exc))
del self.active[address]
self.complete[transfer.slave_id] = transfer
queue.send_multipart([address, b'DONE'])
except TransferIgnoreChunk as exc:
self.logger.debug(str(exc))
except TransferError as exc:
self.logger.error(str(exc))
# XXX Delete the transfer object?
# XXX Remove transfer from slave?
else:
fetch_range = transfer.fetch()
while fetch_range:
queue.send_multipart([
address, b'FETCH',
str(fetch_range.start).encode('ascii'),
str(len(fetch_range)).encode('ascii')
])
fetch_range = transfer.fetch()
评论列表
文章目录