diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-11-19 08:27:35 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-11-19 08:27:35 +0000 |
commit | 7e9c479f7de77702622631cff2628a9c8dcbc627 (patch) | |
tree | c8f718a08e110ad7e1894510980d2155a6549197 /app/services/ci/append_build_trace_service.rb | |
parent | e852b0ae16db4052c1c567d9efa4facc81146e88 (diff) | |
download | gitlab-ce-7e9c479f7de77702622631cff2628a9c8dcbc627.tar.gz |
Add latest changes from gitlab-org/gitlab@13-6-stable-eev13.6.0-rc42
Diffstat (limited to 'app/services/ci/append_build_trace_service.rb')
-rw-r--r-- | app/services/ci/append_build_trace_service.rb | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/app/services/ci/append_build_trace_service.rb b/app/services/ci/append_build_trace_service.rb new file mode 100644 index 00000000000..602f8c5030d --- /dev/null +++ b/app/services/ci/append_build_trace_service.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module Ci + class AppendBuildTraceService + Result = Struct.new(:status, :stream_size, keyword_init: true) + TraceRangeError = Class.new(StandardError) + + attr_reader :build, :params + + def initialize(build, params) + @build = build + @params = params + end + + def execute(body_data) + # TODO: + # it seems that `Content-Range` as formatted by runner is wrong, + # the `byte_end` should point to final byte, but it points byte+1 + # that means that we have to calculate end of body, + # as we cannot use `content_length[1]` + # Issue: https://gitlab.com/gitlab-org/gitlab-runner/issues/3275 + + content_range = stream_range.split('-') + body_start = content_range[0].to_i + body_end = body_start + body_data.bytesize + + stream_size = build.trace.append(body_data, body_start) + + unless stream_size == body_end + log_range_error(stream_size, body_end) + + return Result.new(status: 416, stream_size: stream_size) + end + + Result.new(status: 202, stream_size: stream_size) + end + + private + + def stream_range + params.fetch(:content_range) + end + + def log_range_error(stream_size, body_end) + extra = { + build_id: build.id, + body_end: body_end, + stream_size: stream_size, + stream_class: stream_size.class, + stream_range: stream_range + } + + build.trace_chunks.last.try do |chunk| + extra.merge!( + chunk_index: chunk.chunk_index, + chunk_store: chunk.data_store, + chunks_count: build.trace_chunks.count + ) + end + + ::Gitlab::ErrorTracking + .log_exception(TraceRangeError.new, extra) + end + end +end |