From d92294381e500f105b4c910ee67f2a443ed9d225 Mon Sep 17 00:00:00 2001 From: Steve Hull Date: Tue, 25 Nov 2014 16:13:33 -0800 Subject: [PATCH] Enable concurrent (threaded) uploading of files --- lib/asset_sync/config.rb | 3 +++ lib/asset_sync/storage.rb | 10 +++++++++- spec/unit/storage_spec.rb | 4 +--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/asset_sync/config.rb b/lib/asset_sync/config.rb index 2ea3a51e..beedbb1d 100644 --- a/lib/asset_sync/config.rb +++ b/lib/asset_sync/config.rb @@ -19,6 +19,7 @@ class Invalid < StandardError; end attr_accessor :run_on_precompile attr_accessor :invalidate attr_accessor :cdn_distribution_id + attr_accessor :concurrent_uploads # FOG configuration attr_accessor :fog_provider # Currently Supported ['AWS', 'Rackspace'] @@ -45,6 +46,7 @@ class Invalid < StandardError; end validates :rackspace_api_key, :presence => true, :if => :rackspace? validates :google_storage_secret_access_key, :presence => true, :if => :google? validates :google_storage_access_key_id, :presence => true, :if => :google? + validates :concurrent_uploads, :inclusion => { :in => [true, false] } def initialize self.fog_region = nil @@ -59,6 +61,7 @@ def initialize self.enabled = true self.run_on_precompile = true self.cdn_distribution_id = nil + self.concurrent_uploads = true self.invalidate = [] load_yml! if defined?(Rails) && yml_exists? end diff --git a/lib/asset_sync/storage.rb b/lib/asset_sync/storage.rb index 822b11a7..9f75c457 100644 --- a/lib/asset_sync/storage.rb +++ b/lib/asset_sync/storage.rb @@ -212,13 +212,21 @@ def upload_files # fixes: https://github.com/rumblelabs/asset_sync/issues/19 local_files_to_upload = local_files - ignored_files - remote_files + always_upload_files local_files_to_upload = (local_files_to_upload + get_non_fingerprinted(local_files_to_upload)).uniq + # keep track of threads for uploading + threads = ThreadGroup.new # Upload new files local_files_to_upload.each do |f| next unless File.file? "#{path}/#{f}" # Only files. - upload_file f + if self.config.concurrent_uploads + threads.add(Thread.new { upload_file f }) + else + upload_file f + end end + sleep 1 while threads.list.any? # wait for threads to finish uploading + if self.config.cdn_distribution_id && files_to_invalidate.any? log "Invalidating Files" cdn ||= Fog::CDN.new(self.config.fog_options.except(:region)) diff --git a/spec/unit/storage_spec.rb b/spec/unit/storage_spec.rb index 730f950b..712fedec 100644 --- a/spec/unit/storage_spec.rb +++ b/spec/unit/storage_spec.rb @@ -107,9 +107,7 @@ def check_file(file) end files = double() - local_files.count.times do - expect(files).to receive(:create) { |file| check_file(file) } - end + expect(files).to receive(:create){ |file| check_file(file) }.exactly(local_files.count).times allow(storage).to receive_message_chain(:bucket, :files).and_return(files) storage.upload_files end