After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 735161 - (CPU) HTML email processing resource expensive
(CPU)
HTML email processing resource expensive
Status: RESOLVED DUPLICATE of bug 732457
Product: evolution
Classification: Applications
Component: Composer
3.14.x (obsolete)
Other Linux
: Normal critical
: ---
Assigned To: Tomas Popela
Evolution QA team
Depends on:
Blocks:
 
 
Reported: 2014-08-21 13:45 UTC by Paul Stejskal
Modified: 2015-03-05 11:02 UTC
See Also:
GNOME target: ---
GNOME version: ---


Attachments
LibreOffice Example (953.75 KB, application/vnd.oasis.opendocument.text)
2014-10-30 14:05 UTC, Paul Stejskal
Details
Example (866.48 KB, application/x-7z-compressed)
2014-10-30 15:29 UTC, Paul Stejskal
Details
strace (18.95 KB, application/zip)
2014-11-14 19:22 UTC, Paul Stejskal
Details

Description Paul Stejskal 2014-08-21 13:45:59 UTC
When sending an e-mail (usually with probably 10+ recipients in to/cc) as is typical in business applications (read:Outlook), once you start getting quite a few e-mails in a row and mixed html and images and the message sizes start getting bigger, the reply window loads fine. However I've noticed when I type my message and push send, one of two things sometimes happen:

1) CPU usage on one of my cores goes to 100% and evolution goes gray for a few seconds until it finishes processing then it sends the message.
2) Evolution completely locks up and doesn't use CPU but evolution locks up and I can't use it and have to kill it manually (signal 9).

This is using evolution-ews. I haven't tested with IMAP however I will test with that. I'm running Ubuntu 14.04 x64 on a Thinkpad T530 with an Intel i5 with a SSD built in, so I got a plenty fast system. 

Let me know if you need additional data. This is my first bug report so I don't know what all is required so I'll be happy to get more data.
Comment 1 André Klapper 2014-08-22 10:21:26 UTC
Which exact evolution and evolution-ews versions are you using?
Comment 2 Paul Stejskal 2014-08-22 12:46:16 UTC
3.13.4. It's the one in the Ubuntu PPA repos.
Comment 3 Paul Stejskal 2014-10-27 20:55:47 UTC
I think it's CPU overhead on the new webkit composer. If you highlight a lot of mixed text/html content/images even, it locks up the CPU until it finishes processing. It's pretty easily reproducible from Ubuntu 14.04:

1) Set up PPA
2) Set up an Exchange account (I think Office 365 would work too, anything that uses EWS)
3) Create an e-mail with quite a few bits of content and several pages (should be able to push Page Down on the keyboard like 20 times). Ensure you're using HTML.
4) Observe in top the evolution process consume 100% CPU.
Comment 4 Paul Stejskal 2014-10-30 13:34:37 UTC
http://gnome-evolution-general.1774414.n4.nabble.com/Evolution-3-13-3-td4659415.html I'm not the only one.
Comment 5 André Klapper 2014-10-30 13:36:03 UTC
I am not really sure what an "email chain" is...
Comment 6 Paul Stejskal 2014-10-30 13:41:12 UTC
It's when you have several people cc'd on an e-mail (usually for business purposes). The problem can also occur if you just compose an e-mail with a bunch of content. It happens when you do the following:

1) Have several people cc'd
2) Have several e-mails go back and forth with a reply all.
3) Have your reply format set to inline.
4) It's all HTML.
5) If you throw in some images/fancy html tables/content.
6) Push send.
7) Open top from a terminal and see it consuming CPU cycles. If you have a Gnome based WM (default of Ubuntu for example), Evolution even darkens. It takes a while to process and then the little "sending" animation with the gnome foot moving it's "toes" finally goes on the composing window.
Comment 7 Tomas Popela 2014-10-30 13:43:33 UTC
Hi Paul,
can please share (if it is possible) one of these messages somewhere (i.e. attach the message here)? It will be helpful. Thank you
Comment 8 Paul Stejskal 2014-10-30 14:05:29 UTC
Created attachment 289666 [details]
LibreOffice Example
Comment 9 André Klapper 2014-10-30 14:23:59 UTC
Please attach a message itself instead of putting it into some container like a LibreOffice document. Also note that Bugzilla is public (email addresses etc).
Comment 10 lauterba 2014-10-30 14:30:55 UTC
I have this problem, too.
Comment 11 Paul Stejskal 2014-10-30 15:29:01 UTC
Created attachment 289684 [details]
Example

