ひまつぶし雑記帖

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

ため池

[2025/04/22 10:51]
@pooza@mstdn.b-shock.org こだわりはなくて、それっぽいのがレンサバでやれてるんで、それならそれで。ですね-。
歳食ってもろもろ縮小してるとこで新たな契約ごとも億劫で^^;;

[2025/04/22 10:38]
@pooza@mstdn.b-shock.org どもです。いやでも、ロリポのライトプランのディスク要領で動画をあげるのは自○行為なので要検討です^^;;

[2025/04/22 09:19]
なんかせっかくだし、あくびのソムリエ・みけさんで動画のテスト。

@t2aki@tokoroten.doncha.net

検索
<<2025/4>>
  12345
6789101112
13141516171819
20212223242526
27282930

リンク

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