Railsのbefore_forkで接続を閉じる必要あるの?

Railsunicornやpumaのconfigをネットでググってみると以下のような設定が見つかる。

# unicorn
preload_app true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
# puma
preload_app!

before_fork do
  ActiveRecord::Base.connection.disconnect!
end

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

いるのこれ?

workerを起動する前にmasterプロセスのDB接続を閉じてるんすけど、なんで閉じるんすかね?

おそらくこれはforkした子プロセスがmasterで使ってるリソースを共有しないように切断させたいという意図だと思います。preload appでforkした場合、copy-on-writeでメモリが共有されるためコネクションもプロセス間で共有されしまい、これに複数プロセスが同時に読み書きしてしまうと不具合が発生して困ったことになります。

しかし、masterプロセスはリクエストを子プロセスにディスパッチするだけで自身は応答処理をしないためDB接続もしません。disconnectしても何も起こらないはずです。プロセス間でコネクションが共有される事もないので接続を切る必要もないと思います。

また、Railsはコネクションプーリングを使っていて、実際にDBアクセスが必要になるまで接続せず、単にestablishを呼んだだけでは何もしないはずです。よってfork後に再接続する必要もないと思うんですよね。

RailsActiveRecordは抽象化されているのでコネクションプーリングしない実装への考慮として書いておくのが流儀なのでしょうか? まぁ、実はcron的な処理を起動していてmasterがDB接続してましたーみたいな想定外に対する保険として書いておいてもいいのかもしれないですが。結局のところ意図はよくわからない。

rapportdとxartstorageremoted

新品のMacBook proに見知らぬportが開いていたので調べてみた。

$ netstat -nat | grep LISTEN
tcp6       0      0  *.49298                *.*                    LISTEN
tcp4       0      0  *.49298                *.*                    LISTEN
tcp6       0      0  *.61500                *.*                    LISTEN
tcp4       0      0  *.61500                *.*                    LISTEN

$ sudo lsof -i:49298,61500
Password:
COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
xartstora 175    root    3u  IPv4 0x63e5e477e915514f      0t0  TCP *:61500 (LISTEN)
xartstora 175    root    4u  IPv6 0x63e5e477ea2e08e7      0t0  TCP *:61500 (LISTEN)
rapportd  364 nullpon    3u  IPv4 0x63e5e477ef6fde8f      0t0  TCP *:49298 (LISTEN)
rapportd  364 nullpon    4u  IPv6 0x63e5e477ec7b7c27      0t0  TCP *:49298 (LISTEN)

rapportdとxartstorageremotedというプロセスらしい。

rapportd(8)

コレはiPhone等とのハンドオフ通信用のサーバプロセス。iPhoneで見ているサイトをMacSafariで開けるようになったり(Dockの横に出てくるヤツ)、ユニバーサルクリップボード(コピペをデバイス間で行えるようにする機能)を実現しているらしい

man rapportd
SYNOPSIS
     Daemon that enables Phone Call Handoff and other communication features between Apple devices.

     Use '/usr/libexec/rapportd -V' to get the version.

xartstorageremoted(8)

こちらは Macbook Pro のタッチバーと通信するためのサーバプロセスらしい

$ man xartstorageremoted
DESCRIPTION
     The xartstorageremoted executable is a daemon intended to listen for save/fetch requests from the CoProcessor. This daemon is required for multi-partitions and multi-users
     support.
     
     xartstorageremoted must not be unloaded and should only be run via launchd when a request must be handled.

待ち受けのアドレスが * になっているのだが、外部から操作できるのだろうか?