Closed Bug 117506 Opened 23 years ago Closed 17 years ago

IMAP startup over a 56k dialog connection with a big folder is unusably slow due to syncing flags

Categories

(MailNews Core :: Networking: IMAP, defect)

defect
Not set
major

Tracking

(Not tracked)

RESOLVED WONTFIX

People

(Reporter: slogan, Assigned: Bienvenu)

References

Details

(Keywords: perf)

I'm a dialup user from home. Here are some wall-clock timings that illustrate the problems I am seeing (which I really think are critical for dialup users, and probably affect non-dialup users as well, but are less noticable). 7 seconds for it to display a dialog, "You are 92% over quota". 23 *more* seconds before the first content displays in the message window, ad content from Netscape.com. 55 *more* seconds until that content loads. 65 *more* seconds before message summary pane content displays. During this time there is a bunch of data receive indications on modem, so I suppose this is traffic to the imap server. My INBOX has on the order of 9000 messages. Perhaps excessive but no means impossible. And, this is made worse by the fact that if I open up the folder using Pine, I can login, dismiss the quota message, open INBOX, and see the last 25 or so message headers all in a matter of 15 or so seconds. I'm not sure what we are doing during that last 65 seconds, but it sure seems like more than would be necessary to grab the 25 or so message headers that are needed to fill the message header pane. -- a second or two at most to get the number of messages in the INBOX. -- some small amount of time to compute based on my viewing pref, e.g., sort by date, and the UIDs of the IMAP messages that must be retrieved to fill the message pane based upon what will be viewable. -- a few seconds to retrieve the headers corresponding to those UIDs. Now, I gather that all the messages in the mailbox have to be loaded into the tree or outliner in order for the scrollbar size to be correct. I wonder if there is some possible workaround there. Still, it shouldn't take a minute to build that content. And it doesn't explain the blinky lights on my modem, which imply we are reading headers for all of that content. Or something. Note: I made sure there is nothing else happening on the system, specifically, the Instant Messenger is not loading in the sidebar at the same time, and the browser is not loading content in another window. ~
Severity: normal → major
Keywords: perf
reassigning to cavin. If you load the mail start page in the browser, how long does it take for you? If you have a 9000 message local folder, how long does that take?
Assignee: mscott → cavin
Status: NEW → ASSIGNED
Note, that this only happens on a clean start. If I start the browser, bring up mail, then I will see this. If I close down mail, then bring it back up with the browser still in memory, the message summary pane shows almost immediately, and the time it takes to get new messages seems reasonable to me.
for that 65 seconds, we're syncing any possible flag changes to the folder, i.e., fetching all the flags for all 9000 messages. If you generate an imap protocol log, you'll get a much better idea of what we're doing during each phase. In the past, we've talked about syncing the flags by doing three separate searches instead of the one fetch of all flags - search for unread messages, search for deleted messages, and one other search, iirc, and then deduce the flags for each message from the search results. The theory is that the searches would produce less data coming back from the server, and thus be faster over slow connections. We could also sync the flags after displaying the message headers, but then we might have to delete headers out from under the view, update flags, etc, which would produce extra complications.
I'm not sure what those complications might be, or if they are worse in terms of usability than seeing nothing in the message header pane for over 1 minute on dialup. Anyway, for certain flags, is it possible that it is only necessary to have them correctly sync'd if the header comes into view? This certainly would seem to be the case for "read" status. From RFC 2060, section 6.4.5: Example: C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)]) S: * 2 FETCH .... S: * 3 FETCH .... S: * 4 FETCH .... S: A654 OK FETCH completed this shows that flags can be fetched for a range of message numbers (in the above example, 2:4 fetches for messages with 2, 3, and 4). UIDs could also be used if you are maintaining them. To find out what headers are in view, you could (approximately) compute the set based upon a query of the scrollbar position, the font height, and the size of the message header pane window. Then you could get flags for messages in some neighborhood (a window) of the viewable headers, say, 150% (25% before and 25% behind). You could keep track of what message number or UID ranges have had their flags retrieved (a list of windows), and listen for scrollbar changes, and then compute each time to see if there is a need to go get more flags because a message that falls outside of the ranges in the window list has been scrolled into view. We should be able to detect a slow connection somehow (based on the connection setup or the IMAP authentication phase). We also can easily determine if the mailbox is large (like, 3000 messages or so, a number that we could figure out experimentally). Using those two variables, perhaps we could determine that it is better to grab flags on demand as opposed to grabbing them in bulk at startup time. Or put up (and later dismiss) a dialog (with a cancel button perhaps) that shows the status better (e.g., "Grabbing flags for messages" and a progress bar) than the status bar does (which gets overridden with a "Document: Done (x,y secs)" message when the ad content is loaded into the message view pane)? Otherwise, this looks like my mail session has hung.
Syd, we don't have time to implement what you describe in the near term. What you describe has been 90%implemented before (in 4.x), but cut from the product, and never has made the cut for 6.x. If I remember correctly, it was called imap headers on demand, and was a bit simpler than you describe - when asked to paint a line, if we didn't have the coresponding header, we would go fetch it and paint it when it had been returned - no need to deal with listening for scroll bar changes, etc.
Syd, if you have the time to measure this, what kind of times do you see for a 1000 message folder?
there are lots of complications that would ensue if we have the wrong flags for an existing header. Remember that IMAP is a server-based mail store, designed so that you can access the same folder from multiple machines, and have clients seemlessly handle changes made by other clients. Unfortunately, IMAP doesn't give you any way of knowing that no other client has made changes since our client last accessed the folder, so we have to assume the worst. For example, if another client changed the read status of some headers, our read/unread counts would be off unless we synced the flags.
Blocks: 63759
Syd, please try accessing the same account with Outlook or Outlook Express (IMAP mode) and see if that's faster.
taking; I'm working on syncing the flags after getting new headers and displaying the thread pane.
Assignee: cavin → bienvenu
Status: ASSIGNED → NEW
QA Contact: huang → gchan
Product: MailNews → Core
Bienvenu in comment #10: > taking; I'm working on syncing the flags after getting new headers and > displaying the thread pane. David, was the above finished? Is there a bug to dupe to? FWIW, related is bug 117560 and Syd is gone.
No, that didn't happen...
QA Contact: grylchan → networking.imap
Summary: IMAP startup over a 56k dialog connection with a big folder is unusably slow → IMAP startup over a 56k dialog connection with a big folder is unusably slow due to syncing flags
We're going to support CONDSTORE instead, and hope imap servers support that in droves. bug 435153
Status: NEW → RESOLVED
Closed: 17 years ago
Resolution: --- → WONTFIX
Product: Core → MailNews Core
You need to log in before you can comment on or make changes to this bug.