diff --git a/lib/active_file/base.rb b/lib/active_file/base.rb index a73e0ae2..a074cfe1 100644 --- a/lib/active_file/base.rb +++ b/lib/active_file/base.rb @@ -2,6 +2,7 @@ module ActiveFile class Base < ActiveHash::Base extend ActiveFile::MultipleFiles + @@instance_lock = Mutex.new class_attribute :filename, :root_path, :data_loaded, instance_reader: false, instance_writer: false @@ -13,10 +14,12 @@ def delete_all end def reload(force = false) - return if !self.dirty && !force && self.data_loaded - self.data_loaded = true - self.data = load_file - mark_clean + @@instance_lock.synchronize do + return if !self.dirty && !force && self.data_loaded + self.data = load_file + mark_clean + self.data_loaded = true + end end def set_filename(name) @@ -53,6 +56,10 @@ def actual_root_path end end + def all_in_process + return super if data_loaded + @records || [] + end end end diff --git a/lib/active_hash/base.rb b/lib/active_hash/base.rb index b326fd1c..7ba1a4e4 100644 --- a/lib/active_hash/base.rb +++ b/lib/active_hash/base.rb @@ -145,7 +145,7 @@ def insert(record) end def next_id - max_record = all.max { |a, b| a.id <=> b.id } + max_record = all_in_process.max { |a, b| a.id <=> b.id } if max_record.nil? 1 elsif max_record.id.is_a?(Numeric) @@ -153,6 +153,11 @@ def next_id end end + def all_in_process + all + end + private :all_in_process + def record_index @record_index ||= {} end diff --git a/spec/active_yaml/base_spec.rb b/spec/active_yaml/base_spec.rb index a28e14b5..b94b629e 100644 --- a/spec/active_yaml/base_spec.rb +++ b/spec/active_yaml/base_spec.rb @@ -32,6 +32,12 @@ class Empty < ActiveYaml::Base ; end # Empty YAML it 'can load empty yaml' do expect(Empty.first).to be_nil end + + it 'is thread-safe' do + (1..5).map do + Thread.new { expect(City.count).to eq(2) } + end.each(&:join) + end end describe ".all" do