rails-archiver 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b31d762ea01d15091eebffd02a581b9ae2a20fba31005ec2669b4cf0d350125
4
- data.tar.gz: 6f553c01c3a2d02062c74384c09a8e220845907544009f8d64ea97313afba6af
3
+ metadata.gz: ddfcaefd86b70ef668e8ba941e20f68a96a62a704ad9e931fbe72343a6ef7ddb
4
+ data.tar.gz: d3283d3fbbb8abeafab718a445b7f129cef999f531b7766998af860c22de2c90
5
5
  SHA512:
6
- metadata.gz: 11961ec8a0cacd1101792d3beade62fa79eb224a3c254edcb42a67a0a0f16ce423f7fefec0a5adb1b535ee5a33864e6dd5e02d8e8df22b83f1f490925741e9ae
7
- data.tar.gz: 3f37961ca490f99900f3de97e0e76d4b6ae83e9fa7977ebadedfb55784102b8d33dc8975aead38af477d3732350774212b8b11f323ae3a093a05aaca34a4811f
6
+ metadata.gz: a69726e5dff1eb032dcb915c67804cce258f970652045561a52a727a073493844a5879d79e2bb982d6a9427c834f0d33e1873759c29c463765d65894cb19674e
7
+ data.tar.gz: 34eb78437f58aced9d64fe518e0183f8ecc5dc24e8d24e88194d7d379a5c9ecd138c00bbc46f54f23fef280ea8994acd12b8c9a86decbc0d3fa04d9014896917
data/CHANGELOG.md CHANGED
@@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## UNRELEASED
9
9
 
10
+ # [0.3.0] - 2025-05-22
11
+ - Added retries for delete table operations to handle SQL Timeouts and deadlocks.
12
+
10
13
  # [0.2.0] - 2025-01-20
11
14
  - Added support for enum columns - should be able to handle both keys and values.
12
15
  - Refactored the `unarchiver` method to more easily subclass `Unarchiver`.
@@ -1,4 +1,5 @@
1
1
  require 'tmpdir'
2
+ require 'rails-archiver/utils/deadlock_retry'
2
3
  # Takes a database model and:
3
4
  # 1) Visits all dependent associations
4
5
  # 2) Saves everything in one giant JSON hash
@@ -122,7 +123,9 @@ module RailsArchiver
122
123
  delete_query = <<-SQL
123
124
  DELETE FROM `#{table}` WHERE `id` IN (#{group.compact.join(',')})
124
125
  SQL
125
- ActiveRecord::Base.connection.delete(delete_query)
126
+ RailsArchiver::Utils::DeadlockRetry.wrap do
127
+ ActiveRecord::Base.connection.delete(delete_query)
128
+ end
126
129
  end
127
130
 
128
131
  @logger.info("Finished deleting from #{table}")
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsArchiver
4
+ module Utils
5
+ # Utility module to retry a block of code in case of a deadlock.
6
+ module DeadlockRetry
7
+ class << self
8
+
9
+ RETRY_COUNT = 2
10
+
11
+ def wrap(&block)
12
+ count = RETRY_COUNT
13
+ begin
14
+ ActiveRecord::Base.transaction(&block)
15
+ rescue ActiveRecord::Deadlocked, ActiveRecord::LockWaitTimeout => e
16
+ raise if count <= 0
17
+
18
+ Rails.logger.error("Error: #{e.message}. Retrying. #{count} attempts remaining")
19
+ count -= 1
20
+
21
+ sleep(Random.rand(5.0) + 0.5)
22
+
23
+ retry
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,8 +1,8 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'rails-archiver'
3
3
  s.require_paths = %w(. lib lib/rails-archiver)
4
- s.version = '0.2.0'
5
- s.date = '2025-01-20'
4
+ s.version = '0.3.0'
5
+ s.date = '2025-05-22'
6
6
  s.summary = 'Fully archive a Rails model'
7
7
  s.description = <<-EOF
8
8
  EOF
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-archiver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Orner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-20 00:00:00.000000000 Z
11
+ date: 2025-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -53,6 +53,7 @@ files:
53
53
  - lib/rails-archiver/transport/in_memory.rb
54
54
  - lib/rails-archiver/transport/s3.rb
55
55
  - lib/rails-archiver/unarchiver.rb
56
+ - lib/rails-archiver/utils/deadlock_retry.rb
56
57
  - rails-archiver.gemspec
57
58
  homepage: https://github.com/dorner/rails-archiver
58
59
  licenses: