gitlab-org--gitlab-foss/spec/lib
Stan Hu d306b0d7c2 Merge branch 'use-optimistic-locking' into 'master'
Use optimistic locking

## What does this MR do?
Removes the usage of pessimistic locking in favor of optimistic which is way cheaper and doesn't block database operation.

Since this is very simple change it should be safe. If we receive `StaleObjectError` message we will reload object a retry operations in lock.

However, I still believe that we need this one: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/7005 as this will reduce a load on Database and FS.
This changes a behavior from:

### Pesimistic locking (previous behavior)

#### For updating
1. SELECT * FOR UPDATE (other updates wait on this)
2. we update ci_pipeline
3. latest_build_status
4. enqueue: (use: transition :created -> :pending)
5. [state_machine] we are in  state created, we can go to pending
6. [state_machine] ci_pipeline.status = created
7. [state_machine] ci_pipeline.save
8. [state_machine] after_transition: (if for success): PipelineSuccessWorker on Sidekiq
9. release DB lock

#### If no update is required
1. SELECT * FOR UPDATE (other updates wait on this)
2. we update ci_pipeline
3. latest_build_status
4. we are in pending, we can't transition to pending, because it's forbidden
5. release DB lock

### Optimistic locking (implemented by this MR)

#### For updating
1. latest_build_status
2. enqueue: (use `transition :created -> :pending`)
3. [state_machine] we are in state created, we can go to pending
4. [state_machine] ci_pipeline.status = created
5. [state_machine] ci_pipeline.save
6. [state_machine] [save] where(lock_version: ci_pipeline.lock_version).update_all(status: :created, updated_at: Time.now)
7. [state_machine] [save] unless we_updated_row then raise ObjectInconsistentError

#### If no update is required
1. we update ci_pipeline
2. latest_build_status
3. we are in pending, we can't transition to pending, because it's forbidden

## Why was this MR needed?
We have been seeing a number of problems when we migrated Pipeline/Build processing to Sidekiq. Especially we started seeing a lot of blocking queries.

We used a pessimistic locking which doesn't seem to be required. This effectively allows us to fix our issues with blocked queries by using more efficient method of operation.

## What are the relevant issue numbers?
Issues: https://gitlab.com/gitlab-com/infrastructure/issues/623 and https://gitlab.com/gitlab-com/infrastructure/issues/584, but also there's a bunch of Merge Requests that try to improve behavior of scheduled jobs.

cc @pcarranza @yorickpeterse @stanhu

See merge request !7040
2016-10-28 14:41:24 +00:00
..
banzai Add failing test for #21420 2016-10-24 22:18:34 +02:00
ci Add logical validation to gitlab-ci.yml 2016-10-18 12:22:51 +02:00
constraints Add relative url support to routing contrainers 2016-10-24 13:51:17 +03:00
container_registry Explicitly remove authorization token and make sure that invalid addresses are properly handled 2016-07-15 17:35:23 +02:00
gitlab Merge branch 'use-optimistic-locking' into 'master' 2016-10-28 14:41:24 +00:00
json_web_token
disable_email_interceptor_spec.rb adds second batch of tests changed to active tense 2016-08-09 15:11:39 +01:00
event_filter_spec.rb Fix inconsistent highlighting of already selected activity nav-links 2016-10-05 15:38:18 -05:00
expand_variables_spec.rb Verify expandability of variables defined as part of environment 2016-09-19 10:07:13 +02:00
extracts_path_spec.rb Allow browsing branches that end with '.atom' 2016-10-11 13:31:12 +01:00
file_size_validator_spec.rb
git_ref_validator_spec.rb
gitlab_spec.rb Update `Gitlab.com?` to support staging 2016-06-27 15:10:36 -04:00
repository_cache_spec.rb Use project ID in repository cache to prevent stale data from persisting across projects 2016-07-25 05:09:28 -07:00