LWPでtimeout指定が効かない

2024/11/10 [11:25:03] (日) 天気

自作実装のActivityPubサーバーから、フォロワーさんの所属しているリモートサーバーに投稿を送信する時に、お相手のリモートサーバーがなんらかの事情で落ちてるケースがある。

レスポンスは500番代のエラーとなる。


perlで定番のLWP UserAgentを使ってリクエストを投げてるんだけど。

400番代のエラーと違って、サーバーに問題が発生している500番のエラーの場合、返事が戻ってくるのに時間がかかる、待たされる。投稿するためのPOSTもアカウント情報取得のためのGETもなかなか戻ってこない。

デフォルトだと、リクエストを投げてお相手の反応が返ってくるまで180秒(3分)待つことになっている。


LWP::UserAgent - Web ユーザエージェントクラス

https://perldoc.jp/docs/modules/libwww-perl-6.04/LWP/UserAgent.pod


timeout( $secs )
秒単位のタイムアウト値を取得または設定します。 デフォルトのtimeout()の値は180秒、つまり3分です。
サーバへの接続においてtimeout秒反応がないと、リクエストは中断します。 つまり、トランザクションが完了してrequest()メソッドが実際に返るまでの 時間を意味します。

ということなのでtimeoutに10秒とか設定してみてたんだけど、どうもそれが効いてない。


検索したら、やっぱりtimeoutの指定は効かないことがあるらしい。


LWP::UserAgentのタイムアウトがうまく効かなかった事象の調査 (序章)

https://papix.hatenablog.com/entry/2020/12/25/180640


もう少し粘って検索してみると

lWP::UserAgentの「:content_cb」(コールバック)のサブルーチンでSIGNALを設定してalarmで対応できるという記事を発見。


LWP::UserAgent get callback with timeout

https://stackoverflow.com/questions/29071348/lwpuseragent-get-callback-with-timeout

リクエストをサブルーチンで処理することになるのが、素人のわたし的に難しそう…影響範囲がわからない。

思いつきでデフォルトを180秒にしたわけじゃあるまいし、なにか理由がありそう。それをここで指定しちゃうと、全部に影響するわけだしなあ、と。


てことで、それならリモートに投稿を送信するリクエストのサブルーチン限定にしてしまえば大丈夫っぽいんじゃないかと。

サブルーチン丸ごとSIGNALのALRMを設定してevalで捕まえることにした。

結果オーライとか、やっつけ仕事だけは昔から得意だし。


my $res;
eval{
    local $SIG{ALRM} = sub{die "timeout";};                                                                                                     
    alarm $self->{timeout};
    $res = $us->request($req);
    alarm 0;
};
alarm 0;
if( $@ ){
    printf qq{ERROR deliver %s ::: %s}, $u, $@;
}

[2025/12/20 08:41:35] 追記

evalの外側に「alarm 0」=alarm のリセットが必要なのは。

evalの中で、timeout秒以前に500を捕捉したらそこでevalを抜けてしまうので、evalの外側でもalarmをリセットしないとスクリプトはSIGNALを待ち続けてしまうから。

「タイムアウト処理」

https://www.futomi.com/lecture/signal/alrm.html

↑こちらの記事に詳細があって助かりました


ちゃんとしたActivityPubサーバーのMastodonなんかだと、リクエストの送受信は裏側でやってるんで、アクセスしてるユーザーが待たされることはないはず。

わたしの自作ActivityPubサーバーは最低限で、いろいろ手抜きしていて表示するだけのために3分以上待たされるんだよなあ。自業自得というか。


image

サーバーのお守り代わりの画像

(松戸市立博物館)

<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】