class Dockly::S3Writer

Constants

MAX_BUFFER_SIZE

Attributes

buffer[R]
closed[R]
connection[R]
parts[R]
s3_bucket[R]
s3_object[R]

Public Class Methods

new(connection, s3_bucket, s3_object) click to toggle source
# File lib/dockly/s3_writer.rb, line 13
def initialize(connection, s3_bucket, s3_object)
  @connection = connection
  @s3_bucket = s3_bucket
  @s3_object = s3_object
  @parts = []
  @closed = false
  @buffer = StringIO.new
end

Public Instance Methods

abort_unless_closed() click to toggle source
# File lib/dockly/s3_writer.rb, line 69
def abort_unless_closed
  abort_upload unless @closed
  @closed = true
end
abort_upload() click to toggle source
# File lib/dockly/s3_writer.rb, line 61
def abort_upload
  connection.abort_multipart_upload(
    bucket: s3_bucket,
    key: s3_object,
    upload_id: upload_id
  )
end
close() click to toggle source
# File lib/dockly/s3_writer.rb, line 42
def close
  return if @closed
  upload_buffer unless buffer.size.zero?
  connection.complete_multipart_upload(
    bucket: s3_bucket,
    key: s3_object,
    upload_id: upload_id,
    multipart_upload: {
      parts: @parts.each_with_index.map do |part, idx|
        {
          etag: part,
          part_number: idx.succ
        }
      end
    }
  )
  @closed = true
end
multipart_upload() click to toggle source
# File lib/dockly/s3_writer.rb, line 74
def multipart_upload
  @multipart_upload ||= connection.create_multipart_upload(
    bucket: s3_bucket,
    key: s3_object,
    acl: 'bucket-owner-full-control',
  )
end
upload_buffer() click to toggle source
# File lib/dockly/s3_writer.rb, line 22
def upload_buffer
  num = @parts.length.succ
  debug "Writing chunk ##{num} to s3://#{s3_bucket}/#{s3_object} with upload id: #{upload_id}"
  res = connection.upload_part(
    bucket: s3_bucket,
    key: s3_object,
    upload_id: upload_id,
    part_number:num,
    body: buffer.tap(&:rewind)
  )
  @parts << res.etag
  @buffer = StringIO.new
end
write(chunk) click to toggle source
# File lib/dockly/s3_writer.rb, line 36
def write(chunk)
  @buffer.write(chunk)
  upload_buffer if buffer.size > MAX_BUFFER_SIZE
  chunk.length
end