2016-04-23 18 views
0

シミュレーションが1 masterと7 workersを持っています。労働者がデータを実行するために終了すると、それらの実行の完了についてmasterdsendmessageTasksSimGrid。非同期通信と失敗のリンク

getHost().setProperty("busy", "no"); 
ReleaseTask releaseTask = new ReleaseTask(getHost().getName()); 
releaseTask.dsend("Master"); 

リンクはworker1を接続し、masterが壊れています。それはlink1.failファイルです。

PERIODICITY 2 
0 1 
1 0 

私は一つだけreleaseTask(worker1からは)masterに到達できないことを期待。しかし残念ながら、releaseTasks(他の労働者からのもの)はmasterを達成しません。このエラーは、警告が表示されます。

[13.059397] /builds/workspace/SimGrid-Multi/build_mode/Debug/node/simgrid-ubuntu-trusty-64/build/SimGrid-3.13/src/simix/smx_global.cpp:554: [simix_kernel/CRITICAL] Oops ! Deadlock or code not perfectly clean. 
[13.059397] [simix_kernel/INFO] 16 processes are still running, waiting for something. 

マスターは、このような方法でtaskを受け取る:

Task listenTask = Task.receive("Master"); 

リンクがworker1接続し、masterが壊れていない、すべてのシミュレーションが正常に動作します。

どのように私はこの問題を回避することができますか?

UPDATED

マイplatform.xmlファイル:

<link id="0_11" state_file="linkfailures/0_11.fail" bandwidth="3.430125Bps" latency="4.669142ms"/>

0_11.failファイル:

PERIODICITY 2 
0 1 
1 0 

ワーカーは6.94秒でマスターするdsendMessageTaskに開始します。 MessageTask送信時間は0.07秒です。しかし、7.00秒で。マスターとワーカーを結ぶリンクが壊れ始める。私はマスターが時代を超越した "受信"データを続け、エラーが発生したと思います。しかし、それをどのように処理するのですか?

答えて

1

あなたがdsendでデータを送信する場合、それはあなたが、受信機がそれを取得したり、エラーが発生したかどうかかどうかを気にしないことを意味します。それはコミュニケーションをより堅牢にする(それほど強くない)。

あなたのシミュレーションに2つの可能な結果を​​与え、あなたの質問を更新しました。時には、あなたは何の通信は、それがマスターするとSimGridはデッドロック(16 processes are still running, waiting for something)を報告したときのシミュレーションが終了していること、そして時にはあなたがTransferFailureErrorが発生していることを報告負いませんことを言います。しかし、実際には、それがまさにあなたの場合に期待されるものです。ここで

は何が起こるかです:

  • あなたがリンクに障害が発生したため、メッセージが迷子dsend
  • でメッセージを送信します。いいえ、それはリンクが失敗するので、それは今までには届かず、すぐに消えるだけです。

(受信機がそのrecvをポストする前または後に)この時点で、二つの可能な結果は、リンクは、通信開始前または後に失敗したかに応じて、存在します。

  • リンクは受信機のrecv要求をポスト(あなたのケースではマスターが、そう)前の時間を失敗した場合は、故障が気づいたことはありません。確かに、まだ届いていない受信者はなく、送信者は、dsendを使用して、通信の結果を気にしないと言った。
  • リンクは、受信機がその要求をポスト後の時間を失敗した場合は、送信者が(理由dsendの)何も気づいていない、と受信機は、その受信アクションにTransferFailureExceptionを取得します。あなたがdsendでそれを送ったとしても、失敗したコミュニケーションは誰かを殺しているのですが、実際それは死ぬ主人です。それが他の奴隷がマスターとコミュニケーションできない理由です:彼は魚の宿主から何かを受け取っている間、捕らえられない例外を得ました。あなたは(多分それを再送信するために)あなたのメッセージが通過したなかったことに気づくために、送信者をしたい場合は

、あなたは、ブロッキングのために(またはsend(非同期通信用)dsendが、isendを使用したくありませんコミュニケーション)。そして、送信者はコミュニケーションの状態に注意を払う必要があります。

メッセージを実際に遅延させて破棄しない場合は、しばらくの間、リンクの帯域幅を0に変更してください(state_fileの代わりにavailability_fileを使用してください)。

受信者にこのような通信の問題が発生しないようにするには、受信した例外を捕捉してください。

関連する問題