info: Project transfer failed halfway

Hi there,

I spend some time today debugging this issue. For us it's solved, but just wanted to share it with you.

A colleague of my started a new project in his own namespace, discovered that it should be in a group so he tried to transfer the project. Somehow Gitlab kept hanging (can happen) and the process/request never finished the transfer.

The project then exist in both the group and the personal namespace, but wasn't reachable (ERR_TOO_MANY_REDIRECTS ). After some debugging, I figured out that the database wasn't successfully updated after the transfer:

(I've changed the username to user, group-name to group and project-name to some-project)

select id, name, path, type from namespaces where id = 7 or id = 21;
 id |   name    |   path    | type  
----+-----------+-----------+-------
  7 | user      | user      | 
 21 | group     | group     | Group
(2 rows)
select id, name, path, namespace_id from projects where id = 444;
 id  |     name     |    path      | namespace_id 
-----+--------------+--------------+--------------
 444 | some-project | some-project |            7
(1 row)
select * from project_group_links where project_id = 444;
 id | project_id | group_id | group_access | expires_at 
----+------------+----------+--------------+------------
 18 |        444 |       21 |           40 | 
(1 row)
select * from redirect_routes where source_id = 444;
 id  | source_id | source_type |        path       | permanent 
-----+-----------+-------------+-------------------+-----------
 202 |       444 | Project     | user/some-project | f
(1 row)
select * from routes where source_id = 444;
 id  | source_id | source_type |        path        |        name                  
-----+-----------+-------------+--------------------+------------------------
 546 |       444 | Project     | group/some-project | group / some-project
(1 row)

I was able to remove the project in the web-interface after:

  1. delete from redirect_routes where id = 202;
  2. update routes set path = 'user/some-project' where id = 546;

Maybe it could be nice to check on this kind of misconfigurations in future?

Gitlab version: GitLab Enterprise Edition 10.6.4-ee 42f072e

Logs (hide some info):

{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.83,"view":0.0,"db":2.52,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.135Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.25,"view":0.0,"db":2.49,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.185Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.45,"view":0.0,"db":2.64,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.236Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":16.9,"view":0.0,"db":2.43,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.285Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.0,"view":0.0,"db":2.59,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.337Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.39,"view":0.0,"db":2.53,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.388Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.91,"view":0.0,"db":2.45,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.437Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.4,"view":0.0,"db":2.48,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.493Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.03,"view":0.0,"db":2.48,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.544Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":18.33,"view":0.0,"db":2.51,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.591Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.39,"view":0.0,"db":2.57,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.642Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":20.06,"view":0.0,"db":3.63,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.693Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
{"method":"GET","path":"/user/some-project","format":"html","controller":"ProjectsController","action":"show","status":302,"duration":17.55,"view":0.0,"db":2.55,"location":"https://company-git.com/user/some-project","time":"2018-04-12T08:02:52.749Z","params":[{"key":"namespace_id","value":"user"},{"key":"id","value":"some-project"}],"remote_ip":"127.0.0.1","user_id":1,"username":"mvancalker"}
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Redirected to https://company-git.com/user/some-project
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Redirected to https://company-git.com/user/some-project
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Redirected to https://company-git.com/user/some-project
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Redirected to https://company-git.com/user/some-project
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Redirected to https://company-git.com/user/some-project
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Redirected to https://company-git.com/user/some-project
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Redirected to https://company-git.com/user/some-project
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Redirected to https://company-git.com/user/some-project
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Redirected to https://company-git.com/user/some-project
Started GET "/user/some-project" for 127.0.0.1 at 2018-04-12 10:02:52 +0200
  Parameters: {"namespace_id"=>"user", "id"=>"some-project"}
Edited by Martijn van Calker