Bug 801971 - Scalability: Catalog Images tab, /conductor/pools/1?details_tab=images&only_tab=true, is slow
Summary: Scalability: Catalog Images tab, /conductor/pools/1?details_tab=images&only_t...
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: CloudForms Cloud Engine
Classification: Retired
Component: aeolus-conductor
Version: 1.0.0
Hardware: Unspecified
OS: Unspecified
unspecified
high
Target Milestone: 1.0.1
Assignee: Tomas Hrcka
QA Contact: wes hayutin
URL:
Whiteboard:
Depends On:
Blocks: 826123
TreeView+ depends on / blocked
 
Reported: 2012-03-10 00:48 UTC by Richard Su
Modified: 2012-07-10 07:20 UTC (History)
12 users (show)

Fixed In Version:
Doc Type: Bug Fix
Doc Text:
A large number of applications increases the number of image queries and degrades the "Catalog Images" page load time. This update reduces duplicate image requests to a single query and reduces the "Catalog Images" load time.
Clone Of:
: 826123 (view as bug list)
Environment:
Last Closed: 2012-07-10 07:20:47 UTC
Embargoed:


Attachments (Terms of Use)


Links
System ID Private Priority Status Summary Last Updated
Red Hat Product Errata RHBA-2012:1063 0 normal SHIPPED_LIVE CloudForms Cloud Engine 1.0.1 bug fix update 2012-07-10 11:18:41 UTC

Description Richard Su 2012-03-10 00:48:56 UTC
Description of problem:
Performance of Monitor -> Default Pool -> Catalog Images degrades significantly when deployments are added to the system.

With 0 deployments in the system, this page takes only .2 seconds to load.
With 100 deployments in the system, the page takes 18.4 seconds to load.

Version-Release number of selected component (if applicable):
aeolus-conductor-0.8.0-41.el6.noarch

How reproducible:
Always


Steps to Reproduce:
1. Create a large number of deployments in the system and then view the Catalog Images tab.

I created a jmeter test to load up the system with data. You can use it to reproduce this scenario. It is available at https://github.com/aeolusproject/aeolus-performance-testing/tree/master/jmeter/create-deployment-and-launch
  
Actual results:
Page load time is not linear.

Expected results:
Difficult to say how fast that page should load. But 18.4 seconds for 100 deployments seems slow.

Comment 1 Hugh Brock 2012-03-19 17:14:11 UTC
This is one of the many pagination BZs. We believe adding pagination is too risky for 1.0, but we want it soon, so moving to 1.0.z.

Comment 3 Tomas Hrcka 2012-05-24 15:03:44 UTC
commit 4b03851d0dec1357c43735012d22e2945b925e3c in master branch reduces page load time in case that one or more images are reused in deployments.

If every deployment in the system use different image page load time stays linear.

