Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

配信時に新規リレー希望者にホスト情報を送らないことがある #80

Open
plonk opened this issue Aug 30, 2017 · 6 comments

Comments

@plonk
Copy link
Owner

plonk commented Aug 30, 2017

YT12 の改造版らしきもので現象を確認。

期待される挙動

サーバーがこれ以上リレーを出せない状態では、ホストキャッシュからホスト
情報をいくつか選んでクライアントに送信するべき。

症状

  1. 503 Unavailable 応答時、自分自身(トラッカー)のホスト情報を単独で送
    る。この時ログには、"Sent 1 tracker hit to IP:ポート" と出る。
    (Servent::handshakeStream)
  2. サーバーが配信中のチャンネルのホスト一覧(relayinfo.html)に、自分自
    身の項目が存在し、太字で表示される。
  3. ログに "Servent loopback" の表示。自分自身に接続しようとしている。

ワークアラウンド?

手動でホストキャッシュを消去したら、TIP がホストキャッシュから消えて直るっぽい。


配信チャンネルで TIP がホストキャッシュにあることが異常。配信チャンネ
ルにダイレクト接続があると TIP がホストキャッシュに入るようだ。

チャンネルフィードから、TIP のホスト情報を作って、キャッシュに追加して
いる気がする。そして TIP に接続しようとする。

配信チャンネルと視聴チャンネルの区別が付いていない。

ただし、ホストキャッシュに TIP があるからと言って、TIP 単独の PCP_HOST
応答になるとは限らない模様。

@plonk
Copy link
Owner Author

plonk commented Sep 7, 2017

ホストは一度選択されると、2秒間選択されなくなる。この仕様が関係しているのではないか。

@plonk
Copy link
Owner Author

plonk commented Sep 8, 2017

他のPeerCastクライアントの調査

流し読みした限りでは、IM版でも特に選択のアルゴリズムに違いはなさそう。

PeerCastStationは選択したノードをしばらく再選択しないということはしていない。

@ha2ne2
Copy link
Contributor

ha2ne2 commented Oct 15, 2017

YT25でも再現したのでその時のダンプファイルです。
チャンネル情報ページ下部にある接続状況では自分のIPが太字で一番下にありました。
プログラミング - FPManeuverがウンタラ という詳細で配信していたのですが、
その情報はダンプファイルに載っていませんでした。
再現時のIDがE71C9E8787887CC1F99E3F0C78272942だったのですが、
そのIDでファイル内を検索かけるとヒットした自分の以前の配信のキャッシュに、
自分のIP(157.7.223.170)の不正っぽい枝(?)がくっついていました(項目が0埋めされている)。
チャンネルキャッシュのクリアをしたら治りました。

https://ux.getuploader.com/yoteich/download/109

@plonk
Copy link
Owner Author

plonk commented Oct 16, 2017

試験的に、pcypなどから自分で配信中のチャンネルを開いた時に、自分の IP がチャンネルキャッシュに追加されないように以下の変更を加えました。

そもそもなぜループバック接続が開始するのかがわからないので、根本的な解決にはなっていませんが、症状がおさまるか試してみていただけますか? reject-tip-for-broadcasting-channelsブランチにコミットしたので、このブランチをビルドしていただいても構いません。

diff --git a/core/common/servmgr.cpp b/core/common/servmgr.cpp
index ff224cc..5d3bf27 100644
--- a/core/common/servmgr.cpp
+++ b/core/common/servmgr.cpp
@@ -1696,7 +1696,9 @@ void ServMgr::procConnectArgs(char *str, ChanInfo &info)
             {
                 Host h;
                 h.fromStrName(arg, DEFAULT_PORT);
-                chanMgr->addHit(h, info.id, true);
+                auto ch = chanMgr->findChannelByID(info.id);
+                if (!ch || ch->type != Channel::T_BROADCAST)
+                    chanMgr->addHit(h, info.id, true);
             }
         }
     }

@ha2ne2
Copy link
Contributor

ha2ne2 commented Oct 17, 2017

ありがとうございます。
ビルドしました。
しばらく様子を見てみますね。

@ha2ne2
Copy link
Contributor

ha2ne2 commented Oct 20, 2017

上のパッチ当てビルドしたバイナリを確かに使っていたのですが、
今また自分のIPが一番下に表示されて、再現していました。
どこか他のところで追加されている・・?
ダンプファイルの中身も前と同じで、前回の配信の枝に自分のIPが中身ゼロでぶら下がっていました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants