deb-s3-lock-fix 0.11.8.fix0.1 → 0.11.8.fix0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/deb/s3/cli.rb +8 -8
  3. data/lib/deb/s3/lock.rb +48 -8
  4. metadata +5 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b7c555d0e33412b90fb17d46b473f97d414e504e96ced3726e5cdbaa0c80c58
4
- data.tar.gz: ed1697addac22433d6830beef8a84cf7a03c85a160004729fc75fb66a210f162
3
+ metadata.gz: 96bae859e8570813b3ca71a774182b49e1b710ba753c4e2b248b29316ae31523
4
+ data.tar.gz: 4e8dc1299ae006258ed0745dda5f9804c7ff0215fa26a405d27c136ae05896c5
5
5
  SHA512:
6
- metadata.gz: 2ad9c7570206b4f39b777667e24e3f004f816b946a55048bcf8b8f84ad24f4cccb7e81a034d25dd5996f47e9ccc351f966338df37f45a838e073688bde56434c
7
- data.tar.gz: 1fce1fe773fb1397f81bc513b32d3e9f7b39398bf1a0e2e7dd8183a6f9876131ef919cb9353361be9e791fdbb7d3edb9dc336bd04e05a680c1799ec968b3a5f6
6
+ metadata.gz: 45c9aabade8123c3d499ece078b56e2e2eaf3b501d5c0229254d872f16008af36894d7664ec8258fa33e9031cfcbcdda1348db55302c3d6f327d5d90cc92268d
7
+ data.tar.gz: 624c33b41c7c0710ded488dd97ee23b7d938444de922b20bd25a8c7b6453500fe6bc8c3996d772294030bdf1bba8d36f24d7f71225578402646c6ad16a5db15a
data/lib/deb/s3/cli.rb CHANGED
@@ -165,7 +165,7 @@ class Deb::S3::CLI < Thor
165
165
  if options[:lock]
166
166
  log("Checking for existing lock file")
167
167
  log("Locking repository for updates")
168
- Deb::S3::Lock.lock(options[:codename])
168
+ Deb::S3::Lock.lock(options[:bucket], options[:codename])
169
169
  @lock_acquired = true
170
170
  end
171
171
 
@@ -257,7 +257,7 @@ class Deb::S3::CLI < Thor
257
257
  log("Update complete.")
258
258
  ensure
259
259
  if options[:lock] && @lock_acquired
260
- Deb::S3::Lock.unlock(options[:codename])
260
+ Deb::S3::Lock.unlock(options[:bucket], options[:codename])
261
261
  log("Lock released.")
262
262
  end
263
263
  end
@@ -406,7 +406,7 @@ class Deb::S3::CLI < Thor
406
406
  if options[:lock]
407
407
  log("Checking for existing lock file")
408
408
  log("Locking repository for updates")
409
- Deb::S3::Lock.lock(options[:codename])
409
+ Deb::S3::Lock.lock(options[:bucket], options[:codename])
410
410
  @lock_acquired = true
411
411
  end
412
412
 
@@ -448,7 +448,7 @@ class Deb::S3::CLI < Thor
448
448
  log "Copy complete."
449
449
  ensure
450
450
  if options[:lock] && @lock_acquired
451
- Deb::S3::Lock.unlock(options[:codename])
451
+ Deb::S3::Lock.unlock(options[:bucket], options[:codename])
452
452
  log("Lock released.")
453
453
  end
454
454
  end
@@ -501,7 +501,7 @@ class Deb::S3::CLI < Thor
501
501
  if options[:lock]
502
502
  log("Checking for existing lock file")
503
503
  log("Locking repository for updates")
504
- Deb::S3::Lock.lock(options[:codename])
504
+ Deb::S3::Lock.lock(options[:bucket], options[:codename])
505
505
  @lock_acquired = true
506
506
  end
507
507
 
@@ -549,7 +549,7 @@ class Deb::S3::CLI < Thor
549
549
  end
550
550
  ensure
551
551
  if options[:lock] && @lock_acquired
552
- Deb::S3::Lock.unlock(options[:codename])
552
+ Deb::S3::Lock.unlock(options[:bucket], options[:codename])
553
553
  log("Lock released.")
554
554
  end
555
555
  end
@@ -615,7 +615,7 @@ class Deb::S3::CLI < Thor
615
615
  if options[:lock]
616
616
  log("Checking for existing lock file")
617
617
  log("Locking repository for updates")
618
- Deb::S3::Lock.lock(options[:codename])
618
+ Deb::S3::Lock.lock(options[:bucket], options[:codename])
619
619
  @lock_acquired = true
620
620
  end
621
621
 
@@ -679,7 +679,7 @@ class Deb::S3::CLI < Thor
679
679
  end
680
680
  ensure
681
681
  if options[:lock] && @lock_acquired
682
- Deb::S3::Lock.unlock(options[:codename])
682
+ Deb::S3::Lock.unlock(options[:bucket], options[:codename])
683
683
  log("Lock released.")
684
684
  end
685
685
  end
data/lib/deb/s3/lock.rb CHANGED
@@ -25,20 +25,21 @@ class Deb::S3::Lock
25
25
  end
26
26
 
27
27
  def self.validate_environment_variables!
28
- %w[DEB_S3_LOCK_ACCESS_KEY_ID DEB_S3_LOCK_SECRET_ACCESS_KEY AWS_BUILDERS_REGION].each do |var|
28
+ %w[DEB_S3_ACCESS_KEY_ID DEB_S3_SECRET_ACCESS_KEY AWS_BUILDERS_REGION].each do |var|
29
29
  raise "Environment variable #{var} not set." unless ENV[var]
30
30
  end
31
31
  end
32
32
 
33
33
  class << self
34
- def lock(codename, max_attempts = 60, max_wait_interval = 10)
34
+ def lock(bucket, codename, max_attempts = 60, max_wait_interval = 10)
35
35
  uuid = SecureRandom.uuid
36
36
  lock_body = "#{Etc.getlogin}@#{Socket.gethostname}-#{uuid}"
37
- lock_key = codename
37
+ lock_key = "#{bucket}/#{codename}"
38
38
 
39
39
  $stderr.puts("Current job's hostname with UUID: #{lock_body}")
40
40
 
41
41
  max_attempts.times do |i|
42
+ delete_expired_lock(bucket, codename)
42
43
  wait_interval = [2**i, max_wait_interval].min
43
44
 
44
45
  expiration_time = Time.now.to_i + 45
@@ -54,7 +55,7 @@ class Deb::S3::Lock
54
55
  })
55
56
  return
56
57
  rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException
57
- lock_holder = current_lock_holder(codename)
58
+ lock_holder = current_lock_holder(bucket, codename)
58
59
  current_time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
59
60
  $stderr.puts("[#{current_time}] Repository is locked by another user: #{lock_holder.user} at host #{lock_holder.host_with_uuid}")
60
61
  $stderr.puts("Attempting to obtain a lock after #{wait_interval} second(s).")
@@ -65,20 +66,20 @@ class Deb::S3::Lock
65
66
  raise "Unable to obtain a lock after #{max_attempts} attemtps, giving up."
66
67
  end
67
68
 
68
- def unlock(codename)
69
+ def unlock(bucket, codename)
69
70
  # dynamodb.delete_item({
70
71
  # table_name: DYNAMODB_TABLE_NAME,
71
72
  # key: {
72
- # 'lock_key' => codename
73
+ # 'lock_key' => "#{bucket}/#{codename}"
73
74
  # }
74
75
  # })
75
76
  end
76
77
 
77
- def current_lock_holder(codename)
78
+ def current_lock_holder(bucket, codename)
78
79
  response = dynamodb.get_item({
79
80
  table_name: DYNAMODB_TABLE_NAME,
80
81
  key: {
81
- 'lock_key' => codename
82
+ 'lock_key' => "#{bucket}/#{codename}"
82
83
  }
83
84
  })
84
85
 
@@ -91,6 +92,45 @@ class Deb::S3::Lock
91
92
  end
92
93
  end
93
94
 
95
+ def delete_expired_lock(bucket, codename)
96
+ response = dynamodb.get_item({
97
+ table_name: DYNAMODB_TABLE_NAME,
98
+ key: {
99
+ 'lock_key' => "#{bucket}/#{codename}"
100
+ }
101
+ })
102
+
103
+ return unless response.item
104
+
105
+ if response.item['ttl'] && Time.now.to_i > response.item['ttl'].to_i
106
+ lockdata = response.item['lock_body']
107
+ user, _ = lockdata.split("@", 2)
108
+
109
+ delete_response = nil
110
+
111
+ begin
112
+ delete_response = dynamodb.delete_item({
113
+ table_name: DYNAMODB_TABLE_NAME,
114
+ key: {
115
+ 'lock_key' => "#{bucket}/#{codename}"
116
+ },
117
+ return_values: 'ALL_OLD'
118
+ })
119
+ rescue Aws::DynamoDB::Errors::ServiceError => e
120
+ $stderr.puts("Error deleting lock: #{e.message}")
121
+ return
122
+ end
123
+
124
+ if delete_response.attributes
125
+ current_time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
126
+ $stderr.puts("[#{current_time}] Expired lock detected and deleted for #{bucket}/#{codename}. Lock was held by user: #{user}.")
127
+ end
128
+ end
129
+ end
130
+
131
+
132
+
133
+
94
134
  private :dynamodb, :validate_environment_variables!
95
135
  end
96
136
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deb-s3-lock-fix
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.8.fix0.1
4
+ version: 0.11.8.fix0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braeden Wolf & Ken Robertson
@@ -80,9 +80,8 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '11'
83
- description: Fork of deb-s3 with a specific fix for locking. Original work by Ken
84
- Robertson.
85
- email: braedenwolf@outlook.com & ken@invalidlogic.com
83
+ description: Fork of deb-s3 with fix for locking. Original work by Ken Robertson.
84
+ email: braeden.wolf@sanctuary.ai & ken@invalidlogic.com
86
85
  executables:
87
86
  - deb-s3
88
87
  extensions: []
@@ -99,7 +98,7 @@ files:
99
98
  - lib/deb/s3/templates/package.erb
100
99
  - lib/deb/s3/templates/release.erb
101
100
  - lib/deb/s3/utils.rb
102
- homepage: https://github.com/braedenwolf/deb-s3-lock-fix
101
+ homepage: https://gitlab.com/sanctuaryai/precog2/infrastructure/deb-s3-lock-fix
103
102
  licenses:
104
103
  - MIT
105
104
  metadata: {}
@@ -121,5 +120,5 @@ requirements: []
121
120
  rubygems_version: 3.1.2
122
121
  signing_key:
123
122
  specification_version: 4
124
- summary: Easily create and manage an APT repository on S3 (with specific lock fix).
123
+ summary: Easily create and manage an APT repository on S3 with lock fix.
125
124
  test_files: []