diff options
-rw-r--r-- | app/models/concerns/reactive_caching.rb | 17 | ||||
-rw-r--r-- | app/models/project.rb | 10 | ||||
-rw-r--r-- | changelogs/unreleased/feature-expose-runner-ip-to-api.yml | 5 | ||||
-rw-r--r-- | changelogs/unreleased/fix-reactive-cache-retry-rate.yml | 5 | ||||
-rw-r--r-- | db/migrate/20180508055821_make_remote_mirrors_disabled_by_default.rb | 11 | ||||
-rw-r--r-- | db/schema.rb | 4 | ||||
-rw-r--r-- | lib/api/entities.rb | 1 | ||||
-rw-r--r-- | spec/models/concerns/reactive_caching_spec.rb | 22 | ||||
-rw-r--r-- | spec/requests/api/runners_spec.rb | 5 |
9 files changed, 62 insertions, 18 deletions
diff --git a/app/models/concerns/reactive_caching.rb b/app/models/concerns/reactive_caching.rb index 2589215ad19..eef9caf1c8e 100644 --- a/app/models/concerns/reactive_caching.rb +++ b/app/models/concerns/reactive_caching.rb @@ -60,13 +60,16 @@ module ReactiveCaching end def with_reactive_cache(*args, &blk) - within_reactive_cache_lifetime(*args) do + bootstrap = !within_reactive_cache_lifetime?(*args) + Rails.cache.write(alive_reactive_cache_key(*args), true, expires_in: self.class.reactive_cache_lifetime) + + if bootstrap + ReactiveCachingWorker.perform_async(self.class, id, *args) + nil + else data = Rails.cache.read(full_reactive_cache_key(*args)) yield data if data.present? end - ensure - Rails.cache.write(alive_reactive_cache_key(*args), true, expires_in: self.class.reactive_cache_lifetime) - ReactiveCachingWorker.perform_async(self.class, id, *args) end def clear_reactive_cache!(*args) @@ -75,7 +78,7 @@ module ReactiveCaching def exclusively_update_reactive_cache!(*args) locking_reactive_cache(*args) do - within_reactive_cache_lifetime(*args) do + if within_reactive_cache_lifetime?(*args) enqueuing_update(*args) do value = calculate_reactive_cache(*args) Rails.cache.write(full_reactive_cache_key(*args), value) @@ -105,8 +108,8 @@ module ReactiveCaching Gitlab::ExclusiveLease.cancel(full_reactive_cache_key(*args), uuid) end - def within_reactive_cache_lifetime(*args) - yield if Rails.cache.read(alive_reactive_cache_key(*args)) + def within_reactive_cache_lifetime?(*args) + !!Rails.cache.read(alive_reactive_cache_key(*args)) end def enqueuing_update(*args) diff --git a/app/models/project.rb b/app/models/project.rb index f6ac1802846..32d34f5e9b8 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -661,9 +661,15 @@ class Project < ActiveRecord::Base return if !force && (self[:import_status] == 'none' || self[:import_status].nil?) return unless import_state.nil? - create_import_state(import_state_args) + if persisted? + create_import_state(import_state_args) - update_column(:import_status, 'none') + update_column(:import_status, 'none') + else + build_import_state(import_state_args) + + self[:import_status] = 'none' + end end def import_schedule diff --git a/changelogs/unreleased/feature-expose-runner-ip-to-api.yml b/changelogs/unreleased/feature-expose-runner-ip-to-api.yml new file mode 100644 index 00000000000..e755cf5f2d4 --- /dev/null +++ b/changelogs/unreleased/feature-expose-runner-ip-to-api.yml @@ -0,0 +1,5 @@ +--- +title: Expose runner ip address to runners API +merge_request: 18799 +author: Lars Greiss +type: changed diff --git a/changelogs/unreleased/fix-reactive-cache-retry-rate.yml b/changelogs/unreleased/fix-reactive-cache-retry-rate.yml new file mode 100644 index 00000000000..044e7fe39c0 --- /dev/null +++ b/changelogs/unreleased/fix-reactive-cache-retry-rate.yml @@ -0,0 +1,5 @@ +--- +title: Update commit status from external CI services less aggressively +merge_request: 18802 +author: +type: fixed diff --git a/db/migrate/20180508055821_make_remote_mirrors_disabled_by_default.rb b/db/migrate/20180508055821_make_remote_mirrors_disabled_by_default.rb new file mode 100644 index 00000000000..0d8a8357a1e --- /dev/null +++ b/db/migrate/20180508055821_make_remote_mirrors_disabled_by_default.rb @@ -0,0 +1,11 @@ +class MakeRemoteMirrorsDisabledByDefault < ActiveRecord::Migration + DOWNTIME = false + + def up + change_column_default :remote_mirrors, :enabled, false + end + + def down + change_column_default :remote_mirrors, :enabled, true + end +end diff --git a/db/schema.rb b/db/schema.rb index 65e9cc4ea08..6fd10785d77 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180503200320) do +ActiveRecord::Schema.define(version: 20180508055821) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -1712,7 +1712,7 @@ ActiveRecord::Schema.define(version: 20180503200320) do create_table "remote_mirrors", force: :cascade do |t| t.integer "project_id" t.string "url" - t.boolean "enabled", default: true + t.boolean "enabled", default: false t.string "update_status" t.datetime "last_update_at" t.datetime "last_successful_update_at" diff --git a/lib/api/entities.rb b/lib/api/entities.rb index a9bab5c56cf..25d78fc761d 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -967,6 +967,7 @@ module API class Runner < Grape::Entity expose :id expose :description + expose :ip_address expose :active expose :is_shared expose :name diff --git a/spec/models/concerns/reactive_caching_spec.rb b/spec/models/concerns/reactive_caching_spec.rb index a5d505af001..4570dbb1d8e 100644 --- a/spec/models/concerns/reactive_caching_spec.rb +++ b/spec/models/concerns/reactive_caching_spec.rb @@ -29,12 +29,6 @@ describe ReactiveCaching, :use_clean_rails_memory_store_caching do end end - let(:now) { Time.now.utc } - - around do |example| - Timecop.freeze(now) { example.run } - end - let(:calculation) { -> { 2 + 2 } } let(:cache_key) { "foo:666" } let(:instance) { CacheTest.new(666, &calculation) } @@ -49,13 +43,15 @@ describe ReactiveCaching, :use_clean_rails_memory_store_caching do context 'when cache is empty' do it { is_expected.to be_nil } - it 'queues a background worker' do + it 'enqueues a background worker to bootstrap the cache' do expect(ReactiveCachingWorker).to receive(:perform_async).with(CacheTest, 666) go! end it 'updates the cache lifespan' do + expect(reactive_cache_alive?(instance)).to be_falsy + go! expect(reactive_cache_alive?(instance)).to be_truthy @@ -69,6 +65,18 @@ describe ReactiveCaching, :use_clean_rails_memory_store_caching do it { is_expected.to eq(2) } + it 'does not enqueue a background worker' do + expect(ReactiveCachingWorker).not_to receive(:perform_async) + + go! + end + + it 'updates the cache lifespan' do + expect(Rails.cache).to receive(:write).with(alive_reactive_cache_key(instance), true, expires_in: anything) + + go! + end + context 'and expired' do before do invalidate_reactive_cache(instance) diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb index f22fec31514..981ac768e3a 100644 --- a/spec/requests/api/runners_spec.rb +++ b/spec/requests/api/runners_spec.rb @@ -46,6 +46,7 @@ describe API::Runners do expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers expect(json_response).to be_an Array + expect(json_response[0]).to have_key('ip_address') expect(descriptions).to contain_exactly( 'Project runner', 'Two projects runner' ) @@ -59,6 +60,7 @@ describe API::Runners do expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers expect(json_response).to be_an Array + expect(json_response[0]).to have_key('ip_address') expect(shared).to be_falsey end @@ -87,6 +89,7 @@ describe API::Runners do expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers expect(json_response).to be_an Array + expect(json_response[0]).to have_key('ip_address') expect(shared).to be_truthy end end @@ -106,6 +109,7 @@ describe API::Runners do expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers expect(json_response).to be_an Array + expect(json_response[0]).to have_key('ip_address') expect(shared).to be_falsey end @@ -515,6 +519,7 @@ describe API::Runners do expect(response).to have_gitlab_http_status(200) expect(response).to include_pagination_headers expect(json_response).to be_an Array + expect(json_response[0]).to have_key('ip_address') expect(shared).to be_truthy end end |