attempt to sort adding jobs

This commit is contained in:
holger krekel
2019-12-06 00:54:03 +01:00
parent 3f49492ccf
commit b3495695d0
12 changed files with 75 additions and 71 deletions

View File

@@ -509,7 +509,7 @@ pub unsafe extern "C" fn dc_interrupt_imap_idle(context: *mut dc_context_t) {
}
let ffi_context = &*context;
ffi_context
.with_inner(|ctx| job::interrupt_inbox_idle(ctx, true))
.with_inner(|ctx| job::interrupt_inbox_idle(ctx))
.unwrap_or(())
}

View File

@@ -1352,7 +1352,7 @@ pub fn delete(context: &Context, chat_id: u32) -> Result<(), Error> {
});
job_kill_action(context, Action::Housekeeping);
job_add(context, Action::Housekeeping, 0, Params::new(), 10);
add_job_with_interrupt(context, Action::Housekeeping, 0, Params::new(), 10);
Ok(())
}

View File

@@ -143,7 +143,7 @@ impl Context {
}
Config::InboxWatch => {
let ret = self.sql.set_raw_config(self, key, value);
interrupt_inbox_idle(self, true);
interrupt_inbox_idle(self);
ret
}
Config::SentboxWatch => {

View File

@@ -38,7 +38,7 @@ pub fn configure(context: &Context) {
return;
}
job_kill_action(context, Action::ConfigureImap);
job_add(context, Action::ConfigureImap, 0, Params::new(), 0);
add_job_with_interrupt(context, Action::ConfigureImap, 0, Params::new(), 0);
}
/// Check if the context is already configured.

View File

