mirror of
https://github.com/meineerde/redmine.git
synced 2026-01-31 19:47:14 +00:00
Add timeout for thumbnail generation process (#37530).
Patch by Go MAEDA (@maeda). git-svn-id: https://svn.redmine.org/redmine/trunk@22847 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
a4e7d34cb7
commit
6a4abab8ce
@ -178,6 +178,10 @@ default:
|
||||
# the `gs` binary. Used to generate attachment thumbnails of PDF files.
|
||||
#gs_command:
|
||||
|
||||
# Timeout when generating thumbnails using the `convert` or `gs` command.
|
||||
# Timeout is set in seconds.
|
||||
#thumbnails_generation_timeout: 10
|
||||
|
||||
# Configuration of MiniMagick font.
|
||||
#
|
||||
# Redmine uses MiniMagick in order to export a gantt chart to a PNG image.
|
||||
|
||||
@ -27,7 +27,8 @@ module Redmine
|
||||
'avatar_server_url' => 'https://www.gravatar.com',
|
||||
'email_delivery' => nil,
|
||||
'max_concurrent_ajax_uploads' => 2,
|
||||
'common_mark_enable_hardbreaks' => true
|
||||
'common_mark_enable_hardbreaks' => true,
|
||||
'thumbnails_generation_timeout' => 10
|
||||
}
|
||||
|
||||
@config = nil
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
require 'fileutils'
|
||||
require 'timeout'
|
||||
|
||||
module Redmine
|
||||
module Thumbnail
|
||||
@ -51,8 +52,20 @@ module Redmine
|
||||
else
|
||||
cmd = "#{shell_quote CONVERT_BIN} #{shell_quote source} -auto-orient -thumbnail #{shell_quote size_option} #{shell_quote target}"
|
||||
end
|
||||
unless system(cmd)
|
||||
logger.error("Creating thumbnail failed (#{$?}):\nCommand: #{cmd}")
|
||||
|
||||
pid = nil
|
||||
begin
|
||||
Timeout.timeout(Redmine::Configuration['thumbnails_generation_timeout'].to_i) do
|
||||
pid = Process.spawn(cmd)
|
||||
_, status = Process.wait2(pid)
|
||||
unless status.success?
|
||||
logger.error("Creating thumbnail failed (#{status.exitstatus}):\nCommand: #{cmd}")
|
||||
return nil
|
||||
end
|
||||
end
|
||||
rescue Timeout::Error
|
||||
Process.kill('KILL', pid)
|
||||
logger.error("Creating thumbnail timed out:\nCommand: #{cmd}")
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
@ -626,6 +626,25 @@ class AttachmentTest < ActiveSupport::TestCase
|
||||
ensure
|
||||
set_tmp_attachments_directory
|
||||
end
|
||||
|
||||
def test_thumbnail_should_timeout
|
||||
dummy_pid = 37530
|
||||
Process.stubs(:spawn).returns(dummy_pid)
|
||||
Process.stubs(:wait2).raises(Timeout::Error)
|
||||
Process.stubs(:kill).returns(1)
|
||||
Process.stubs(:wait).returns(dummy_pid)
|
||||
Rails.logger.expects(:error).with(regexp_matches(/Creating thumbnail timed out/))
|
||||
|
||||
set_fixtures_attachments_directory
|
||||
Attachment.clear_thumbnails
|
||||
|
||||
attachment = Attachment.find(16)
|
||||
thumbnail = attachment.thumbnail
|
||||
|
||||
assert_nil thumbnail
|
||||
ensure
|
||||
set_tmp_attachments_directory
|
||||
end
|
||||
else
|
||||
puts '(ImageMagick convert not available)'
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user