Re: [Evolution-hackers] imapx: Avoid running FETCH_NEW_MESSAGES and REFRESH_INFO jobs simultaneously

2010-07-11 Thread David Woodhouse
On Mon, 2010-07-12 at 11:32 +0530, chen wrote:
> 
> I was just thinking whether we would need the logic to fetch new
> messages from refresh_info job at-all while scanning for changes. We
> fetch new messages always before scanning for changes, so ideally
> scan_changes should only sync the flags.
> 
> At this point, fetching new messages from scan_changes would be used
> very rarely if there was any message deleted wrongly in cache 

Or if messages come in between the call to fetch_new_message() and the
later call to scan_changes().

And in fact there are a few other places that this can happen and we can
get flags for messages we've never heard about -- it happens in IDLE
too, or on NOOP, and in SELECT when we're using QRESYNC.

I was thinking of having a per-folder list of 'messages for which we
only have flags', and all those places can just append to it. And
something, somewhere, will check for it and trigger a fetch of the
headers. But it still won't care *why* we were told ;)

-- 
dwmw2

___
evolution-hackers mailing list
evolution-hackers@gnome.org
To change your list options or unsubscribe, visit ...
http://mail.gnome.org/mailman/listinfo/evolution-hackers


Re: [Evolution-hackers] imapx: Avoid running FETCH_NEW_MESSAGES and REFRESH_INFO jobs simultaneously

2010-07-11 Thread chen
On Sun, 2010-07-11 at 15:35 +0100, David Woodhouse wrote:
> On Sun, 2010-07-11 at 15:11 +0100, David Woodhouse wrote:
> > From 1d1b146e58f918f67ccff93c4fb5388429bf12e7 Mon Sep 17 00:00:00 2001
> > From: David Woodhouse 
> > Date: Sun, 11 Jul 2010 15:11:17 +0100
> > Subject: [PATCH] imapx: Avoid running FETCH_NEW_MESSAGES and REFRESH_INFO 
> > jobs simultaneously
> >
> > There are various places where we interpret FETCH results and use
> > imapx_match_active_job to find the current job, which will behave badly
> > if there are two jobs which could potentially be responsible for the FETCH.
> > 
> > In particular, this was causing a problem when we triggered a fetch of new
> > messages from select_done(), and that command was submitted at the same time
> > as a refresh_info command to fetch all flags. The server (Dovecot) was
> > returning all the untagged FETCH results before either completion line,
> > and all the flags were getting "assigned" to the fetch_new_messages job,
> > causing a bunch of 'g_array_append_vals: assertion `array' failed' warnings,
> > and all messages to disappear because the refresh_info job didn't see them. 
> 
> I looked at fixing this by making the FETCH handling code work out which
> job it should be looking at.. but that's hard because of the ways in
> which a fetch_new_messages job might just be fetching flags, and a
> refresh_info job might fetch new messages.
> 
> The real fix, I think, is to stop the FETCH handling code from caring
> about the jobs at all. The untagged messages tell us about the state of
> the mailbox, and we should just deal with that information as it comes
> in, without worrying about _why_ the server is sending it.
> 
> For refresh_info to notice when messages are deleted, we could set a
> 'possibly expunged' flag in the message in our local store, then the
> FETCH handler could clear that flag whenever it gets flags for a
> message. The refresh_info logic would then be:
>  - Set this flag on all messages
>  - Issue UID FETCH 1:* (UID FLAGS)
>  - Delete all messages without this flag set.
Seems fine, this is a better approach. I don't see a problem as only one
refresh_info job can happen at a time.

> 
> The idea would be to kill off _all_ use of job->u.refresh_info.infos and
> similar fields. Where we've fetched message flags before the headers, we
> could keep a list of those in the folder info, not the job. And that
> way, _wherever_ those new flags come from (SELECT, IDLE, NOOP, FETCH,
> etc.) they'll get handled consistently.
I was just thinking whether we would need the logic to fetch new
messages from refresh_info job at-all while scanning for changes. We
fetch new messages always before scanning for changes, so ideally
scan_changes should only sync the flags.

At this point, fetching new messages from scan_changes would be used
very rarely if there was any message deleted wrongly in cache (due to
wrong  unsolicited response from server or client bug) as a fall-back
mechanism to recover those messages. So how about re-fetching those
flags in those cases (which anyway happens rarely). So this simplifies
the logic to not store uid, flags without headers for those messages in
the folder info.

> 
> All use of imapx_match_active_job() without a uid parameter would then
> be considered a bug.
Fine.

- Chenthill.

___
evolution-hackers mailing list
evolution-hackers@gnome.org
To change your list options or unsubscribe, visit ...
http://mail.gnome.org/mailman/listinfo/evolution-hackers


Re: [Evolution-hackers] imapx: Avoid running FETCH_NEW_MESSAGES and REFRESH_INFO jobs simultaneously

2010-07-11 Thread David Woodhouse
On Sun, 2010-07-11 at 15:11 +0100, David Woodhouse wrote:
> From 1d1b146e58f918f67ccff93c4fb5388429bf12e7 Mon Sep 17 00:00:00 2001
> From: David Woodhouse 
> Date: Sun, 11 Jul 2010 15:11:17 +0100
> Subject: [PATCH] imapx: Avoid running FETCH_NEW_MESSAGES and REFRESH_INFO 
> jobs simultaneously
>
> There are various places where we interpret FETCH results and use
> imapx_match_active_job to find the current job, which will behave badly
> if there are two jobs which could potentially be responsible for the FETCH.
> 
> In particular, this was causing a problem when we triggered a fetch of new
> messages from select_done(), and that command was submitted at the same time
> as a refresh_info command to fetch all flags. The server (Dovecot) was
> returning all the untagged FETCH results before either completion line,
> and all the flags were getting "assigned" to the fetch_new_messages job,
> causing a bunch of 'g_array_append_vals: assertion `array' failed' warnings,
> and all messages to disappear because the refresh_info job didn't see them. 

I looked at fixing this by making the FETCH handling code work out which
job it should be looking at.. but that's hard because of the ways in
which a fetch_new_messages job might just be fetching flags, and a
refresh_info job might fetch new messages.

The real fix, I think, is to stop the FETCH handling code from caring
about the jobs at all. The untagged messages tell us about the state of
the mailbox, and we should just deal with that information as it comes
in, without worrying about _why_ the server is sending it.

For refresh_info to notice when messages are deleted, we could set a
'possibly expunged' flag in the message in our local store, then the
FETCH handler could clear that flag whenever it gets flags for a
message. The refresh_info logic would then be:
 - Set this flag on all messages
 - Issue UID FETCH 1:* (UID FLAGS)
 - Delete all messages without this flag set.

The idea would be to kill off _all_ use of job->u.refresh_info.infos and
similar fields. Where we've fetched message flags before the headers, we
could keep a list of those in the folder info, not the job. And that
way, _wherever_ those new flags come from (SELECT, IDLE, NOOP, FETCH,
etc.) they'll get handled consistently.

All use of imapx_match_active_job() without a uid parameter would then
be considered a bug.

Chen, what do you think?

-- 
David WoodhouseOpen Source Technology Centre
david.woodho...@intel.com  Intel Corporation

___
evolution-hackers mailing list
evolution-hackers@gnome.org
To change your list options or unsubscribe, visit ...
http://mail.gnome.org/mailman/listinfo/evolution-hackers