Keep bytes copy in SaveMessage job in case of failure

memfd
Manos Pitsidianakis 2020-08-26 20:00:25 +03:00
parent ca0f37e1f3
commit 25b325dbda
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
1 changed files with 39 additions and 10 deletions

View File

@ -182,7 +182,12 @@ pub enum JobRequest {
IsOnline(JoinHandle, oneshot::Receiver<Result<()>>),
Refresh(MailboxHash, JoinHandle, oneshot::Receiver<Result<()>>),
SetFlags(EnvelopeHashBatch, JoinHandle, oneshot::Receiver<Result<()>>),
SaveMessage(MailboxHash, JoinHandle, oneshot::Receiver<Result<()>>),
SaveMessage {
bytes: Vec<u8>,
mailbox_hash: MailboxHash,
handle: JoinHandle,
channel: oneshot::Receiver<Result<()>>,
},
SendMessage,
SendMessageBackground(JoinHandle, JobChannel<()>),
CopyTo(MailboxHash, JoinHandle, oneshot::Receiver<Result<Vec<u8>>>),
@ -217,7 +222,7 @@ impl Drop for JobRequest {
JobRequest::IsOnline(h, _) => h.0.cancel(),
JobRequest::Refresh(_, h, _) => h.0.cancel(),
JobRequest::SetFlags(_, h, _) => h.0.cancel(),
JobRequest::SaveMessage(_, h, _) => h.0.cancel(),
JobRequest::SaveMessage { handle, .. } => handle.0.cancel(),
JobRequest::CopyTo(_, h, _) => h.0.cancel(),
JobRequest::DeleteMessages(_, h, _) => h.0.cancel(),
JobRequest::CreateMailbox { handle, .. } => handle.0.cancel(),
@ -249,7 +254,7 @@ impl core::fmt::Debug for JobRequest {
JobRequest::IsOnline(_, _) => write!(f, "JobRequest::IsOnline"),
JobRequest::Refresh(_, _, _) => write!(f, "JobRequest::Refresh"),
JobRequest::SetFlags(_, _, _) => write!(f, "JobRequest::SetFlags"),
JobRequest::SaveMessage(_, _, _) => write!(f, "JobRequest::SaveMessage"),
JobRequest::SaveMessage { .. } => write!(f, "JobRequest::SaveMessage"),
JobRequest::CopyTo(_, _, _) => write!(f, "JobRequest::CopyTo"),
JobRequest::DeleteMessages(_, _, _) => write!(f, "JobRequest::DeleteMessages"),
JobRequest::CreateMailbox { .. } => write!(f, "JobRequest::CreateMailbox"),
@ -1124,14 +1129,21 @@ impl Account {
.write()
.unwrap()
.save(bytes.to_vec(), mailbox_hash, flags)?;
let (rcvr, handle, job_id) = self.job_executor.spawn_specialized(job);
let (channel, handle, job_id) = self.job_executor.spawn_specialized(job);
self.sender
.send(ThreadEvent::UIEvent(UIEvent::StatusEvent(
StatusEvent::NewJob(job_id),
)))
.unwrap();
self.active_jobs
.insert(job_id, JobRequest::SaveMessage(mailbox_hash, handle, rcvr));
self.active_jobs.insert(
job_id,
JobRequest::SaveMessage {
bytes: bytes.to_vec(),
mailbox_hash,
handle,
channel,
},
);
self.active_job_instants
.insert(std::time::Instant::now(), job_id);
Ok(())
@ -1647,14 +1659,31 @@ impl Account {
.expect("Could not send event on main channel");
}
}
JobRequest::SaveMessage(_, _, ref mut chan) => {
let r = chan.try_recv().unwrap();
JobRequest::SaveMessage {
ref mut channel,
ref bytes,
..
} => {
let r = channel.try_recv().unwrap();
if let Some(Err(err)) = r {
melib::log(format!("Could not save message: {}", err), melib::ERROR);
let file = crate::types::create_temp_file(bytes, None, None, false);
debug!("message saved in {}", file.path.display());
melib::log(
format!(
"Message was stored in {} so that you can restore it manually.",
file.path.display()
),
melib::INFO,
);
self.sender
.send(ThreadEvent::UIEvent(UIEvent::Notification(
Some(format!("{}: could not save message", &self.name)),
err.to_string(),
Some(crate::types::NotificationType::ERROR),
format!(
"Message was stored in {} so that you can restore it manually.",
file.path.display()
),
Some(crate::types::NotificationType::INFO),
)))
.expect("Could not send event on main channel");
}