Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
0adedbb4
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0adedbb4
编写于
4月 01, 2019
作者:
H
Hiroyuki Sato
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix the bug that the project statistics is not updated
上级
c7f918aa
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
107 addition
and
22 deletion
+107
-22
app/workers/all_queues.yml
app/workers/all_queues.yml
+1
-0
app/workers/project_cache_worker.rb
app/workers/project_cache_worker.rb
+8
-6
app/workers/update_project_statistics_worker.rb
app/workers/update_project_statistics_worker.rb
+22
-0
changelogs/unreleased/delay-update-statictics.yml
changelogs/unreleased/delay-update-statictics.yml
+5
-0
config/sidekiq_queues.yml
config/sidekiq_queues.yml
+2
-1
spec/workers/project_cache_worker_spec.rb
spec/workers/project_cache_worker_spec.rb
+21
-15
spec/workers/update_project_statistics_worker_spec.rb
spec/workers/update_project_statistics_worker_spec.rb
+48
-0
未找到文件。
app/workers/all_queues.yml
浏览文件 @
0adedbb4
...
...
@@ -143,6 +143,7 @@
-
repository_remove_remote
-
system_hook_push
-
update_merge_requests
-
update_project_statistics
-
upload_checksum
-
web_hook
-
repository_update_remote_mirror
...
...
app/workers/project_cache_worker.rb
浏览文件 @
0adedbb4
...
...
@@ -28,18 +28,20 @@ class ProjectCacheWorker
def
update_statistics
(
project
,
statistics
=
[])
return
if
Gitlab
::
Database
.
read_only?
return
unless
try_obtain_lease_for
(
project
.
id
,
:update_
statistics
)
return
unless
try_obtain_lease_for
(
project
.
id
,
statistics
)
Rails
.
logger
.
info
(
"Updating statistics for project
#{
project
.
id
}
"
)
project
.
statistics
.
refresh!
(
only:
statistics
)
UpdateProjectStatisticsWorker
.
perform_in
(
LEASE_TIMEOUT
,
project
.
id
,
statistics
)
end
private
def
try_obtain_lease_for
(
project_id
,
s
ection
)
def
try_obtain_lease_for
(
project_id
,
s
tatistics
)
Gitlab
::
ExclusiveLease
.
new
(
"project_cache_worker:
#{
project_id
}
:
#{
section
}
"
,
timeout:
LEASE_TIMEOUT
)
.
new
(
project_cache_worker_key
(
project_id
,
statistics
)
,
timeout:
LEASE_TIMEOUT
)
.
try_obtain
end
def
project_cache_worker_key
(
project_id
,
statistics
)
([
"project_cache_worker"
,
project_id
]
+
statistics
.
sort
).
join
(
":"
)
end
end
app/workers/update_project_statistics_worker.rb
0 → 100644
浏览文件 @
0adedbb4
# frozen_string_literal: true
# Worker for updating project statistics.
class
UpdateProjectStatisticsWorker
include
ApplicationWorker
# project_id - The ID of the project for which to flush the cache.
# statistics - An Array containing columns from ProjectStatistics to
# refresh, if empty all columns will be refreshed
# rubocop: disable CodeReuse/ActiveRecord
def
perform
(
project_id
,
statistics
=
[])
project
=
Project
.
find_by
(
id:
project_id
)
return
unless
project
&&
project
.
repository
.
exists?
Rails
.
logger
.
info
(
"Updating statistics for project
#{
project
.
id
}
"
)
project
.
statistics
.
refresh!
(
only:
statistics
.
map
(
&
:to_sym
))
end
# rubocop: enable CodeReuse/ActiveRecord
end
changelogs/unreleased/delay-update-statictics.yml
0 → 100644
浏览文件 @
0adedbb4
---
title
:
Fix the bug that the project statistics is not updated
merge_request
:
26854
author
:
Hiroyuki Sato
type
:
fixed
config/sidekiq_queues.yml
浏览文件 @
0adedbb4
...
...
@@ -89,4 +89,5 @@
- [project_daily_statistics, 1]
- [import_issues_csv, 2]
- [chat_notification, 2]
- [migrate_external_diffs, 1]
- [migrate_external_diffs, 1]
- [update_project_statistics, 1]
spec/workers/project_cache_worker_spec.rb
浏览文件 @
0adedbb4
...
...
@@ -7,9 +7,9 @@ describe ProjectCacheWorker do
let
(
:worker
)
{
described_class
.
new
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:statistics
)
{
project
.
statistics
}
let
(
:lease_key
)
{
"project_cache_worker:
#{
project
.
id
}
:update_statistics"
}
let
(
:lease_key
)
{
([
"project_cache_worker"
,
project
.
id
]
+
statistics
.
sort
).
join
(
":"
)
}
let
(
:lease_timeout
)
{
ProjectCacheWorker
::
LEASE_TIMEOUT
}
let
(
:statistics
)
{
[]
}
describe
'#perform'
do
before
do
...
...
@@ -35,14 +35,6 @@ describe ProjectCacheWorker do
end
context
'with an existing project'
do
it
'updates the project statistics'
do
expect
(
worker
).
to
receive
(
:update_statistics
)
.
with
(
kind_of
(
Project
),
%i(repository_size)
)
.
and_call_original
worker
.
perform
(
project
.
id
,
[],
%w(repository_size)
)
end
it
'refreshes the method caches'
do
expect_any_instance_of
(
Repository
).
to
receive
(
:refresh_method_caches
)
.
with
(
%i(readme)
)
...
...
@@ -51,6 +43,18 @@ describe ProjectCacheWorker do
worker
.
perform
(
project
.
id
,
%w(readme)
)
end
context
'with statistics'
do
let
(
:statistics
)
{
%w(repository_size)
}
it
'updates the project statistics'
do
expect
(
worker
).
to
receive
(
:update_statistics
)
.
with
(
kind_of
(
Project
),
%i(repository_size)
)
.
and_call_original
worker
.
perform
(
project
.
id
,
[],
statistics
)
end
end
context
'with plain readme'
do
it
'refreshes the method caches'
do
allow
(
MarkupHelper
).
to
receive
(
:gitlab_markdown?
).
and_return
(
false
)
...
...
@@ -66,13 +70,15 @@ describe ProjectCacheWorker do
end
describe
'#update_statistics'
do
let
(
:statistics
)
{
%w(repository_size)
}
context
'when a lease could not be obtained'
do
it
'does not update the repository size'
do
stub_exclusive_lease_taken
(
lease_key
,
timeout:
lease_timeout
)
expect
(
statistics
).
not_to
receive
(
:refresh!
)
expect
(
UpdateProjectStatisticsWorker
).
not_to
receive
(
:perform_in
)
worker
.
update_statistics
(
project
)
worker
.
update_statistics
(
project
,
statistics
.
map
(
&
:to_sym
)
)
end
end
...
...
@@ -80,11 +86,11 @@ describe ProjectCacheWorker do
it
'updates the project statistics'
do
stub_exclusive_lease
(
lease_key
,
timeout:
lease_timeout
)
expect
(
statistics
).
to
receive
(
:refresh!
)
.
with
(
only:
%i(repository_size
)
)
expect
(
UpdateProjectStatisticsWorker
).
to
receive
(
:perform_in
)
.
with
(
lease_timeout
,
project
.
id
,
statistics
.
map
(
&
:to_sym
))
.
and_call_original
worker
.
update_statistics
(
project
,
%i(repository_size
)
)
worker
.
update_statistics
(
project
,
statistics
.
map
(
&
:to_sym
))
end
end
end
...
...
spec/workers/update_project_statistics_worker_spec.rb
0 → 100644
浏览文件 @
0adedbb4
require
'spec_helper'
describe
UpdateProjectStatisticsWorker
do
let
(
:worker
)
{
described_class
.
new
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
describe
'#perform'
do
context
'with a non-existing project'
do
it
'does nothing'
do
expect_any_instance_of
(
ProjectStatistics
).
not_to
receive
(
:refresh!
)
worker
.
perform
(
-
1
)
end
end
context
'with an existing project without a repository'
do
it
'does nothing'
do
allow_any_instance_of
(
Repository
).
to
receive
(
:exists?
).
and_return
(
false
)
expect_any_instance_of
(
ProjectStatistics
).
not_to
receive
(
:refresh!
)
worker
.
perform
(
project
.
id
)
end
end
context
'with an existing project'
do
it
'refreshes the project statistics'
do
expect_any_instance_of
(
ProjectStatistics
).
to
receive
(
:refresh!
)
.
with
(
only:
[])
.
and_call_original
worker
.
perform
(
project
.
id
)
end
context
'with a specific statistics target'
do
it
'refreshes the project repository size'
do
statistics_target
=
%w(repository_size)
expect_any_instance_of
(
ProjectStatistics
).
to
receive
(
:refresh!
)
.
with
(
only:
statistics_target
.
map
(
&
:to_sym
))
.
and_call_original
worker
.
perform
(
project
.
id
,
statistics_target
)
end
end
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录