From 830198b75c1fc75791187455f7976f0a87493ef7 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Tue, 21 Mar 2017 13:58:31 +0100 Subject: Improve resiliency of build picking Every time we pick a new build, or we get into conflict we force runner to retry the operation to make sure that all builds are being picked. It makes us to loose one request, but also makes sure that we are consistent. It is fair trade, as number of generated builds is relatively small 0.1% compared to the traffic. --- lib/ci/api/builds.rb | 29 +++++++++++++++++++---------- lib/ci/api/helpers.rb | 8 ++++++++ 2 files changed, 27 insertions(+), 10 deletions(-) (limited to 'lib/ci/api') diff --git a/lib/ci/api/builds.rb b/lib/ci/api/builds.rb index 746e76a1b1f..f39b509873c 100644 --- a/lib/ci/api/builds.rb +++ b/lib/ci/api/builds.rb @@ -13,35 +13,44 @@ module Ci post "register" do authenticate_runner! required_attributes! [:token] - not_found! unless current_runner.active? update_runner_info if current_runner.is_runner_queue_value_latest?(params[:last_update]) - header 'X-GitLab-Last-Update', params[:last_update] - Gitlab::Metrics.add_event(:build_not_found_cached) + Gitlab::Metrics.add_event(:build_not_found_cached, + version: get_runner_version) + header_last_update(params[:last_update]) return build_not_found! end new_update = current_runner.ensure_runner_queue_value + unless current_runner.active? + Gitlab::Metrics.add_event(:runner_inactive, + version: get_runner_version) + header_last_update(new_update) + return build_not_found! + end + result = Ci::RegisterJobService.new(current_runner).execute if result.valid? if result.build Gitlab::Metrics.add_event(:build_found, - project: result.build.project.path_with_namespace) - + project: result.build.project.path_with_namespace, + version: get_runner_version) + header_last_update(current_runner.tick_runner_queue_value) present result.build, with: Entities::BuildDetails else - Gitlab::Metrics.add_event(:build_not_found) - - header 'X-GitLab-Last-Update', new_update - + Gitlab::Metrics.add_event(:build_not_found, + version: get_runner_version) + header_last_update(new_update) build_not_found! end else # We received build that is invalid due to concurrency conflict - Gitlab::Metrics.add_event(:build_invalid) + Gitlab::Metrics.add_event(:build_invalid, + version: get_runner_version) + header_last_update(current_runner.tick_runner_queue_value) conflict! end end diff --git a/lib/ci/api/helpers.rb b/lib/ci/api/helpers.rb index 996990b464f..868a9cdec70 100644 --- a/lib/ci/api/helpers.rb +++ b/lib/ci/api/helpers.rb @@ -79,6 +79,14 @@ module Ci def max_artifacts_size current_application_settings.max_artifacts_size.megabytes.to_i end + + def get_runner_version + params.fetch('info', {}).fetch('version', "unknown") + end + + def header_last_update(value) + header 'X-GitLab-Last-Update', value + end end end end -- cgit v1.2.1