From e1f0a3dddf0c631d256a2ba2e880c657bf1a5078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serdar=20=C3=96zer?= Date: Mon, 11 May 2026 10:02:48 +0200 Subject: [PATCH 1/4] fixing N+1 query for service broker when it is space broker When service broker space scoped, during build_relationships inside service_broker_presenter.rb it makes select query for each of them and that makes N+1 problem. With eager loading it would be adding all the spaces as association into service broker so it won't make queries anymore will just fetch from cache. --- app/fetchers/service_broker_list_fetcher.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/fetchers/service_broker_list_fetcher.rb b/app/fetchers/service_broker_list_fetcher.rb index fc6cd6c7cde..0403f366c79 100644 --- a/app/fetchers/service_broker_list_fetcher.rb +++ b/app/fetchers/service_broker_list_fetcher.rb @@ -5,7 +5,7 @@ module VCAP::CloudController class ServiceBrokerListFetcher < BaseListFetcher class << self def fetch(message:, permitted_space_guids: nil, eager_loaded_associations: []) - dataset = ServiceBroker.dataset.eager(eager_loaded_associations) + dataset = ServiceBroker.dataset.eager(eager_loaded_associations).eager(:space) dataset = dataset.join(:spaces, id: Sequel[:service_brokers][:space_id]) if permitted_space_guids || message.requested?(:space_guids) From 49d99b874a94275b90c4449a3b8f1c3c520c7f4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serdar=20=C3=96zer?= Date: Tue, 12 May 2026 13:26:49 +0200 Subject: [PATCH 2/4] test: test added when serviece broker has space then sequel cache must have space association --- spec/unit/fetchers/service_broker_list_fetcher_spec.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/unit/fetchers/service_broker_list_fetcher_spec.rb b/spec/unit/fetchers/service_broker_list_fetcher_spec.rb index d5a34a08e2e..b567aeb3e36 100644 --- a/spec/unit/fetchers/service_broker_list_fetcher_spec.rb +++ b/spec/unit/fetchers/service_broker_list_fetcher_spec.rb @@ -45,6 +45,13 @@ module VCAP::CloudController expect(dataset.all.first.associations.key?(:labels)).to be true expect(dataset.all.first.associations.key?(:annotations)).to be false end + + it 'sets space to nil for global brokers and to the space object for space-scoped brokers' do + brokers = fetcher.fetch(message:).all.index_by(&:name) + + expect(brokers[broker.name].associations[:space]).to be_nil + expect(brokers[space_scoped_broker_1.name].associations[:space]).to eq(space_1) + end end context 'when filtering by space GUIDs' do From adaf5e3544f27a74d097ed355cbf3b0e6ce84b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serdar=20=C3=96zer?= Date: Wed, 13 May 2026 09:45:28 +0200 Subject: [PATCH 3/4] fix: code refactored --- app/fetchers/service_broker_list_fetcher.rb | 2 +- app/presenters/v3/service_broker_presenter.rb | 6 ++++++ spec/unit/fetchers/service_broker_list_fetcher_spec.rb | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/fetchers/service_broker_list_fetcher.rb b/app/fetchers/service_broker_list_fetcher.rb index 0403f366c79..fc6cd6c7cde 100644 --- a/app/fetchers/service_broker_list_fetcher.rb +++ b/app/fetchers/service_broker_list_fetcher.rb @@ -5,7 +5,7 @@ module VCAP::CloudController class ServiceBrokerListFetcher < BaseListFetcher class << self def fetch(message:, permitted_space_guids: nil, eager_loaded_associations: []) - dataset = ServiceBroker.dataset.eager(eager_loaded_associations).eager(:space) + dataset = ServiceBroker.dataset.eager(eager_loaded_associations) dataset = dataset.join(:spaces, id: Sequel[:service_brokers][:space_id]) if permitted_space_guids || message.requested?(:space_guids) diff --git a/app/presenters/v3/service_broker_presenter.rb b/app/presenters/v3/service_broker_presenter.rb index 661d163f8b5..960c78bdceb 100644 --- a/app/presenters/v3/service_broker_presenter.rb +++ b/app/presenters/v3/service_broker_presenter.rb @@ -10,6 +10,12 @@ module V3 class ServiceBrokerPresenter < BasePresenter include VCAP::CloudController::Presenters::Mixins::MetadataPresentationHelpers + class << self + def associated_resources + super + [:space] + end + end + def to_hash { guid: broker.guid, diff --git a/spec/unit/fetchers/service_broker_list_fetcher_spec.rb b/spec/unit/fetchers/service_broker_list_fetcher_spec.rb index b567aeb3e36..38ae39fe8ec 100644 --- a/spec/unit/fetchers/service_broker_list_fetcher_spec.rb +++ b/spec/unit/fetchers/service_broker_list_fetcher_spec.rb @@ -47,7 +47,7 @@ module VCAP::CloudController end it 'sets space to nil for global brokers and to the space object for space-scoped brokers' do - brokers = fetcher.fetch(message:).all.index_by(&:name) + brokers = fetcher.fetch(message: message, eager_loaded_associations: [:space]).all.index_by(&:name) expect(brokers[broker.name].associations[:space]).to be_nil expect(brokers[space_scoped_broker_1.name].associations[:space]).to eq(space_1) From 90f538e2f1b2e9de6775e1b57245f9d5f4867faa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serdar=20=C3=96zer?= Date: Wed, 13 May 2026 10:31:08 +0200 Subject: [PATCH 4/4] fix: missing :space added into eager loading test suit --- spec/request/service_brokers_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/request/service_brokers_spec.rb b/spec/request/service_brokers_spec.rb index 863bd86b988..69e403581ce 100644 --- a/spec/request/service_brokers_spec.rb +++ b/spec/request/service_brokers_spec.rb @@ -319,7 +319,7 @@ it 'eager loads associated resources that the presenter specifies' do expect(VCAP::CloudController::ServiceBrokerListFetcher).to receive(:fetch).with( hash_including( - eager_loaded_associations: %i[labels annotations] + eager_loaded_associations: %i[labels annotations space] ) ).and_call_original