@@ -14,13 +14,11 @@ use crate::contact::*;
use crate::error::*;
use crate::events::Event;
use crate::imap::*;
use crate::job::*;
use crate::job_thread::JobThread;
use crate::key::*;
use crate::login_param::LoginParam;
use crate::lot::Lot;
use crate::message::{self, Message, MsgId};
use crate::param::Params;
use crate::message::{self, MsgId};
use crate::smtp::Smtp;
use crate::sql::Sql;
@@ -436,34 +434,6 @@ impl Context {
false
}
}
pub fn do_heuristics_moves(&self, folder: &str, msg_id: MsgId) {
if !self.get_config_bool(Config::MvboxMove) {
return;
}
if self.is_mvbox(folder) {
return;
}
if let Ok(msg) = Message::load_from_db(self, msg_id) {
if msg.is_setupmessage() {
// do not move setup messages;
// there may be a non-delta device that wants to handle it
return;
}
// 1 = dc message, 2 = reply to dc message
if 0 != msg.is_dc_message {
job_add(
self,
Action::MoveMsg,
msg.id.to_u32() as i32,
Params::new(),
0,
);
}
}
}
}
impl Drop for Context {

View File

@@ -250,7 +250,7 @@ pub fn dc_receive_imf(
// if we delete we don't need to try moving messages
if needs_delete_job && !created_db_entries.is_empty() {
job_add(
add_job_no_interrupt(
context,
Action::DeleteMsgOnImap,
created_db_entries[0].1.to_u32() as i32,
@@ -258,7 +258,7 @@ pub fn dc_receive_imf(
0,
);
} else {
context.do_heuristics_moves(server_folder.as_ref(), insert_msg_id);
crate::imap::do_heuristics_moves(context, server_folder.as_ref(), insert_msg_id);
}
info!(

View File

@@ -17,9 +17,9 @@ use crate::context::Context;
use crate::dc_receive_imf::dc_receive_imf;
use crate::events::Event;
use crate::imap_client::*;
use crate::job::{job_add, Action};
use crate::job::{add_job_no_interrupt, Action};
use crate::login_param::{CertificateChecks, LoginParam};
use crate::message::{self, update_server_uid};
use crate::message::{self, update_server_uid, Message, MsgId};
use crate::oauth2::dc_get_oauth2_access_token;
use crate::param::Params;
use crate::stock::StockMessage;
@@ -1202,8 +1202,8 @@ fn precheck_imf(context: &Context, rfc724_mid: &str, server_folder: &str, server
{
if old_server_folder.is_empty() && old_server_uid == 0 {
info!(context, "[move] detected bbc-self {}", rfc724_mid,);
context.do_heuristics_moves(server_folder.as_ref(), msg_id);
job_add(
do_heuristics_moves(context, server_folder.as_ref(), msg_id);
add_job_no_interrupt(
context,
Action::MarkseenMsgOnImap,
msg_id.to_u32() as i32,
@@ -1237,3 +1237,32 @@ fn prefetch_get_message_id(prefetch_msg: &Fetch) -> Result<String> {
wrapmime::parse_message_id(&message_id.unwrap()).map_err(Into::into)
}
pub fn do_heuristics_moves(context: &Context, folder: &str, msg_id: MsgId) {
if !context.get_config_bool(crate::config::Config::MvboxMove) {
return;
}
if context.is_mvbox(folder) {
return;
}
if let Ok(msg) = Message::load_from_db(context, msg_id) {
if msg.is_setupmessage() {
// do not move setup messages;
// there may be a non-delta device that wants to handle it
return;
}
// 1 = dc message, 2 = reply to dc message
if 0 != msg.is_dc_message {
// we are called from receive_imf so there is no idle running
add_job_no_interrupt(
context,
Action::MoveMsg,
msg.id.to_u32() as i32,
Params::new(),
0,
);
}
}
}

View File

@@ -74,7 +74,7 @@ pub fn imex(context: &Context, what: ImexMode, param1: Option<impl AsRef<Path>>)
}
job_kill_action(context, Action::ImexImap);
job_add(context, Action::ImexImap, 0, param, 0);
add_job_with_interrupt(context, Action::ImexImap, 0, param, 0);
}
/// Returns the filename of the backup found (otherwise an error)

View File

@@ -134,7 +134,7 @@ impl Job {
/// Updates the job already stored in the database.
///
/// To add a new job, use [job_add].
/// To add a new job, use [add_job_*].
fn update(&self, context: &Context) -> bool {
sql::execute(
context,
@@ -472,21 +472,10 @@ pub fn perform_sentbox_idle(context: &Context) {
.idle(context, use_network);
}
pub fn interrupt_inbox_idle(context: &Context, block: bool) {
info!(context, "interrupt_inbox_idle called blocking={}", block);
if block {
context.inbox_thread.read().unwrap().interrupt_idle(context);
} else {
match context.inbox_thread.try_read() {
Ok(inbox_thread) => {
inbox_thread.interrupt_idle(context);
}
Err(err) => {
*context.perform_inbox_jobs_needed.write().unwrap() = true;
warn!(context, "could not interrupt idle: {}", err);
}
}
}
pub fn interrupt_inbox_idle(context: &Context) {
info!(context, "interrupt_inbox_idle begin");
context.inbox_thread.read().unwrap().interrupt_idle(context);
info!(context, "interrupt_inbox_idle finish");
}
pub fn interrupt_mvbox_idle(context: &Context) {
@@ -596,7 +585,7 @@ pub fn maybe_network(context: &Context) {
}
interrupt_smtp_idle(context);
interrupt_inbox_idle(context, true);
interrupt_inbox_idle(context);
interrupt_mvbox_idle(context);
interrupt_sentbox_idle(context);
}
@@ -918,7 +907,7 @@ fn add_smtp_job(
param.set(Param::File, blob.as_name());
param.set(Param::Recipients, &recipients);
job_add(
add_job_with_interrupt(
context,
action,
rendered_msg
@@ -934,7 +923,7 @@ fn add_smtp_job(
/// Adds a job to the database, scheduling it `delay_seconds`
/// after the current time.
pub fn job_add(
pub fn add_job_no_interrupt(
context: &Context,
action: Action,
foreign_id: i32,
@@ -942,7 +931,7 @@ pub fn job_add(
delay_seconds: i64,
) {
if action == Action::Unknown {
error!(context, "Invalid action passed to job_add");
error!(context, "Invalid action passed to add_job_no_interrupt");
return;
}
@@ -963,8 +952,23 @@ pub fn job_add(
]
).ok();
if thread == Thread::Imap {
*context.perform_inbox_jobs_needed.write().unwrap() = true;
}
}
pub fn add_job_with_interrupt(
context: &Context,
action: Action,
foreign_id: i32,
param: Params,
delay_seconds: i64,
) {
let thread: Thread = action.into();
add_job_no_interrupt(context, action, foreign_id, param, delay_seconds);
match thread {
Thread::Imap => interrupt_inbox_idle(context, false),
Thread::Imap => interrupt_inbox_idle(context),
Thread::Smtp => interrupt_smtp_idle(context),
Thread::Unknown => {}
}

View File

@@ -226,7 +226,7 @@ pub fn send_locations_to_chat(context: &Context, chat_id: u32, seconds: i64) {
context.call_cb(Event::ChatModified(chat_id));
if 0 != seconds {
schedule_MAYBE_SEND_LOCATIONS(context, false);
job_add(
add_job_with_interrupt(
context,
Action::MaybeSendLocationsEnded,
chat_id as i32,
@@ -241,7 +241,8 @@ pub fn send_locations_to_chat(context: &Context, chat_id: u32, seconds: i64) {
#[allow(non_snake_case)]
fn schedule_MAYBE_SEND_LOCATIONS(context: &Context, force_schedule: bool) {
if force_schedule || !job_action_exists(context, Action::MaybeSendLocations) {
job_add(context, Action::MaybeSendLocations, 0, Params::new(), 60);
// XXX questionable to interrupt but set a +60secs target
add_job_with_interrupt(context, Action::MaybeSendLocations, 0, Params::new(), 60);
};
}

View File

@@ -875,7 +875,7 @@ pub fn delete_msgs(context: &Context, msg_ids: &[MsgId]) {
}
}
update_msg_chat_id(context, *msg_id, DC_CHAT_ID_TRASH);
job_add(
add_job_with_interrupt(
context,
Action::DeleteMsgOnImap,
msg_id.to_u32() as i32,
@@ -890,7 +890,7 @@ pub fn delete_msgs(context: &Context, msg_ids: &[MsgId]) {
msg_id: MsgId::new(0),
});
job_kill_action(context, Action::Housekeeping);
job_add(context, Action::Housekeeping, 0, Params::new(), 10);
add_job_with_interrupt(context, Action::Housekeeping, 0, Params::new(), 10);
};
}
@@ -961,7 +961,7 @@ pub fn markseen_msgs(context: &Context, msg_ids: &[MsgId]) -> bool {
update_msg_state(context, *id, MessageState::InSeen);
info!(context, "Seen message {}.", id);
job_add(
add_job_with_interrupt(
context,
Action::MarkseenMsgOnImap,
id.to_u32() as i32,
@@ -1319,7 +1319,7 @@ pub fn update_server_uid(
#[allow(dead_code)]
pub fn dc_empty_server(context: &Context, flags: u32) {
job_kill_action(context, Action::EmptyServer);
job_add(context, Action::EmptyServer, flags as i32, Params::new(), 0);
add_job_with_interrupt(context, Action::EmptyServer, flags as i32, Params::new(), 0);
}
#[cfg(test)]

View File

@@ -15,7 +15,7 @@ use crate::dc_tools::*;
use crate::e2ee;
use crate::error::Result;
use crate::headerdef::HeaderDef;
use crate::job::{job_add, Action};
use crate::job::{add_job_no_interrupt, Action};
use crate::location;
use crate::message;
use crate::message::MsgId;
@@ -782,7 +782,7 @@ impl<'a> MimeParser<'a> {
if self.has_chat_version() && self.context.get_config_bool(Config::MvboxMove) {
param.set_int(Param::AlsoMove, 1);
}
job_add(self.context, Action::MarkseenMdnOnImap, 0, param, 0);
add_job_no_interrupt(self.context, Action::MarkseenMdnOnImap, 0, param, 0);
}
}
}