スポンサード リンク

T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« Parallelsにも対応させた | トップページ | Mirror-DTC for Ubuntu 1.3.0.3を公開 »

Ubuntu版の問題点と対策

作者的には、Ubuntu用Mirror-DTCを更新しようとしているのだが、その更新理由は、昨日書いた様に、macOS用Parallelsの3DアクセラレーションをOn状態でゲストOSのUbuntuでサーバーを利用可能にする、というモノもあるのだが、より一般的な不具合修正も、ある。

より一般的な不具合というのは、数日前に書いた様に、Ubuntuからファイル転送をしていると、チョクチョク、転送が失敗してしまう、というモノだ。

で、昔、作者のWiFi環境は劣悪だったのだが、その後、11nのWiFiルーターを購入して使う様になると、結構マシになった。そして、去年、11acのWiFiルーターに切り替えてからは、かなり信頼出来る状況になっている。

と、いう事なので、以前は、Mirror-DTCでファイル転送していても、エラーが発生するのは珍しい事でも無かったのだが、最近は、そういう事は殆ど無くなっていた。

にも関わらず、今回、新しいマシンを購入したので、そのマシンにデータ転送する為に、色々と作業をやっていると、Ubuntuからファイルデータをコピーして来ようとした時に限って、転送エラーが頻発した訳だ。

このため、作者的には、その原因を探った訳なのだが、数日前に書いていた様に、Mirror-DTCにバグがあるとすると、その場所はタイミングチェック、というのは作者には明らかだった。

なので、そういう観点からチェックしてみたのだが、擬似的にエラー現象を発生させてみる事で、タイミングチェックに問題がある事はすぐに確認できた。

具体的には、Mirror-DTCのデータ転送では、データを転送後に、相手からアクノリッジ信号を受け取る仕様になっていて、そのアクノリッジ信号が得られない場合に、転送エラーとしているのだが、上記確認では、このアクリノッジ信号を受信した時に得られるイベントを強制的に発生させなくしてみた訳だ。

その結果、転送エラーになったのだが、問題は、そのタイムアウト時間は、余裕をみて15秒にしてあったのだが、エラーは1秒も経たずに発生した、という事だった。

つまり、Ubuntu版のMirror-DTCでは、タイムアウト時間の計測に問題があり、例えば、WiFi経由の転送時にリトライが1回入っただけで、タイムアウトしてしまい、ファイル転送が失敗してしまう状況になっていた訳だ。

より詳細に書くと、イベント待ち関数の待ち時間は100mSecにしてあったのだが、この関数が、通常は問題なく100mSec待っているモノの、エラー発生時には、ほぼ即時に、タイムアウトしてしまっていた訳だ。

そのイベント待ち関数というのは、大体は、以下の様になっていた。

        struct timespec ts;
        struct timeval tv;
        long long nsec1;

        gettimeofday(&tv,NULL);
        ts.tv_sec = time(NULL) + dwMilliseconds / 1000;
        nsec1 = tv.tv_usec * 1000L + 1000L * 1000L * (dwMilliseconds % 1000);
        ts.tv_sec += (nsec1 / (1000 * 1000 * 1000));
        ts.tv_nsec = nsec1%(1000 * 1000 * 1000);
        nRet = pthread_cond_timedwait(&ptr->cond,&ptr->mutex,&ts);

上記のdwMillisecondsというのが、待ち時間指定になっている。

上記に問題があるとすると、timeで得られている時間とgettimeofdayで得られている時間に誤差が発生している、という事になるので、対策としては、timespec_getで一括して時間を取得する様にした。

その結果、再現テストで簡単に発生していたファイル転送エラーは全く発生しなくなったので、問題は解決したのだが、実は、上記と全く同じ処理ルーチンはMac版にも存在する。

なので、Mac版についても、同様の再現テストを行ってみたのだが、こちらでは、上記の処理ルーチンでも、何ら問題は無かった。そして、前述のtimespec_get関数は比較的新しいライブラリ関数になるので、Xcode環境では、まだ、使えないみたいだった。

なので、Mac版については、上記関数をそのままにしてあるのだが、Mac版については、そもそも、Ubuntu版の様なファイル転送中のエラーは経験がないので、実際問題としては、問題はない筈ではある。

ちなみに、Mac版のファイル転送ルーチンには全く別の問題があり、転送開始時に即時エラーする事がたまにあった。

なので、Mac版についても、上記の不具合については、今回修正したので、Mac版についても、ファイル転送エラーが発生する可能性は減った筈だ。

もっとも、WiFi環境では、実際にファイル転送用のデータ転送が失敗する事はあるので、次バージョンでも、ネットワーク環境の状態が悪ければ、ファイル転送エラーは発生する筈だ。

« Parallelsにも対応させた | トップページ | Mirror-DTC for Ubuntu 1.3.0.3を公開 »

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/534482/65144408

この記事へのトラックバック一覧です: Ubuntu版の問題点と対策:

« Parallelsにも対応させた | トップページ | Mirror-DTC for Ubuntu 1.3.0.3を公開 »

2017年6月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    Cookieを無効にする設定およびAdsenseに関する詳細については、以下のリンクを参照下さい。

    広告 - ポリシーと規約 - Google