Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
16674d9b
Commit
16674d9b
authored
Nov 15, 2016
by
Nick Thomas
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix a badly-performing migration
parent
5f4ab1cd
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
23 additions
and
23 deletions
+23
-23
db/post_migrate/20161109150329_fix_project_records_with_invalid_visibility.rb
...1109150329_fix_project_records_with_invalid_visibility.rb
+23
-23
No files found.
db/post_migrate/20161109150329_fix_project_records_with_invalid_visibility.rb
View file @
16674d9b
class
FixProjectRecordsWithInvalidVisibility
<
ActiveRecord
::
Migration
include
Gitlab
::
Database
::
MigrationHelpers
BATCH_SIZE
=
10
00
BATCH_SIZE
=
5
00
DOWNTIME
=
false
# This migration is idempotent and there's no sense in throwing away the
...
...
@@ -12,34 +12,34 @@ class FixProjectRecordsWithInvalidVisibility < ActiveRecord::Migration
projects
=
Arel
::
Table
.
new
(
:projects
)
namespaces
=
Arel
::
Table
.
new
(
:namespaces
)
finder
=
finder
_sql
=
projects
.
join
(
namespaces
,
Arel
::
Nodes
::
InnerJoin
).
on
(
projects
[
:namespace_id
].
eq
(
namespaces
[
:id
])).
where
(
projects
[
:visibility_level
].
gt
(
namespaces
[
:visibility_level
])).
project
(
projects
[
:id
]).
take
(
BATCH_SIZE
)
project
(
projects
[
:id
],
namespaces
[
:visibility_level
]).
take
(
BATCH_SIZE
).
to_sql
#
MySQL requires a derived table to perform this query
nested_finder
=
projects
.
from
(
finder
.
as
(
"AS projects_inner"
)).
project
(
projects
[
:id
])
#
Update matching rows in batches. Each batch can cause up to 3 UPDATE
# statements, in addition to the SELECT: one per visibility_level
loop
do
to_update
=
connection
.
exec_query
(
finder_sql
)
break
if
to_update
.
rows
.
count
==
0
valuer
=
namespaces
.
where
(
namespaces
[
:id
].
eq
(
projects
[
:namespace_id
])).
project
(
namespaces
[
:visibility_level
])
# row[0] is projects.id, row[1] is namespaces.visibility_level
updates
=
to_update
.
rows
.
each_with_object
(
Hash
.
new
{
|
h
,
k
|
h
[
k
]
=
[]
})
do
|
row
,
obj
|
obj
[
row
[
1
]]
<<
row
[
0
]
end
# Update matching rows until none remain. The finder contains a limit.
loop
do
updates
.
each
do
|
visibility_level
,
project_ids
|
updater
=
Arel
::
UpdateManager
.
new
(
ActiveRecord
::
Base
).
table
(
projects
).
set
(
projects
[
:visibility_level
]
=>
Arel
::
Nodes
::
SqlLiteral
.
new
(
"(
#{
valuer
.
to_sql
}
)"
)
).
where
(
projects
[
:id
].
in
(
nested_finder
))
set
(
projects
[
:visibility_level
]
=>
visibility_level
).
where
(
projects
[
:id
].
in
(
project_ids
))
num_updated
=
connection
.
exec_update
(
updater
.
to_sql
,
self
.
class
.
name
,
[])
break
if
num_updated
==
0
ActiveRecord
::
Base
.
connection
.
exec_update
(
updater
.
to_sql
,
self
.
class
.
name
,
[])
end
end
end
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment