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