diff options
author | Z.J. van de Weg <git@zjvandeweg.nl> | 2017-01-30 14:29:55 +0300 |
---|---|---|
committer | Z.J. van de Weg <git@zjvandeweg.nl> | 2017-01-30 15:38:36 +0300 |
commit | 9bd424a3fd2829f92329f22365dd2f7105d67eb5 (patch) | |
tree | b25f85e177ef1fed068a696ff5279da496f99bae | |
parent | 067ce273a592abbcc7d9e417a5466ba113882dca (diff) |
Improve performance of triggered chat commands
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 |