Commit 0142f9e0 authored by Shinya Maeda's avatar Shinya Maeda

Revert some changes

parent accc2cab
...@@ -77,7 +77,11 @@ module Gitlab ...@@ -77,7 +77,11 @@ module Gitlab
def write def write
stream = Gitlab::Ci::Trace::Stream.new do stream = Gitlab::Ci::Trace::Stream.new do
LiveIO.new(job.id) if current_path
current_path
else
LiveIO.new(job.id)
end
end end
yield(stream).tap do yield(stream).tap do
......
##
# This class is compatible with IO class (https://ruby-doc.org/core-2.3.1/IO.html)
# source: https://gitlab.com/snippets/1685610
module Gitlab
module Ci
class Trace
class ChunkedIO
attr_reader :size
attr_reader :tell
attr_reader :chunk, :chunk_range
alias_method :pos, :tell
def initialize(size)
@size = size
@tell = 0
end
def close
# no-op
end
def binmode
# no-op
end
def binmode?
true
end
def path
nil
end
def seek(pos, where = IO::SEEK_SET)
new_pos =
case where
when IO::SEEK_END
size + pos
when IO::SEEK_SET
pos
when IO::SEEK_CUR
tell + pos
else
-1
end
raise 'new position is outside of file' if new_pos < 0 || new_pos > size
@tell = new_pos
end
def eof?
tell == size
end
def each_line
until eof?
line = readline
break if line.nil?
yield(line)
end
end
def read(length = nil)
out = ""
until eof? || (length && out.length >= length)
data = get_chunk
break if data.empty?
out << data
@tell += data.bytesize
end
out = out[0, length] if length && out.length > length
out
end
def readline
out = ""
until eof?
data = get_chunk
new_line = data.index("\n")
if !new_line.nil?
out << data[0..new_line]
@tell += new_line + 1
break
else
out << data
@tell += data.bytesize
end
end
out
end
def write(data)
raise NotImplementedError
end
def truncate(offset)
raise NotImplementedError
end
def flush
raise NotImplementedError
end
def present?
true
end
private
##
# To be overridden by superclasses
#
def get_chunk
raise NotImplementedError
end
def in_range?
@chunk_range&.include?(tell)
end
def chunk_offset
tell % BUFFER_SIZE
end
def chunk_start
(tell / BUFFER_SIZE) * BUFFER_SIZE
end
def chunk_end
[chunk_start + BUFFER_SIZE, size].min
end
end
end
end
end
##
# This class is compatible with IO class (https://ruby-doc.org/core-2.3.1/IO.html)
# source: https://gitlab.com/snippets/1685610
module Gitlab module Gitlab
module Ci module Ci
class Trace class Trace
class HttpIO < ChunkedIO class HttpIO
FailedToGetChunkError = Class.new(StandardError) BUFFER_SIZE = 128.kilobytes
InvalidURLError = Class.new(StandardError) InvalidURLError = Class.new(StandardError)
FailedToGetChunkError = Class.new(StandardError)
BUFFER_SIZE = 128.kilobytes attr_reader :uri, :size
attr_reader :tell
attr_reader :chunk, :chunk_range
attr_reader :uri alias_method :pos, :tell
def initialize(url, size) def initialize(url, size)
raise InvalidURLError unless ::Gitlab::UrlSanitizer.valid?(url) raise InvalidURLError unless ::Gitlab::UrlSanitizer.valid?(url)
@uri = URI(url) @uri = URI(url)
@size = size
@tell = 0
end
def close
# no-op
end
def binmode
# no-op
end
def binmode?
true
end
super def path
nil
end end
def url def url
@uri.to_s @uri.to_s
end end
def seek(pos, where = IO::SEEK_SET)
new_pos =
case where
when IO::SEEK_END
size + pos
when IO::SEEK_SET
pos
when IO::SEEK_CUR
tell + pos
else
-1
end
raise 'new position is outside of file' if new_pos < 0 || new_pos > size
@tell = new_pos
end
def eof?
tell == size
end
def each_line
until eof?
line = readline
break if line.nil?
yield(line)
end
end
def read(length = nil)
out = ""
until eof? || (length && out.length >= length)
data = get_chunk
break if data.empty?
out << data
@tell += data.bytesize
end
out = out[0, length] if length && out.length > length
out
end
def readline
out = ""
until eof?
data = get_chunk
new_line = data.index("\n")
if !new_line.nil?
out << data[0..new_line]
@tell += new_line + 1
break
else
out << data
@tell += data.bytesize
end
end
out
end
def write(data) def write(data)
raise NotImplementedError raise NotImplementedError
end end
...@@ -33,10 +123,19 @@ module Gitlab ...@@ -33,10 +123,19 @@ module Gitlab
raise NotImplementedError raise NotImplementedError
end end
def present?
true
end
private private
## ##
# Override # The below methods are not implemented in IO class
#
def in_range?
@chunk_range&.include?(tell)
end
def get_chunk def get_chunk
unless in_range? unless in_range?
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http| response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
...@@ -70,6 +169,18 @@ module Gitlab ...@@ -70,6 +169,18 @@ module Gitlab
request.set_range(chunk_start, BUFFER_SIZE) request.set_range(chunk_start, BUFFER_SIZE)
end end
end end
def chunk_offset
tell % BUFFER_SIZE
end
def chunk_start
(tell / BUFFER_SIZE) * BUFFER_SIZE
end
def chunk_end
[chunk_start + BUFFER_SIZE, size].min
end
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment