使いたい！ホットコードローディング

Erlangといえば、まずが思い出したのはなんだろう？OTPとか、アクターモデルとか、パターンマッチとか、Erlangerにとってどちらも日々仕事の中で当たり前の概念になりましたよね。でもその中にはなんとかひとつ神秘な場所が存在するじゃない？暗くて危ない、都市伝説のような、それはホットコードローディングである。

## Erlang地獄、そして最下層？

有名な Erlang 教科書『Learn you some Erlang for great good』の中で、ホットコードローディングについてこう書かれています

> これからOTPの中で最も複雑で、理解しがたく、正しく動作させることが難しく、時間もかかる部分の内の1つについて話そうとしています。 事実、すべての手順（以下relupと呼びます）を避け、単純にVMを再起動し新しいアプリケーションを起動することで更新ができるなら、そちらを選ぶことをおすすめします。 relupは「殺るか殺られるか」のツールの1つです。 選択肢がほとんど無いときに使うものです。
> 
> ーー[「25. プロセスの冒険でレベルを上げる」](http://www.ymotongpoo.com/works/lyse-ja/ja/25_leveling_up_in_the_process_quest.html#erlang)

怖そう！

確かに、Erlangの公式ドキュメントを覗けてみると、ホットコードローディング関連するトピックたくさんありそう

* [appup](http://www.erlang.org/doc/man/appup.html)
* [Appup Cookbook](http://www.erlang.org/doc/design_principles/appup_cookbook.html)
* [Release Handling](http://www.erlang.org/doc/design_principles/release_handling.html)
* [relup](http://www.erlang.org/doc/man/relup.html)
* [release_handler](http://www.erlang.org/doc/man/release_handler.html)
* [systool](http://www.erlang.org/doc/man/systools.html)

そして、ゴーゴルで検索したら、幾つのポストも出てくる：

* [Hot code reloading with Erlang and Rebar3](https://medium.com/@kansi/hot-code-loading-with-erlang-and-rebar3-8252af16605b) ([HN](https://news.ycombinator.com/item?id=10669131))
* [Hot Code Swapping](https://github.com/nickmcdowall/Erlang-Examples/wiki/Hot-Code-Swapping)
* [Automatic .appup file generation](http://dukesoferl.blogspot.co.uk/2009/05/automatic-appup-file-generation.html)

オープンソースツールや使用例なども：

* [relx](https://github.com/erlware/relx)
* [relflow](https://github.com/RJ/relflow)
* [knit](https://github.com/davisp/knit)
* [edeliver](https://github.com/boldpoker/edeliver)
* [Rebar Upgrades](https://github.com/rebar/rebar/wiki/Upgrades)
* [elevators](https://github.com/extend/elevators)

qiita にも：

* [3分で分かる Erlang hot code loading](http://qiita.com/kojingharang/items/5762ed009b67b95f22e1) （@kojingharang さんから）
* [ホットコードローディング時のプロセスクラッシュについて](http://qiita.com/sile/items/697f80db992819056127) （@sile さんから）

でもやはり最初から把握したい、どこから初めていいのかをはっきりわかってほしい。だから今度は自分もホットコードローディングについてをちょっと説明します。もし少しでも参考になったら幸いです。

## Hot and Cold

まず、Hot じゃなくて、一番慣れている Cold をみましょう

![cold-upgrade.png](https://qiita-image-store.s3.amazonaws.com/0/19120/ddab7d6b-2058-de3a-ba99-5c61a293fd34.png)


システムを`stop`して、それで必要な変更をしてから、もう一度うゼロからシステムを`start`する。状態は保たられません。

Hotの場合はこうです

![hot-upgrade.png](https://qiita-image-store.s3.amazonaws.com/0/19120/8318d2c9-92a7-cc63-0c96-468ef5aa9d81.png)


start/stopの代わりに、システムを稼働しているままで、直接状態を変換して、モジュールも置き換えます。

かっこいいじゃないこれ、Hotだよ。でも具体的にはどういう過程なのかな。

## Erlang リリースの構造

Erlang、あるいはOTPの中の基本作用単位はアプリケーションとなります。それぞれのアプリケーションを組み合わせて、reltool (今はrelxが流行り)を利用して配布できるリリースを生成する。

![release.png](https://qiita-image-store.s3.amazonaws.com/0/19120/c3d39ff5-b119-554e-d0fc-b843a10cc48d.png)

この図を見ると、リリースは実はOSのようなものですね。Erlang自身のアプリケーションも、自分が書いたのアプリケーションも一緒にこのリリースいます。

## appupとrelup

リリースのアップグレードって、実はアプリケーションのアップグレードです。しかもアプリケーションごとに異なる手順があります。ここでは appup の出番になりました。

![appup.png](https://qiita-image-store.s3.amazonaws.com/0/19120/3c3a7528-6050-b617-ff57-859e947f6ae9.png)

それで、appupを集めてrelupにするのはsystoolsです。このrelupはrelease_handlerに渡されって、やっとリリースはアップグレードできます。

![relup.png](https://qiita-image-store.s3.amazonaws.com/0/19120/129568e9-3469-0083-57e9-c2f1314eac72.png)


## まとめ

こう見て意外と普通であたりまえの設計じゃない？

実は一番複雑なのはそのappupですね。なぜかといって、バージョンごとにアップグレードの手順も違いでしょう。汎用的な歩法まずはないと思います。詳しくはここで触れませんけど、上記したツールとポストをご参考してください。

とにかく、今日から使い始めよう、ホットコードローディング