canvas_sync 0.22.2 → 0.22.3
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc62b25843e2b3e57b83e1ca41b4a0e546666ce6e824a8a799f534ee90fb28c5
|
4
|
+
data.tar.gz: 1fb1747c3882282894b0aa4e6fef9d7240977a453da6415e3a31460c55833306
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ac70536bc476c02ee262487ff7074493e99c05d585cec78a32cddb5569feb9e5ca6407a7104cf7538ed9030e4cb2401be823171de5f5e261de5bd2aeafbc11f
|
7
|
+
data.tar.gz: 31178103ff1168d6a54b622c612260857c4f5841dff32c637a95877a1df3f7c4467221e05c19e7688f1ebf3284d79cc8cf5113208f89ac4299983dcaa2ccf51d
|
@@ -478,20 +478,22 @@ module CanvasSync::JobBatches
|
|
478
478
|
|
479
479
|
# Internal method to cleanup a Redis Hash and related keys
|
480
480
|
def cleanup_redis_index_for(key, suffixes = [""])
|
481
|
-
|
482
|
-
r.
|
483
|
-
|
484
|
-
|
481
|
+
redis do |r|
|
482
|
+
if r.hget(k, "created_at").present?
|
483
|
+
r.multi do |r|
|
484
|
+
suffixes.each do |suffix|
|
485
|
+
r.expire(key + suffix, BID_EXPIRE_TTL)
|
486
|
+
end
|
485
487
|
end
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
488
|
+
false
|
489
|
+
else
|
490
|
+
r.multi do |r|
|
491
|
+
suffixes.each do |suffix|
|
492
|
+
r.unlink(key + suffix)
|
493
|
+
end
|
492
494
|
end
|
495
|
+
true
|
493
496
|
end
|
494
|
-
true
|
495
497
|
end
|
496
498
|
end
|
497
499
|
|
@@ -499,14 +501,16 @@ module CanvasSync::JobBatches
|
|
499
501
|
def cleanup_redis_index!
|
500
502
|
suffixes = ["", "-callbacks-complete", "-callbacks-success", "-failed", "-dead", "-batches-success", "-batches-complete", "-batches-failed", "-bids", "-jids", "-pending_callbacks"]
|
501
503
|
|
502
|
-
|
503
|
-
|
504
|
-
r.
|
505
|
-
|
506
|
-
|
504
|
+
redis do |r|
|
505
|
+
cleanup_index = ->(index) {
|
506
|
+
r.zrangebyscore(index, "0", BID_EXPIRE_TTL.seconds.ago.to_i).each do |bid|
|
507
|
+
r.zrem(index, bid) if cleanup_redis_index_for("BID-#{bid}", suffixes)
|
508
|
+
end
|
509
|
+
}
|
507
510
|
|
508
|
-
|
509
|
-
|
511
|
+
cleanup_index.("BID-ROOT-bids")
|
512
|
+
cleanup_index.("batches")
|
513
|
+
end
|
510
514
|
end
|
511
515
|
|
512
516
|
def redis(&blk)
|
@@ -122,14 +122,27 @@ module CanvasSync::JobUniqueness
|
|
122
122
|
|
123
123
|
args = @context_data[:args] || []
|
124
124
|
kwargs = @context_data[:kwargs] || {}
|
125
|
+
hash = config[:hash]
|
125
126
|
if config[:hash].is_a?(Proc)
|
126
|
-
|
127
|
+
hash = config[:hash].call(*args, **kwargs)
|
127
128
|
elsif config[:hash].nil?
|
128
|
-
|
129
|
-
else
|
130
|
-
base_key << config[:hash]
|
129
|
+
hash = [*args, kwargs]
|
131
130
|
end
|
132
131
|
|
132
|
+
hash = ":#{hash}" if hash.is_a?(Symbol)
|
133
|
+
|
134
|
+
if hash && !hash.is_a?(String)
|
135
|
+
hash = Array(hash)
|
136
|
+
|
137
|
+
# Normalize the hash to ensure that the order of any Hash keys don't matter
|
138
|
+
hash = normalize_hash_chunk(hash)
|
139
|
+
|
140
|
+
normalized = ActiveJob::Arguments.serialize(hash)
|
141
|
+
hash = OpenSSL::Digest::MD5.hexdigest(JSON.dump(normalized))
|
142
|
+
end
|
143
|
+
|
144
|
+
base_key << hash if hash
|
145
|
+
|
133
146
|
base_key.join(":")
|
134
147
|
end
|
135
148
|
end
|
@@ -173,5 +186,14 @@ module CanvasSync::JobUniqueness
|
|
173
186
|
|
174
187
|
private
|
175
188
|
|
189
|
+
def normalize_hash_chunk(chunk)
|
190
|
+
if chunk.is_a?(Hash)
|
191
|
+
chunk.map { |k, v| [k, normalize_hash_chunk(v)] }.sort.to_h
|
192
|
+
elsif chunk.is_a?(Array)
|
193
|
+
chunk.map { |c| normalize_hash_chunk(c) }
|
194
|
+
else
|
195
|
+
chunk
|
196
|
+
end
|
197
|
+
end
|
176
198
|
end
|
177
199
|
end
|
data/lib/canvas_sync/version.rb
CHANGED
@@ -24,6 +24,17 @@ RSpec.describe CanvasSync::JobUniqueness::LockContext do
|
|
24
24
|
TestWorker.unique_job_options[:scope] = scope
|
25
25
|
end
|
26
26
|
|
27
|
+
it 'returns matching keys for equal hashes' do
|
28
|
+
context_data[:args] = [{ foo: 'bar', bar: 'foo' }]
|
29
|
+
key1 = lock_context.base_key
|
30
|
+
lock_context.instance_variable_set(:@base_key, nil)
|
31
|
+
|
32
|
+
context_data[:args] = [{ bar: 'foo', foo: 'bar' }]
|
33
|
+
key2 = lock_context.base_key
|
34
|
+
|
35
|
+
expect(key1).to eq key2
|
36
|
+
end
|
37
|
+
|
27
38
|
context 'when scope is a Proc' do
|
28
39
|
let(:scope) { ->(queue:) { "blob" } }
|
29
40
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: canvas_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.22.
|
4
|
+
version: 0.22.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Instructure CustomDev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-08-
|
11
|
+
date: 2024-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|