/dev/null

(◞‸◟)

org.apache.http.impl.cookie.BestMatchSpec.formatCookiesでTomcatが突然の死

運用中のTomcatがある日突然死ぬ。

死ぬタイミングは不定

その時のcatalina.outなログは

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGVSIGSEGV (0xb) at pc=0x00007fc028c69528, pid=3634, tid=140460796401408
#
#
# JRE version: 7.0_21-b11
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.21-b01 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# # Problematic frame:
# J  org.apache.http.impl.cookie.BestMatchSpec.formatCookies(Ljava/util/List;)Ljava/util/List;
#
# # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/XXXXXXX/hs_err_pid3634.log
#
# If you would like to submit a bug report, please visit:
#
#   http://bugreport.sun.com/bugreport/crash.jsp
#

的なもの。

org.apache.http.impl.cookie.BestMatchSpec.formatCookies辺りが怪しいらしいけど、動かしてるWEBアプリケーション上でそ上記を使っている(明示的に呼び出している)部分は存在しない。

色々調べてみるとどうやらJDKのバグっぽい。

辛い。

http://bugs.java.com/view_bug.do?bug_id=8025398

fixされたコード何言ってるかさっぱりですけど

http://hg.openjdk.java.net/hsx/jdk7u/hotspot/rev/8ada83878f30

で、JDK7u60ではfixされる。

がJDK7u60はまだEarly Access。Production環境で使うにはなんとなく不安ですね。

このバグの実証コードが載っているページを見てみます。

GitHub - rholder/jvm-loop-unswitching-bug: Cause the JVM to produce a segmentation fault from org.apache.http.impl.cookie.BestMatchSpec.formatCookies

どうやらJVMの起動オプションに

-XX:-LoopUnswitching

というものをつけて起動すると当座は回避出来るよう。

実際つけて起動して数週間起動しても問題なく落ちていない状態になった。

解決といえば解決なんだけど、突然落ちるようになったのなんなんだろうと思ったので調べてみる。

org.apache.http.impl.cookie.BestMatchSpec.formatCookies

が悪さをしているらしいが呼んだこと覚えのないメソッド。

ってことは外部ライブラリがこれらを使っているんだろうと予想。

で最近入れたライブラリはjava-apns。

https://github.com/notnoop/java-apns

が呼び出してない。。

もう1回自分のところのコードを追うと、確かにapache.HttpClientを使っている箇所がありそこではAppleへの課金問い合わせ的なことをしている。

そこでのResponseをよく見るとログに、

[ajp-bio-8009-exec-3104] WARN  org.apache.http.client.protocol.ResponseProcessCookies - Cookie rejected: "[version: 1][name: ns-mzf-inst][value: 183-169-80-243-18-8141-592396-59-st13][domain: .apple.com][path: /][expiry: Thu Apr 03 09:54:21 JST 2014]". Domain attribute ".apple.com" violates RFC 2109: host minus domain may not contain any dots

モロにCookie関連でWARN出てる。

なんかAppleの課金鯖のドメインがRFC2109のCookie形式に違反してるっぽいのかなと。

Apple.comはいいけどbuy.itunes.apple.comは駄目みたいな(ドメインは適当

ドメインの中に.があってはいけない、みたいな?

きちんとしたCookiePolicy呼ぶとかすればいいっぽかったりするらしい。

HttpClientを実装していてIllegal domain attributeのCookie rejectedを回避したい時… | shinodogg.com

とりあえず、JVMのバグでTomcat突然死するとエンジニアも突然死するという話でした。