ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

CRIUがプロセス/コンテナをリストアした後のプロセスの扱いの話

Linux Advent Calendar 2018, 21日目の記事です。遅れて申し訳... しかし意外と皆様脱落者が... ともかく、やっていきます。

ちょいと最近やってることの話をしようと思っていて、今日はCRIUがプロセス/コンテナをリストアするときのプロセスツリーの戦略の話をします。

CRIUのコマンドラインモードとサーバクライアントモード

先日の発表 で少し触れたのですが、CRIUには大きく二つの利用方法があります。一つはコマンドラインツール criu(8) からプロセスをダンプリストアする方法、もう一つが、クライアントサーバ方式で、クライアントライブラリをプログラム内部に組み込んで利用する方法です。

続きを読む

2019年4月、福岡にConference Weekが出現します

結論を最初に

  • 2019年4月15日の週は、 16日(火)に日本で初めての CloudNative Days Fukuoka が、18(木)〜20(土)RubyKaigi 2019 が開催される、一週間のうち半分以上、前夜祭なども含めると実質毎日カンファレンスな週となります。
  • この機会に、福岡に一週間まるっと来てみるのはいかがでしょう?

CloudNative Day Fukuoka の話

続きを読む

JapanContainerDays v18.12 でCRIUに関して発表してきた

いや〜楽しかった。資料は以下です。

speakerdeck.com

一応、JKDというイベントの性質を考えて資料も英語にしました(口頭は日本語ですが...)。ちょっと時間がなくネイティブチェックもなくて、英語が怪しくてすみません...。

発表中、デモをしたので、特に反響があった Haconiwa + CRIU によるRailsコンテナのライブマイグレーション のデモ動画を置いておきます。

www.dropbox.com

f:id:udzura:20181206002753p:plain

こういう構成で、Victimにアクセスを送り続けながらVictim上のコンテナのチェックポイントを取ると、いつのまにかDestの方で再生後のコンテナが上がります。オンメモリの状態は保持されています(というのもでもできると良かったかもと思った)。

自作の実験環境がちょっと不安定で苦労もしたんですが、起動の高速化(正確にはイメージからのリストア)、ライブマイグレーションの両方で可能性があることを伝えられて良かったです。引き続きいじっていきます。

で、イベントの感想とか、今後のアレのアレとかはまた明日!書きます。 zzz

mrubyのプロジェクトで、mruby自体やmgemのリビジョンを固定したい!!1

この記事は GMOペパボ Advent Calendar 2018 の3日目の記事です... 本当に遅くなりすいません...

さて、皆さんは、固定したいですか? ペパボは、 latest が最高!という文化の会社です(この記事唯一のペパボ要素)。

とは言え現実は社会なので、そういう時もあります。じゃあやっていきましょう。

続きを読む

mruby-metaprog がvanilla mrubyから切り出された話

タイトルの通りですが、そのようになるそうです。

とりあえず、ブログを書いて状況や対処法などを残しときます。

状況

github.com

このコミット以降、主に Kernel/Module のメソッドとして実装されたメタプログラミング機能を使いたい場合、 mruby-metaprog という同梱されるmgemを明示的に依存に追加する必要が出て来ます。

どれが対象で、どれが非対象かは当該コミットと、後のコミット (https://github.com/mruby/mruby/commit/b80e0ef7428b613a682da4d2a251c8beb24d6dd2) のコメントの通りです。

mruby-metaprog に移動したメソッド

 * Kernel module
   global_variables, local_variables, singleton_class,
   instance_variables, instance_variables_defined?, instance_variable_get,
   instance_variable_set, methods, private_methods, public_methods,
   protected_methods, singleton_methods, define_singleton_methods,
   send

 * Module class
   class_variables, class_variables_defined?, class_variable_get,
   class_variable_set, remove_class_variable, included_modules,
   instance_methods, remove_method, method_removed, constants

 * Module class methods
   constants, nesting

vanilla mruby(まったくmgemを含んでいないmrubyをこう呼ぶことにした)に残っているメソッド

 * Module class
   alias_method, undef_method, ancestors, const_defined?, const_get,
   const_set, remove_const, method_defined?, define_method

 * Toplevel object
   define_method

ちなみに Object#__send__ もvanilla mrubyに残留しているようです。

で、このコミットは、 mruby 1.4.1 より となります。

起こる問題

メタプログラミング機能を使ったmgemをこのコミット以降のmrubyで利用する場合、 mrbgem.rake に以下の一行を追加する必要があります(default.gembox にも含まれます)。

MRuby::Gem::Specification.new('mruby-sample') do |spec|
  spec.license = 'MIT'
  spec.authors = 'Uchio Kondo'
  # ...

  # <= here!
  spec.add_dependency 'mruby-metaprog', core: 'mruby-metaprog'
end

ここで問題があるのですが、このコミットが入る以前のmruby(最後のリリースである1.4.1含みます)でビルドする場合、このmgemは当然mruby同梱mgemではないのでビルドできないです。こういうエラーになります。

Can't find /home/travis/build/haconiwa/mruby-process-sys/mruby/mrbgems/mruby-metaprog/mrbgem.rake

ではどうすれば... というのは難しいところですが、一つの策として:

  • ビルドに使っているmrubyリポジトリにmruby-metaprog gemが同梱されていれば、そのバージョンは切り出し後のもの
  • 存在しなければ、それは切り出し前のもの

という判定を行うことは可能です。ダックタイピングっぽいですね...。なのでそのままそういう分岐をすれば問題なく通るようになります。

MRuby::Gem::Specification.new('mruby-sample') do |spec|
  # ...
  if File.exist? "#{MRUBY_ROOT}/mrbgems/mruby-metaprog"
    spec.add_dependency 'mruby-metaprog', core: 'mruby-metaprog'
  end
end

実際の変更例はこちら:

github.com


ということで、 undefined method 'send' (NoMethodError) (検索対応のためエラーメッセージをそのまま書いときます)のようなエラーで悩まされたら、metaprogの依存についての対応をしてみてくださいませ。 Enjoy~