diff options
author | Z.J. van de Weg <git@zjvandeweg.nl> | 2017-01-30 12:29:55 +0100 |
---|---|---|
committer | Z.J. van de Weg <git@zjvandeweg.nl> | 2017-01-30 13:38:36 +0100 |
commit | 9bd424a3fd2829f92329f22365dd2f7105d67eb5 (patch) | |
tree | b25f85e177ef1fed068a696ff5279da496f99bae | |
parent | 067ce273a592abbcc7d9e417a5466ba113882dca (diff) | |
download | gitlab-ce-9bd424a3fd2829f92329f22365dd2f7105d67eb5.tar.gz |
Improve performance of triggered chat commandszj-slow-service-fetch
When the trigger endpoint is called, it has to find the right service
for the given project. However, the old implementation did much more.
For example, it build a list of the missing services on this project.
This whole process took about 750ms _each time_. The current
implementation is expected to perform 10x better, as it only searches in
the current projects services. Given the service has to be configured
anyway, this can be done.
-rw-r--r-- | changelogs/unreleased/zj-slow-service-fetch.yml | 4 | ||||
-rw-r--r-- | lib/api/services.rb | 13 |
2 files changed, 14 insertions, 3 deletions
diff --git a/changelogs/unreleased/zj-slow-service-fetch.yml b/changelogs/unreleased/zj-slow-service-fetch.yml new file mode 100644 index 00000000000..8037361d2fc --- /dev/null +++ b/changelogs/unreleased/zj-slow-service-fetch.yml @@ -0,0 +1,4 @@ +--- +title: Improve performance of slash commands +merge_request: 8876 +author: diff --git a/lib/api/services.rb b/lib/api/services.rb index a0abec49438..1456fe4688b 100644 --- a/lib/api/services.rb +++ b/lib/api/services.rb @@ -661,6 +661,14 @@ module API end trigger_services.each do |service_slug, settings| + helpers do + def chat_command_service(project, service_slug, params) + project.services.active.where(template: false).find do |service| + service.try(:token) == params[:token] && service.to_param == service_slug.underscore + end + end + end + params do requires :id, type: String, desc: 'The ID of a project' end @@ -679,9 +687,8 @@ module API # This is not accurate, but done to prevent leakage of the project names not_found!('Service') unless project - service = project.find_or_initialize_service(service_slug.underscore) - - result = service.try(:active?) && service.try(:trigger, params) + service = chat_command_service(project, service_slug, params) + result = service.try(:trigger, params) if result status result[:status] || 200 |