class Dpkg::S3::Lock

Lock is resposible of creating lock file on S3 to ensure when multiple instances of uploads will not conflict with each other

Attributes

host[RW]
user[RW]

Public Class Methods

current(codename, component = nil, architecture = nil, cache_control = nil) click to toggle source
# File lib/dpkg/s3/lock.rb, line 58
def current(codename, component = nil, architecture = nil, cache_control = nil)
  lock_content = Dpkg::S3::Utils.s3_read(lock_path(codename, component, architecture, cache_control))
  lock_content = lock_content.split.first.split('@')
  lock = Dpkg::S3::Lock.new
  lock.user = lock_content[0]
  lock.host = lock_content[1] if lock_content.size > 1
  lock
end
lock(codename, component = nil, architecture = nil, cache_control = nil) click to toggle source
# File lib/dpkg/s3/lock.rb, line 38
def lock(codename, component = nil, architecture = nil, cache_control = nil)
  lockfile = Tempfile.new('lockfile')
  lock_content = generate_lock_content
  lockfile.write lock_content
  lockfile.close

  Dpkg::S3::Utils.s3_store(lockfile.path,
                           lock_path(codename, component, architecture, cache_control),
                           'text/plain',
                           cache_control)

  return if lock_content == Dpkg::S3::Utils.s3_read(lock_path(codename, component, architecture, cache_control))

  throw 'Failed to acquire lock, was overwritten by another deb-s3 process'
end
locked?(codename, component = nil, architecture = nil, cache_control = nil) click to toggle source
# File lib/dpkg/s3/lock.rb, line 23
def locked?(codename, component = nil, architecture = nil, cache_control = nil)
  Dpkg::S3::Utils.s3_exists?(lock_path(codename, component, architecture, cache_control))
end
new() click to toggle source
# File lib/dpkg/s3/lock.rb, line 17
def initialize
  @user = nil
  @host = nil
end
unlock(codename, component = nil, architecture = nil, cache_control = nil) click to toggle source
# File lib/dpkg/s3/lock.rb, line 54
def unlock(codename, component = nil, architecture = nil, cache_control = nil)
  Dpkg::S3::Utils.s3_remove(lock_path(codename, component, architecture, cache_control))
end
wait_for_lock(codename, component = nil, architecture = nil, cache_control = nil) click to toggle source
# File lib/dpkg/s3/lock.rb, line 27
def wait_for_lock(codename, component = nil, architecture = nil, cache_control = nil)
  max_attempts = 60
  wait = 10
  attempts = 0
  while locked?(codename, component, architecture, cache_control)
    attempts += 1
    throw "Unable to obtain a lock after #{max_attempts}, giving up." if attempts > max_attempts
    sleep(wait)
  end
end

Private Class Methods

generate_lock_content() click to toggle source
# File lib/dpkg/s3/lock.rb, line 73
def generate_lock_content
  "#{Etc.getlogin}@#{Socket.gethostname}\n#{SecureRandom.hex}"
end
lock_path(codename, component = nil, architecture = nil, _cache_control = nil) click to toggle source
# File lib/dpkg/s3/lock.rb, line 69
def lock_path(codename, component = nil, architecture = nil, _cache_control = nil)
  "dists/#{codename}/#{component}/binary-#{architecture}/lockfile"
end