Comment 4 Tomas Hrcka 2012-05-25 14:18:26 UTC
(In reply to comment #3)
> commit 4b03851d0dec1357c43735012d22e2945b925e3c in master branch reduces
> page load time in case that one or more images are reused in deployments.
> 
> If every deployment in the system use different image page load time stays
> linear.

Actually this is a patch set on master branch

ccfd67ec6bcca3d3b6c8f2df66f0c2269c1ce791
4b03851d0dec1357c43735012d22e2945b925e3c

Comment 6 sachua 2012-06-06 01:13:41 UTC
    Technical note added. If any revisions are required, please edit the "Technical Notes" field
    accordingly. All revisions will be proofread by the Engineering Content Services team.
    
    New Contents:
Load time for "Catalog Images" page degrades significantly as the number of deployments increase. Page load time is reduced by adding a patch to perform only one data-fetch request when a deployment is using duplicate images.

Comment 7 Dan Macpherson 2012-06-06 01:58:51 UTC
    Technical note updated. If any revisions are required, please edit the "Technical Notes" field
    accordingly. All revisions will be proofread by the Engineering Content Services team.
    
    Diffed Contents:
@@ -1 +1 @@
-Load time for "Catalog Images" page degrades significantly as the number of deployments increase. Page load time is reduced by adding a patch to perform only one data-fetch request when a deployment is using duplicate images.+A large number of applications increases the number of image queries and degrades the "Catalog Images" page load time. This update reduces duplicate image requests to a single query and reduces the "Catalog Images" load time.

Comment 8 Dave Johnson 2012-06-12 15:29:49 UTC
Reopening... found some issue where this wasn;t working and displaying a undefined method `name' for nil:NilClass 

Associated stack trace
 privileges.action='view') ORDER BY permissions.id ASC
  Catalog Load (0.3ms)  SELECT "catalogs".* FROM "catalogs" WHERE ("catalogs".pool_id = 1)
  Deployable Load (0.5ms)  SELECT "deployables".* FROM "deployables" INNER JOIN "catalog_entries" ON "deployables".id = "catalog_entries".deployable_id WHERE (("catalog_entries".catalog_id = 1))
undefined method `name' for nil:NilClass
/usr/share/aeolus-conductor/app/models/pool.rb:167:in `catalog_images_collection'
 /usr/share/aeolus-conductor/app/models/pool.rb:165:in `each'
 /usr/share/aeolus-conductor/app/models/pool.rb:165:in `catalog_images_collection'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/associations/association_collection.rb:431:in `method_missing'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/associations/association_proxy.rb:220:in `method_missing'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/associations/association_proxy.rb:220:in `each'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/associations/association_proxy.rb:220:in `send'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/associations/association_proxy.rb:220:in `method_missing'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/associations/association_collection.rb:431:in `method_missing'
 /usr/share/aeolus-conductor/app/models/pool.rb:164:in `catalog_images_collection'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/relation.rb:13:in `each'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/relation.rb:13:in `__send__'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/relation.rb:13:in `each'
 /usr/share/aeolus-conductor/app/models/pool.rb:163:in `catalog_images_collection'
 /usr/share/aeolus-conductor/app/controllers/pools_controller.rb:102:in `show'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/abstract_controller/base.rb:150:in `process_action'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_controller/metal/rendering.rb:11:in `process_action'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/abstract_controller/callbacks.rb:18:in `process_action'
 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.10/lib/active_support/callbacks.rb:466:in `_run__1831855033__process_action__453433196__callbacks'
 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.10/lib/active_support/callbacks.rb:410:in `send'
 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.10/lib/active_support/callbacks.rb:410:in `_run_process_action_callbacks'
 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.10/lib/active_support/callbacks.rb:94:in `send'
 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.10/lib/active_support/callbacks.rb:94:in `run_callbacks'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/abstract_controller/callbacks.rb:17:in `process_action'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_controller/metal/rescue.rb:17:in `process_action'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.10/lib/active_support/notifications.rb:52:in `instrument'
 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.10/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.10/lib/active_support/notifications.rb:52:in `instrument'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_controller/metal/instrumentation.rb:29:in `process_action'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/abstract_controller/base.rb:119:in `process'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/abstract_controller/rendering.rb:41:in `process'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_controller/metal.rb:138:in `dispatch'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_controller/metal.rb:178:in `action'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/routing/route_set.rb:62:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/routing/route_set.rb:62:in `dispatch'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/routing/route_set.rb:27:in `call'
 /usr/lib/ruby/gems/1.8/gems/rack-mount-0.7.1/lib/rack/mount/route_set.rb:150:in `call'
 /usr/lib/ruby/gems/1.8/gems/rack-mount-0.7.1/lib/rack/mount/code_generation.rb:93:in `recognize'
 /usr/lib/ruby/gems/1.8/gems/rack-mount-0.7.1/lib/rack/mount/code_generation.rb:96:in `optimized_each'
 /usr/lib/ruby/gems/1.8/gems/rack-mount-0.7.1/lib/rack/mount/code_generation.rb:92:in `recognize'
 /usr/lib/ruby/gems/1.8/gems/rack-mount-0.7.1/lib/rack/mount/route_set.rb:141:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/routing/route_set.rb:493:in `call'
 /usr/lib/ruby/gems/1.8/gems/warden-1.0.5/lib/warden/manager.rb:35:in `call'
 /usr/lib/ruby/gems/1.8/gems/warden-1.0.5/lib/warden/manager.rb:34:in `catch'
 /usr/lib/ruby/gems/1.8/gems/warden-1.0.5/lib/warden/manager.rb:34:in `call'
 /usr/lib/ruby/gems/1.8/gems/rack-restful_submit-1.2.1/lib/rack/rack-restful_submit.rb:29:in `call'
 /usr/lib/ruby/gems/1.8/gems/sass-3.1.4/lib/sass/../sass/plugin/rack.rb:54:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/head.rb:14:in `call'
 /usr/lib/ruby/gems/1.8/gems/rack-1.3.0/lib/rack/methodoverride.rb:24:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/params_parser.rb:21:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/flash.rb:182:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/cookies.rb:302:in `call'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/query_cache.rb:32:in `call'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/query_cache.rb:12:in `cache'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/query_cache.rb:31:in `call'
 /usr/lib/ruby/gems/1.8/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/callbacks.rb:46:in `call'
 /usr/lib/ruby/gems/1.8/gems/activesupport-3.0.10/lib/active_support/callbacks.rb:416:in `_run_call_callbacks'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/callbacks.rb:44:in `call'
 /usr/lib/ruby/gems/1.8/gems/rack-1.3.0/lib/rack/sendfile.rb:102:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
 /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.10/lib/action_dispatch/middleware/show_exceptions.rb:47:in `call'
 /usr/lib/ruby/gems/1.8/gems/railties-3.0.10/lib/rails/rack/logger.rb:13:in `call'
 /usr/lib/ruby/gems/1.8/gems/rack-1.3.0/lib/rack/runtime.rb:17:in `call'
 /usr/lib/ruby/gems/1.8/gems/rack-1.3.0/lib/rack/lock.rb:34:in `call'
 /usr/lib/ruby/gems/1.8/gems/railties-3.0.10/lib/rails/application.rb:168:in `call'
 /usr/lib/ruby/gems/1.8/gems/railties-3.0.10/lib/rails/application.rb:77:in `send'
 /usr/lib/ruby/gems/1.8/gems/railties-3.0.10/lib/rails/application.rb:77:in `method_missing'
 /usr/lib/ruby/gems/1.8/gems/rack-1.3.0/lib/rack/urlmap.rb:52:in `call'
 /usr/lib/ruby/gems/1.8/gems/rack-1.3.0/lib/rack/urlmap.rb:46:in `each'
 /usr/lib/ruby/gems/1.8/gems/rack-1.3.0/lib/rack/urlmap.rb:46:in `call'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/connection.rb:84:in `pre_process'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/connection.rb:82:in `catch'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/connection.rb:82:in `pre_process'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/connection.rb:57:in `process'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/connection.rb:42:in `receive_data'
 /usr/lib/ruby/gems/1.8/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
 /usr/lib/ruby/gems/1.8/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/backends/base.rb:61:in `start'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/server.rb:159:in `start'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/controllers/controller.rb:86:in `start'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/runner.rb:185:in `send'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/runner.rb:185:in `run_command'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/lib/thin/runner.rb:151:in `run!'
 /usr/lib/ruby/gems/1.8/gems/thin-1.2.11/bin/thin:6
 /usr/bin/thin:19:in `load'
 /usr/bin/thin:19
Rendered layouts/_popup-error.rhtml (0.5ms)
Completed 500 Internal Server Error in 190ms (Views: 1.3ms | ActiveRecord: 40.6ms)
[root@hp-sl2x170zg6-01 ~]#

Comment 9 Tomas Hrcka 2012-06-14 13:56:55 UTC
fixed in master d5ecdc9df77fbd9dee52c46659334d94f366b13e

Comment 10 Ronelle Landy 2012-06-29 20:48:41 UTC
Looking at a conductor installed from ...

>>  rpm -qa |grep aeolus
aeolus-conductor-daemons-0.8.33-1.el6cf.noarch
aeolus-conductor-0.8.33-1.el6cf.noarch
aeolus-all-0.8.33-1.el6cf.noarch
rubygem-aeolus-image-0.3.0-12.el6.noarch
rubygem-aeolus-cli-0.3.3-2.el6_2.noarch
aeolus-configure-2.5.10-1.el6cf.noarch
aeolus-conductor-doc-0.8.33-1.el6cf.noarch

The "Catalog Images" page does *not* include any pagination (the comments in this BZ seem to recommend pagination as a solution) but the fix as described below ...

<tzumainn> rlandy: ah, it looks like the patch author didn't include pagination for that one; he limited the number of requests to iwhd

*does* reduce the load times for the page. Although it does seem inconsistent not to have pagination on one images page - thoughts?

So will recheck this BZ in the next puddle build.

Comment 11 Ronelle Landy 2012-06-29 20:52:13 UTC
Did not see any "undefined method `name' for nil:NilClass " errors when testing above rpms.

Comment 12 Ronelle Landy 2012-06-29 21:52:34 UTC
Marking this BZ as verified in:

rpm -qa |grep aeolus
aeolus-conductor-daemons-0.8.34-1.el6cf.noarch
aeolus-conductor-0.8.34-1.el6cf.noarch
rubygem-aeolus-image-0.3.0-12.el6.noarch
aeolus-conductor-doc-0.8.34-1.el6cf.noarch
rubygem-aeolus-cli-0.3.3-2.el6_2.noarch
aeolus-configure-2.5.10-1.el6cf.noarch
aeolus-all-0.8.34-1.el6cf.noarch

Created; https://bugzilla.redhat.com/show_bug.cgi?id=836669 to log the request for the Catalog Images page to be paginated.

Comment 14 errata-xmlrpc 2012-07-10 07:20:47 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

http://rhn.redhat.com/errata/RHBA-2012-1063.html


Note You need to log in before you can comment on or make changes to this bug.