Bug 801971 - Scalability: Catalog Images tab, /conductor/pools/1?details_tab=images&only_tab=true, is slow
Scalability: Catalog Images tab, /conductor/pools/1?details_tab=images&only_t...
Status: CLOSED ERRATA
Product: CloudForms Cloud Engine
Classification: Red Hat
Component: aeolus-conductor (Show other bugs)
1.0.0
Unspecified Unspecified
unspecified Severity high
: 1.0.1
: ---
Assigned To: Tomas Hrcka
wes hayutin
: Triaged, ZStream
Depends On:
Blocks: 826123
  Show dependency treegraph
 
Reported: 2012-03-09 19:48 EST by Richard Su
Modified: 2012-07-10 03:20 EDT (History)
12 users (show)

See Also:
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.
Story Points: ---
Clone Of:
: 826123 (view as bug list)
Environment:
Last Closed: 2012-07-10 03:20:47 EDT
Type: ---
Regression: ---
Mount Type: ---
Documentation: ---
CRM:
Verified Versions:
Category: ---
oVirt Team: ---
RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: ---


Attachments (Terms of Use)

  None (edit)
Description Richard Su 2012-03-09 19:48:56 EST
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 13:14:11 EDT
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 11:03:44 EDT
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 10:18:26 EDT
(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-05 21:13:41 EDT
    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-05 21:58:51 EDT
    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 11:29:49 EDT
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 09:56:55 EDT
fixed in master d5ecdc9df77fbd9dee52c46659334d94f366b13e
Comment 10 Ronelle Landy 2012-06-29 16:48:41 EDT
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 16:52:13 EDT
Did not see any "undefined method `name' for nil:NilClass " errors when testing above rpms.
Comment 12 Ronelle Landy 2012-06-29 17:52:34 EDT
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 03:20:47 EDT
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.