diff options
author | Sean Griffin <sean@seantheprogrammer.com> | 2015-10-30 11:05:40 -0600 |
---|---|---|
committer | Sean Griffin <sean@seantheprogrammer.com> | 2015-10-30 11:05:40 -0600 |
commit | 61205422bad5f57111d7e9dc4cfb252908878b95 (patch) | |
tree | 791e9969a95904db40550a9a7e5a1726a7b7f9b6 /activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | |
parent | 3cd49570c55334b25e37401176a17b0824512db2 (diff) | |
parent | 2c2a8755460ec3d32ece91c9766dbd0304ece028 (diff) | |
download | rails-61205422bad5f57111d7e9dc4cfb252908878b95.tar.gz rails-61205422bad5f57111d7e9dc4cfb252908878b95.tar.bz2 rails-61205422bad5f57111d7e9dc4cfb252908878b95.zip |
Merge pull request #22122 from samphilipd/sam/manual_locking_on_schema_migrations
Make migrations concurrent safe (using advisory locks)
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb index 787dadfdbf..6200cc8d29 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb @@ -284,6 +284,10 @@ module ActiveRecord true end + def supports_advisory_locks? + true + end + def supports_explain? true end @@ -302,6 +306,20 @@ module ActiveRecord postgresql_version >= 90300 end + def get_advisory_lock(key) # :nodoc: + unless key.is_a?(Integer) && key.bit_length <= 63 + raise(ArgumentError, "Postgres requires advisory lock keys to be a signed 64 bit integer") + end + select_value("SELECT pg_try_advisory_lock(#{key});") + end + + def release_advisory_lock(key) # :nodoc: + unless key.is_a?(Integer) && key.bit_length <= 63 + raise(ArgumentError, "Postgres requires advisory lock keys to be a signed 64 bit integer") + end + select_value("SELECT pg_advisory_unlock(#{key})") + end + def enable_extension(name) exec_query("CREATE EXTENSION IF NOT EXISTS \"#{name}\"").tap { reload_type_map |