Commit 5a460397 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Merge branch...

Merge branch '52780-stale-pipeline-status-cache-for-_project-after-disabling-pipelines' into 'master'

Resolve "Stale pipeline status cache for `_project` after disabling pipelines"

Closes #52780

See merge request gitlab-org/gitlab-ce!22589
parents b868b02c 77cfdb0a
---
title: Cache pipeline status per SHA.
merge_request: 22589
author:
type: fixed
...@@ -42,7 +42,7 @@ module Gitlab ...@@ -42,7 +42,7 @@ module Gitlab
end end
def self.cache_key_for_project(project) def self.cache_key_for_project(project)
"#{Gitlab::Redis::Cache::CACHE_NAMESPACE}:projects/#{project.id}/pipeline_status" "#{Gitlab::Redis::Cache::CACHE_NAMESPACE}:projects/#{project.id}/pipeline_status/#{project.commit&.sha}"
end end
def self.update_for_pipeline(pipeline) def self.update_for_pipeline(pipeline)
...@@ -84,9 +84,7 @@ module Gitlab ...@@ -84,9 +84,7 @@ module Gitlab
def load_from_project def load_from_project
return unless commit return unless commit
self.sha = commit.sha self.sha, self.status, self.ref = commit.sha, commit.status, project.default_branch
self.status = commit.status
self.ref = project.default_branch
end end
# We only cache the status for the HEAD commit of a project # We only cache the status for the HEAD commit of a project
...@@ -104,6 +102,8 @@ module Gitlab ...@@ -104,6 +102,8 @@ module Gitlab
def load_from_cache def load_from_cache
Gitlab::Redis::Cache.with do |redis| Gitlab::Redis::Cache.with do |redis|
self.sha, self.status, self.ref = redis.hmget(cache_key, :sha, :status, :ref) self.sha, self.status, self.ref = redis.hmget(cache_key, :sha, :status, :ref)
self.status = nil if self.status.empty?
end end
end end
......
...@@ -282,6 +282,21 @@ describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cache do ...@@ -282,6 +282,21 @@ describe Gitlab::Cache::Ci::ProjectPipelineStatus, :clean_gitlab_redis_cache do
expect(pipeline_status.status).to eq(status) expect(pipeline_status.status).to eq(status)
expect(pipeline_status.ref).to eq(ref) expect(pipeline_status.ref).to eq(ref)
end end
context 'when status is empty string' do
before do
Gitlab::Redis::Cache.with do |redis|
redis.mapped_hmset(cache_key,
{ sha: sha, status: '', ref: ref })
end
end
it 'reads the status as nil' do
pipeline_status.load_from_cache
expect(pipeline_status.status).to eq(nil)
end
end
end end
describe '#has_cache?' do describe '#has_cache?' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment