なるようになるブログ

読書感想文かrailsについてかrubyについてか

rails commit log流し読み(2018/02/16)

2018/02/16分のコミットです。

CHANGELOGにのったコミットは以下の通りです。

activesupport/CHANGELOG.md


Bump mysql2 version

Gemfileの修正です。

mysql2 gemのバージョン指定を0.4.10以上に修正しています。0.4.8と0.4.9にはMariaDBコンパイルエラーになってしまう問題がある為との事。

参考:Release 0.4.10 · brianmario/mysql2


Merge pull request #32003 from SamSaffron/patch-2

activesupport/lib/active_support/core_ext/class/attribute.rbの修正です。

Class#class_attributeメソッドでStringでしていたivarをSymbolで保持するよう修正しています。

不要な複製が生成されてしまうのを避ける為。性能改善。


Merge pull request #31999 from SamSaffron/patch-1

actionpack/lib/action_dispatch/journey/scanner.rbの修正です。

Journey::Scanner#scanメソッドでscanした結果に対してString#-@を使用するよう修正しています。

+        # takes advantage of String @- deduping capabilities in Ruby 2.5 upwards
+        # see: https://bugs.ruby-lang.org/issues/13077
+        def dedup_scan(regex)
+          r = @ss.scan(regex)
+          r ? -r : nil
+        end

         def scan
           case
@@ -47,15 +54,15 @@ def scan
             [:OR, "|"]
           when @ss.skip(/\./)
             [:DOT, "."]
-          when text = @ss.scan(/:\w+/)
+          when text = dedup_scan(/:\w+/)

Ruby 2.5だとString#-@はfreezeされていないStringのdupが排除されるようになり、それによりObjectの生成を減らせるようになっている為。

PRはDiscourseのコミッターからきているのですが、Discourseだと下記の通り改善しているとの事です。

Before:

Total allocated: 207574305 bytes (2214916 objects)
Total retained: 36470010 bytes (322194 objects)

After

Total allocated: 207556847 bytes (2214711 objects)
Total retained: 36327973 bytes (318627 objects) <- object that GC can not collect

が、実装にバグがあった為、直後にRevertされています。


Revert "Merge pull request #31999 from SamSaffron/patch-1"

という訳で直前の対応をrevertしています。


Revert "Revert "Merge pull request #31999 from SamSaffron/patch-1""

その後のやり取りでバグの修正のパッチがきたので、先のrevertを再度revertして、パッチが入っている状態に戻しています。


correct the dedup code

actionpack/lib/action_dispatch/journey/scanner.rbの修正です。

Journey::Scanner#scanメソッドでString#-@を呼び出す箇所が間違えていたのを修正しています。


Merge pull request #31900 from eileencodes/parallel-testing

Active Supportの修正です。

テストを並列で実行する為の仕組み(Parallel Testing)をActive Supportに追加しています。

Parallel Testingははworkerを複数起動しテストを並列に実行するようになっており、workerにはプロセス、スレッドどちらかが指定出来るようになっています。また、worker毎に自動でDBを作成してくれるようになっています。

Parallel Testingを使用したい場合、parallelizeメソッドを使用する必要があります。

class ActiveSupport::TestCase
  parallelize(workers: 2) # デフォルトはプロセス。スレッドを使用したい場合は、`with: :threads`引数を指定する必要がある。
end

テスト結果の受け渡しにはdrbが使われるようになっています。