https://drive.google.com/file/d/0BykRKSvavV8YR3dmM1dINEVmMUE/view?usp=sharing

This is the link in case the 7z file won't work.
Comment 12 Paul Stejskal 2014-11-14 19:22:15 UTC
Created attachment 290727 [details]
strace

I ran a strace during the send process.
Comment 13 Paul Stejskal 2014-11-14 19:22:56 UTC
Added strace. I ran it during a message locking up while sending causing 100% CPU (started right away) then killed it as it unlocked and started working again.
Comment 14 Milan Crha 2015-03-04 18:52:40 UTC
I see in the strace that there is some ongoing spell checking, which might not be done on send, there is no need for it. It's true that the message is preprocessed in some way, before being sent. The 3.13.90 should work better in some extent, especially with inline images.
Comment 15 Milan Crha 2015-03-04 19:33:14 UTC
I just tried tried the current git master of evolution with your test message (comment #11) and I see like a second and half to three seconds (subjective measure) delay with high CPU usage and evolution frozen when sending the message. Evolution is just processing the content:

Thread 1 (Thread 0x7f8a952a2a40 (LWP 27148))

  • #0 WebCore::Document::updateRangesAfterChildrenChanged(WebCore::ContainerNode&)
  • #1 WebCore::ContainerNode::childrenChanged(WebCore::ContainerNode::ChildChange const&)
  • #2 WebCore::Element::childrenChanged(WebCore::ContainerNode::ChildChange const&)
  • #3 WebCore::HTMLElement::childrenChanged(WebCore::ContainerNode::ChildChange const&)
  • #4 WebCore::ContainerNode::notifyChildInserted(WebCore::Node&, WebCore::ContainerNode::ChildChangeSource)
  • #5 WebCore::ContainerNode::updateTreeAfterInsertion(WebCore::Node&)
  • #6 WebCore::ContainerNode::appendChild(WTF::PassRefPtr<WebCore::Node>, int&)
  • #7 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #8 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #9 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #10 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #11 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #12 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #13 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #14 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #15 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #16 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #17 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #18 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #19 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #20 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #21 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #22 WebCore::cloneChildNodesAvoidingDeleteButton(WebCore::ContainerNode*, WebCore::ContainerNode*, WebCore::HTMLElement*) [clone .constprop.117]
  • #23 WebCore::ContainerNode::cloneChildNodes(WebCore::ContainerNode*)
  • #24 WebCore::Element::cloneElementWithChildren()
  • #25 WebCore::Element::cloneNode(bool)
  • #26 webkit_dom_node_clone_node
  • #27 process_content_for_html
    at e-html-editor-view.c line 7264
  • #28 e_html_editor_view_get_text_html
    at e-html-editor-view.c line 8318
  • #29 composer_build_message
    at e-msg-composer.c line 1380
  • #30 e_msg_composer_get_message
    at e-msg-composer.c line 4880
  • #31 e_msg_composer_save_to_outbox
    at e-msg-composer.c line 4110
  • #32 composer_send_completed
    at em-composer-utils.c line 578
  • #33 g_simple_async_result_complete
    at gsimpleasyncresult.c line 763
  • #34 complete_in_idle_cb_for_thread
    at gsimpleasyncresult.c line 832
  • #35 g_main_context_dispatch
    at gmain.c line 3111
  • #36 g_main_context_dispatch
    at gmain.c line 3710
  • #37 g_main_context_iterate
    at gmain.c line 3781
  • #38 g_main_loop_run
    at gmain.c line 3975
  • #39 gtk_main
    at gtkmain.c line 1207
  • #40 main
    at main.c line 638

Comment 16 Milan Crha 2015-03-05 11:02:34 UTC
Let's deal with this within bug #732457.

*** This bug has been marked as a duplicate of bug 732457 ***