続：GitLabのプロジェクト import に苦労した話

# GitLabのプロジェクトの import に苦労した話

[前回](https://qiita.com/tetsukay/items/9144b1ea1c7269a138d8) の続きなような続いてないような．

前回はexportに苦労した話でしたが，今回はimportに苦労した話です．（まだ微妙に解決していませんが）
なお，前回エクスポートしたプロジェクトとは別なものです．

## インポートできない

エクスポートは [前回](https://qiita.com/tetsukay/items/9144b1ea1c7269a138d8) の経験を活かし，無事問題なく乗り切った．
しかし，インポートしてみると…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51949/29a85971-7f4b-d177-4721-1b3f4264779a.png)


```:エラーメッセージ全文
Error importing repository into smilezemi/{project_name} - tar (child): [REPO EXPORT PATH]/uploads/db1eb959a204dc2b92*****a3994f56a: Cannot open: No such file or directory 
tar (child): Error is not recoverable: exiting now 
tar: Child returned status 2 
tar: Error is not recoverable: exiting now , Unable to decompress [REPO EXPORT PATH]/uploads/db1eb959a204dc2b92*****a3994f56a into [REPO EXPORT PATH]/smilezemi/{project_name}/ac233d2ddf59d96d51646c*****a79b1 
```

:cry: 

インポート処理中に突然の No such file or directory．
この時点では完全に推測ですが，インポート処理中にクリーンアップのバックグラウンドプロセスがインポート対象のファイルを削除してしまってエラーになっているのかなーと推測していました．

# 環境

- Export，Importサーバ共通
    - 8core 31GB RAM Amazon Linux
    - GitLab 10.7.3-ee 584a495
- Project
    - 2.2GB repository size

# 関連Issue

[Cannot import project into fresh omnibus gitlab instance](https://gitlab.com/gitlab-org/gitlab-ee/issues/5874)

[コメント](https://gitlab.com/gitlab-org/gitlab-ee/issues/5874#note_71608807) を見ると 「Sidekiq の concurrency を1にセットすると回避できた」とありました．
このあたりで，上の推測が現実味を帯びてきます．
ただ，試してみたものの，インポート用のプロジェクトファイルをアップロード中に，あっという間にSidekiqのジョブが数百積まれたので諦めて元に戻しました．

# 調査

## Sidekiq.log

関連Issueでは言及されていませんでしたが，弊社のSidekiq.logを確認したところ，少し（かなり？）怪しい箇所が有りました．

### X時21分 RepositoryImportWorkerが稼働

`TID-os9vtfgwg RepositoryImportWorker JID-0eb9b2667c84c7245df9037b INFO: start`

### X時25分 突然の Sidekiq shutdown

```
TID-os9sk28c4 WARN: sending Sidekiq worker PID-20707 SIGTSTP (stop fetching new jobs)
TID-os9sk28c4 WARN: waiting 30 seconds before sending Sidekiq worker PID-20707 SIGTERM (gracefully shut down)
TID-os9yd9q6g INFO: Received TSTP, no longer accepting new work
TID-os9wrwrm4 INFO: Scheduler exiting...
TID-os9yd9q6g INFO: Terminating quiet workers
TID-os9vihntg INFO: Scheduler exiting...
TID-os9sk28c4 WARN: sending Sidekiq worker PID-20707 SIGTERM (gracefully shut down)
TID-os9sk28c4 WARN: waiting 6 seconds before sending Sidekiq worker PID-20707 SIGKILL (die)
TID-os9yd9q6g INFO: Shutting down
TID-os9yd9q6g INFO: Pausing to allow workers to finish...
TID-os9yd9q6g WARN: Terminating 1 busy worker threads
TID-os9yd9q6g WARN: Work still in progress [#<struct Sidekiq::BasicFetch::UnitOfWork queue="queue:repository_import", job="{\"retry\":false,\"args\":[453],\"class\":\"RepositoryImportWorker\",\"queue\":\"repository_import\",\"backtrace\":5,\"status_expiration\":54000,\"jid\":\"0eb9b2667c84c7245df9037b\",\"created_at\":1526538090.6663377,\"enqueued_at\":1526538090.7046638}">]
TID-os9yd9q6g INFO: Pushed 1 jobs back to Redis
TID-os9yd9q6g INFO: Bye!
TID-os9vtfgwg RepositoryImportWorker JID-0eb9b2667c84c7245df9037b INFO: fail: 278.995 sec
TID-otfa2anx4 INFO: Booting Sidekiq 5.0.5 with redis options {:path=>"/var/opt/gitlab/redis/redis.socket", :namespace=>"resque:gitlab", :id=>"Sidekiq-server-PID-10012", :url=>nil}
```

### X時26分 Sidekiq 再起動

`TID-otf79d620 RepositoryImportWorker JID-0eb9b2667c84c7245df9037b INFO: start`

そしてSidekiqが再起動した直後

`TID-otfa2anx4 INFO: Cron Jobs - add job with name: import_export_project_cleanup_worker`

ADD JOB **import_export_project_cleanup_worker!!!**

### X時30分 エラーで処理中止

```
TID-otf79d620 RepositoryImportWorker JID-0eb9b2667c84c7245df9037b INFO: fail: 255.313 sec
TID-otf79d620 WARN: {"context":"Job raised exception","job":{"retry":false,"args":[453],"class":"RepositoryImportWorker","queue":"repository_import","backtrace":5,"status_expiration":54000,"jid":"0eb9b2667c84c7245df9037b","created_at":1526538090.6663377,"enqueued_at":1526538090.7046638},"jobstr":"{\"retry\":false,\"args\":[453],\"class\":\"RepositoryImportWorker\",\"queue\":\"repository_import\",\"backtrace\":5,\"status_expiration\":54000,\"jid\":\"0eb9b2667c84c7245df9037b\",\"created_at\":1526538090.6663377,\"enqueued_at\":1526538090.7046638}"}
TID-otf79d620 WARN: RuntimeError: Error importing repository  into smilezemi/{project_name} - tar (child): /var/opt/gitlab/gitlab-rails/shared/tmp/project_exports/uploads/db1eb959a204dc2b926e619a3994f56a: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
, Unable to decompress /var/opt/gitlab/gitlab-rails/shared/tmp/project_exports/uploads/db1eb959a204dc2b926e619a3994f56a into /var/opt/gitlab/gitlab-rails/shared/tmp/project_exports/smilezemi/{project_name}/ac233d2ddf59d96d51646c68209a79b1
```

このように，インポート処理中にSidekiqが再起動しています．

# GitLabサポートを依頼

この辺で諦めて，一旦GitLabサポートに依頼するようにしました．

## GitLab社：「Sidekiqのメモリ割り当てを増やして」

メモリに余裕はあったものの，Sidekiqのメモリ割り当てが少なく再起動してそうなので，割当を増やしてみてとのこと．
具体的には以下を `gitlab.rb` に追記するように指示されました．

```
gitlab_rails['env'] = {
'SIDEKIQ_MEMORY_KILLER_MAX_RSS' => "0",
'SIDEKIQ_MEMORY_KILLER_GRACE_TIME' => "1200",
}
```

## 再度インポートを試す

Sidekiqへのメモリ割り当てを増やしたので，再試行してみました．

### エラーが変わる

Sidekiqの再起動がなくなり，インポートジョブが進んだように見えるものの，別のエラーが発生しました．

```
Error importing repository into smilezemi/{project_name} - Validation failed: Title already exists at group level for smilezemi. Please choose another one.
```

タイトルがグループレベルにすでに存在する？
プロジェクトのインポートだから，同じ名前のプロジェクトがすでに存在するという意味でしょうか？（いやそんなはずはない）
実際，プロジェクト名を変えて試しても同じエラーでうまく行きません．
サポートへ状況の変化を通知

## GitLab社「ラベルが問題のようなので以下試して」

GitLab社から提示された問題とその解決は2つ．どちらも未解決のIssueです．

- [Resolve common GitLab.com import/export issues](https://gitlab.com/gitlab-org/gitlab-ce/issues/42659)
- [Project import does not reconcile group labels with project labels](https://gitlab.com/gitlab-org/gitlab-ce/issues/29520)

上のIssueは，「Labelの最後にスペースが含まれているとImportに失敗する」というもの．
プロジェクトを確認しましたが，Labelのおしりにスペースが含まれているものはありませんでした．

「下のIssueはプロジェクトのラベルと同じラベルが，グループラベルに存在するとImportに失敗する」というもの（なんでやねん）
プロジェクトを確認すると，IssueBoardで自動的に作られる（と思われる）「To Do」や「Doing」といったラベルが有りました．
グループレベルのLabelはほとんど使用されていなかったため， `group-Doing` とか適当な名前でリネームしました．

## Import成功

再度試したところ，無事インポートが完了しました．
ただ，すでにプロジェクトは進んでいるので，再度Export/Importを行って無事成功したらGitLab社に報告する予定です．

# まとめ

今回ブチあたった問題点は2つ

- Sidekiqの割当メモリが足りない
    - Exportに続き，相変わらずメモリは食うようです．多めに用意しましょう．
- Label周りのバグ
    - 改修を進めているようですが，しばらくはGroupラベルとProjectラベルを意識しておく必要がありそうです．同じ名前のラベルがあるとImportに失敗します．

# 余談1

GitHubがMicrosoftに買収されるという話で GitLabは [#movingtogitlab](https://about.gitlab.com/2018/06/03/movingtogitlab/) と煽りに煽っています．（ [GitHubからのImportがいつもの10倍だぜ！](https://twitter.com/gitlab/status/1003409836170547200) とか）
GitHubからのインポートもいいですが，GitLabからのインポートもできるようにしてくれませんかね…

# 余談2

それでも私は GitLab が好き