ひまつぶし雑記帖

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 = $self->post_actpb({url=>$u, content=>$args->{json}});
    alarm 0;
};
if( $@ ){
    printf qq{ERROR deliver %s ::: %s}, $u, $@;
}


設定を15秒にしてみたら、意図通りにtimeoutをキャッチして、待ち時間が少なくなった。

ちゃんとしたActivityPubサーバーのMastodonなんかだと、リクエストの送受信は裏側でやってるんで、アクセスしてるユーザーが待たされることはないはず。
わたしの自作ActivityPubサーバーは最低限で、いろいろ手抜きしていて表示するだけのために3分以上待たされるんだよなあ。自業自得というか。

image 
サーバーのお守り代わりの画像
(松戸市立博物館)

»電子書籍制作代行についてはこちら

【電子書籍発売中】

doncha.net制作・発行:KindleやiBooks、楽天kobo、BOOK☆WALKERで読む電子書籍

profile

profile

 
doncha.net
contact:
»運営者
@t2aki@tokoroten.doncha.net

ため池

[2024/12/11 18:32]
弘南鉄道 大鰐線のこと
https://www.torizuka.club/2024/12/09/%E5%BC%98%E5%8D%97%E9%89%84%E9%81%93%E3%80%80%E5%A4%A7%E9%B0%90%E7%B7%9A%E3%81%AE%E3%81%93%E3%81%A8/
>ではどうして弘南鉄道は今から3年半も先の2028年3月末に廃止すると表明したのでしょうか。
>この時期を選んだのは来春高校に入る新入生が卒業する時期だからです。
>きちん ...

[2024/12/11 15:17]
年末進行だな…いつもより10日ほど発注が早い。元データもたぶん今日あたりなので待機。
検診目前で禁酒期間だし、ちょうどいいっちゃいいか(え?

[2024/12/11 12:04]
いかん、ねこあつめしかしてないんだが…。
こうして恍惚のひとにまっしぐらなのか。ぽつねんとTVばかり見てるおじいちゃんと同じ位置に到達しようとしてる、ぞ。

@t2aki@tokoroten.doncha.net

検索
<<2024/12>>
       
1234567
891011121314
15161718192021
22232425262728
293031

リンク

WINDOWS版サウンドノベル
おかえりください PC WINDOWS版サウンドノベル
『おかえりください』体験版