[openrtm-users 00989] Re: [1.0.0-RC1] データ送信中に接続線をdeleteするとRTCが死んでしまう

Toshihisa Saitoh saitoh @ segway-japan.co.jp
2009年 11月 2日 (月) 20:28:50 JST



セグウェイジャパンの齋藤です。

いつもお世話になっております。
提供頂いたパッチのほうを適用してテストしております。

おかげさまでOutPort側のRTCが落ちる現象はなくなったようです。
対応ありがとうございます。

また、頻度はかなり低いですがInPort側RTCが落ちる現象を確認しました。
InPort側の対応も合わせてよろしくお願い致します。



----- Original Message ----- 
From: "Ando Noriaki" <n-ando @ aist.go.jp>
To: <openrtm-users @ m.aist.go.jp>
Sent: Friday, October 30, 2009 3:15 PM
Subject: [openrtm-users 00986] Re: [1.0.0-RC1] データ送信中に接続線をdeleteするとRTCが死んでしまう


> 皆さま
> 
> 安藤です
> 
> 1.0のデータポートの構造が変わったのが原因と思われます。
> OutPort.hのOutPort::write() 関数内にて
> 
>      for (size_t i(0), len(conn_size); i < len; ++i)
>        {
>          ReturnCode ret;
>          ret = m_connectors[i]->write(m_cdr);
>          if (ret != PORT_OK)
>            {
>              result = false;
>              if (ret == CONNECTION_LOST)
>                {
>                  disconnect(m_connectors[i]->id());
>                }
>            }
>        }
> 
> なっていますが、m_connectors をロックするのをさぼっているため、
> 書き込み中に m_connectors の要素が削除されて、segmentation fault
> が発生しているものと思われます。
> 
> 
> とりあえず、コネクタをmutexで保護するパッチを作成しました。
> ざっと試したところ、OutPort側については落ちることはなさそうです。
> 
> ただし、InPort側のRTCが落ちることがたまにありました。
> InPortも同様にConnectorを持っているので、これと同じようにmutexで
> 保護する必要があります。
> 
> とりあえず、可能であればこのパッチを試してもらえませんか。
> よろしくお願いいたします。
> 
> InPort側のパッチについては、できたらMLで流します。
> 
> 2009年10月30日14:43 Yusuke Nakajima <y.nakajima @ aist.go.jp>:
>> 産総研の中島です。
>>
>> 追記です。
>>
>> 前メールで添付したサンプルを0.4.2用に作成しなおし、
>> OpenRTM0.4.2環境にて、1.0.0環境でテストしたのと同一の
>> 無線LAN環境で、SystemEditorの線のdeleteのレスポンスが遅くなるくらいの
>> 負荷をかけて数十回トライしましたが、同現象は起きませんでした。
>>
>> また、1.0.0のtimestamp用パッチ適用前の環境でもトライしましたが、
>> こちらでは、同様の現象が再現されました。
>>
>>> 産総研の中島です。
>>>
>>> Ubuntu8.04環境にて、OpenRTM-aist-1.0.0-RC1 (C++)
>>> とRtSystemEditor-1.0.0を使用しています。
>>> (timestamp用のパッチ適用済みのもの)
>>>
>>> RtSystemEditor上で、OutPortを持つRTCとInPortを持つRTCを
>>> 接続し、Activateさせ、データの送受信を行う単純なRTC群を
>>> 用意し、Activate中に(Deactivateさせずに)、その接続線を
>>> deleteすると、RTCが消えてしまい、(NameServer上ではゾンビ)
>>> 以下のようなメッセージのいずれかを吐いて死んでいることがあります。
>>> ちなみに、RTC自体は、onDeactivate()やonAbort()、onError()などには
>>> 遷移せずに死んでいます。
>>>
>>> =====
>>> [1]
>>>  "$ Segmentation Fault"
>>>
>>> [2]
>>>  "$ illegal error"
>>>
>>> [3]
>>>  "$ pure virtual method called terminate called without an active
>>> exception
>>>   $ Aborted"
>>> =====
>>>
>>> 上記3パターンのいずれかを出しますが、どれがどういう場合に
>>> 出るのか、再現性が不明で把握しておりません。
>>> (遭遇したのは上記3パターンのみですが、他もあるかもしれません。)
>>>
>>> また、この現象は必ず発生する訳ではなく、推測ですが、データ送信途中で
>>> 線が切られると起こるように思えます。排他制御が効いていない?
>>> 全体の負荷が軽いと起こらないようで、その場合は、1サイクル内でデータ送信
>>> が早めに終了していて、その後に線をdeleteしているのかもしれません。
>>>
>>> 単純なサンプルを添付します。「testA」-->「testB」とDataPort接続し、
>>> 「testA」側で毎onExecute()でデータを送信し、「testB」で受信したものを
>>> 出力するのみです。
>>>
>>> これを、1台のPCでローカル環境で行っていると、なかなか症状が再現されない
>>> のですが、2台のPCに分散させ、私の場合無線環境でNameServerに飛ばし、かつ、
>>> rtc.conf内のrateを「1000000」くらいにし、極力、RTCの1サイクル中はデータ
>>> 送信処理で負荷を占めるようにさせてトライしたところ、線をdeleteすると
>>> 「testA」が死んでしまう現象が何度か再現できました。
>>>
>>> ということで、RTC群がActivateされている状態で、動的にPortの接続などを
>>> 変更しようとすると、場合によってはRTCが死んでしまい、全体として機能しな
>>> くなる場合がありうる状態です。
>>>
>>> 対応の方、よろしくお願いいたします。
>>>
>>> -----------------------------------------------------
>>> 〒305-8568
>>> 茨城県つくば市梅園1-1-1 つくば中央第2  本部情報棟 3204室
>>> 独立行政法人 産業技術総合研究所
>>> 知能システム研究部門 ヒューマノイド研究グループ
>>>
>>> 中島 裕介 (Yusuke Nakajima)
>>>
>>> TEL: 029-861-5080(内線55267)
>>> mailto: y.nakajima @ aist.go.jp
>>> -----------------------------------------------------
>>
>>
>>
>>
> 
> 
> 
> -- 
> 安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
>    統合知能研究グループ 主任研究員, 博士(工学)
>    〒305-8568 つくば市梅園1-1-1 中央第2
>    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
>    OpenRTM-aist: http://www.openrtm.org
> 
> Noriaki Ando, Ph.D.
>    Senior Research Scientist, RT-Synthesis R.G., ISRI, AIST
>    AIST Tsukuba Central 2, Tsukuba, Ibaraki 305-8568 JAPAN
>    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
>    OpenRTM-aist: http://www.openrtm.org
>



openrtm-users メーリングリストの案内