From f125ffe3e0d623e9e08e8e03077dc810db32a05f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 9 Aug 2023 08:25:18 +0530 Subject: [PATCH] Fix a hang in the send kitten when transmitting deltas of multiple files and the files have not changed causing the signature of the second file to arrive after the delta for the first file is transmitted --- kittens/transfer/send.go | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/kittens/transfer/send.go b/kittens/transfer/send.go index 4a3844b31..546ce709f 100644 --- a/kittens/transfer/send.go +++ b/kittens/transfer/send.go @@ -834,6 +834,8 @@ func (self *SendHandler) on_file_transfer_response(ftc *FileTransmissionCommand) } if self.manager.all_acknowledged { self.transfer_finished() + } else if ftc.Action == Action_end_data && ftc.File_id != "" { + return self.transmit_next_chunk() } return nil } @@ -1010,16 +1012,22 @@ func (self *SendManager) next_chunks(callback func(string) loop.IdType) error { func (self *SendHandler) transmit_next_chunk() (err error) { found_chunk := false - err = self.manager.next_chunks(func(chunk string) loop.IdType { - found_chunk = true - return self.send_payload(chunk) - }) - if err != nil { - return err - } - if !found_chunk { - if self.manager.all_acknowledged { - self.transfer_finished() + for !found_chunk { + if err = self.manager.next_chunks(func(chunk string) loop.IdType { + found_chunk = true + return self.send_payload(chunk) + }); err != nil { + return err + } + if !found_chunk { + if self.manager.all_acknowledged { + self.transfer_finished() + return + } + self.manager.update_collective_statuses() + if !self.manager.has_transmitting { + return + } } } return