retry 5 times on integrity error and then block processing
This commit is contained in:
parent
8549d73a20
commit
d552e364fc
3 changed files with 29 additions and 1 deletions
|
@ -11,7 +11,16 @@ class VirusScannerJob < ApplicationJob
|
|||
# If the file is not analyzed yet, retry later (to avoid clobbering metadata)
|
||||
retry_on FileNotAnalyzedYetError, wait: :exponentially_longer, attempts: 10
|
||||
# If for some reason the file appears invalid, retry for a while
|
||||
retry_on ActiveStorage::IntegrityError, attempts: 10, wait: 5.seconds
|
||||
retry_on(ActiveStorage::IntegrityError, attempts: 5, wait: 5.seconds) do |job, _error|
|
||||
blob = job.arguments.first
|
||||
|
||||
metadata = {
|
||||
virus_scan_result: ActiveStorage::VirusScanner::INTEGRITY_ERROR,
|
||||
scanned_at: Time.zone.now
|
||||
}
|
||||
|
||||
blob.update!(metadata: blob.metadata.merge(metadata))
|
||||
end
|
||||
|
||||
def perform(blob)
|
||||
if !blob.analyzed? then raise FileNotAnalyzedYetError end
|
||||
|
|
|
@ -8,6 +8,7 @@ class ActiveStorage::VirusScanner
|
|||
PENDING = 'pending'
|
||||
INFECTED = 'infected'
|
||||
SAFE = 'safe'
|
||||
INTEGRITY_ERROR = 'integrity_error'
|
||||
|
||||
def pending?
|
||||
blob.metadata[:virus_scan_result] == PENDING
|
||||
|
@ -21,6 +22,10 @@ class ActiveStorage::VirusScanner
|
|||
blob.metadata[:virus_scan_result] == SAFE
|
||||
end
|
||||
|
||||
def corrupt?
|
||||
blob.metadata[:virus_scan_result] == INTEGRITY_ERROR
|
||||
end
|
||||
|
||||
def done?
|
||||
started? && blob.metadata[:virus_scan_result] != PENDING
|
||||
end
|
||||
|
|
|
@ -18,6 +18,20 @@ describe VirusScannerJob, type: :job do
|
|||
blob.analyze
|
||||
end
|
||||
|
||||
context "when there is an integrity error" do
|
||||
before do
|
||||
blob.update_column('checksum', 'integrity error')
|
||||
|
||||
assert_performed_jobs(5) do
|
||||
VirusScannerJob.perform_later(blob)
|
||||
end
|
||||
end
|
||||
|
||||
it do
|
||||
expect(blob.reload.virus_scanner.corrupt?).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
context "when no virus is found" do
|
||||
before do
|
||||
allow(ClamavService).to receive(:safe_file?).and_return(true)
|
||||
|
|
Loading…
Reference in a new issue