aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/model_schema.rb
diff options
context:
space:
mode:
authorMatthew Draper <matthew@trebex.net>2017-05-25 09:08:45 +0930
committerMatthew Draper <matthew@trebex.net>2017-05-25 11:23:11 +0930
commit6a5a814eaa0d4f98d6151df5bd96cc8ec1ae5675 (patch)
tree5a5830a2a9ce9d2bd7bc71a65622bd559466d537 /activerecord/lib/active_record/model_schema.rb
parent0fa9084a18d1d9c4765c526b740f3f0b550055ca (diff)
downloadrails-6a5a814eaa0d4f98d6151df5bd96cc8ec1ae5675.tar.gz
rails-6a5a814eaa0d4f98d6151df5bd96cc8ec1ae5675.tar.bz2
rails-6a5a814eaa0d4f98d6151df5bd96cc8ec1ae5675.zip
Add a Monitor to ModelSchema#load_schema
[Vikrant Chaudhary, David Abdemoulaie, Matthew Draper]
Diffstat (limited to 'activerecord/lib/active_record/model_schema.rb')
-rw-r--r--activerecord/lib/active_record/model_schema.rb25
1 files changed, 22 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/model_schema.rb b/activerecord/lib/active_record/model_schema.rb
index 54216caaaf..5095cdfe9f 100644
--- a/activerecord/lib/active_record/model_schema.rb
+++ b/activerecord/lib/active_record/model_schema.rb
@@ -1,3 +1,5 @@
+require "monitor"
+
module ActiveRecord
module ModelSchema
extend ActiveSupport::Concern
@@ -152,6 +154,8 @@ module ActiveRecord
self.inheritance_column = "type"
delegate :type_for_attribute, to: :class
+
+ initialize_load_schema_monitor
end
# Derives the join table name for +first_table+ and +second_table+. The
@@ -435,15 +439,27 @@ module ActiveRecord
initialize_find_by_cache
end
+ protected
+
+ def initialize_load_schema_monitor
+ @load_schema_monitor = Monitor.new
+ end
+
private
+ def inherited(child_class)
+ super
+ child_class.initialize_load_schema_monitor
+ end
+
def schema_loaded?
- defined?(@columns_hash) && @columns_hash
+ defined?(@schema_loaded) && @schema_loaded
end
def load_schema
- unless schema_loaded?
- load_schema!
+ return if schema_loaded?
+ @load_schema_monitor.synchronize do
+ load_schema! unless defined?(@columns_hash) && @columns_hash
end
end
@@ -457,6 +473,8 @@ module ActiveRecord
user_provided_default: false
)
end
+
+ @schema_loaded = true
end
def reload_schema_from_cache
@@ -470,6 +488,7 @@ module ActiveRecord
@attributes_builder = nil
@columns = nil
@columns_hash = nil
+ @schema_loaded = false
@attribute_names = nil
@yaml_encoder = nil
direct_descendants.each do |descendant|