2016-04-23 93 views
0

仿真有一個master和七個workers。當工作人員結束執行數據時,他們會執行關於完成執行的dsendmessageTasksmasterSimGrid。異步通信和故障鏈接

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

鏈接連接worker1master已損壞。它是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"); 

當鏈路連接worker1master不破,所有的模擬工作正常。

我該如何避免這個問題?

修訂

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 

工人開始dsend一個MessageTask在6.94 s到掌握。傳輸時間爲0.07秒。但在7.00秒。連接主人和工人的鏈接開始被打破。我想主人繼續永恆的「接收」數據和錯誤發生。但如何處理呢?

回答

1

如果你發送的數據是dsend,那隻表示你不關心接收者是否得到它或是否發生錯誤。它不會使通信更健壯(也不會更弱)。

您更新了您的問題,給您的模擬帶來了兩種可能的結果。有時你會說沒有任何溝通能夠掌握它,並且當SimGrid報告死鎖時模擬結束(16 processes are still running, waiting for something),並且有時您會報告發生了TransferFailureError。但實際上,如果我是對的,那就是你的情況。

這裏是發生了什麼:

  • 您發送帶有dsend
  • 消息迷路,因爲鏈接失敗。不,不需要永遠交付,因爲鏈接失敗,它會立即消失。

此時有兩種可能的結果,這取決於鏈接在通信開始之前還是之後失敗(接收者發佈其recv之前或之後)。

  • 如果鏈接失敗之前在接收器(在你的情況下,主,似乎)時間職位的recv請求,則故障不會被注意到。事實上,沒有接收者尚未通知,並且發送者通過使用dsend表示它不關心通信結果。
  • 如果鏈路發生故障後的時間,其中接收器職位的請求,則發送者沒有注意到(因爲dsend)任何內容,接收端收到其接收行動TransferFailureException。所以即使你用dsend發送了失敗的通信也會殺死某個人,但實際上這是死亡的主人。這就是爲什麼其他奴隸無法與主人溝通的原因:他在從腥風血雨的主人處收到一些東西時得到了一個未被發現的異常。

如果你想發送者注意到你的郵件沒有經歷過(也許要重新發送),那麼你不希望使用dsendisend(用於異步通信)或send(用於阻塞通訊)。發件人必須注意溝通的狀態。

如果您希望消息真的延遲但不會被破壞,請嘗試將鏈接的帶寬更改爲0一段時間(使用availability_file而不是state_file)。

如果你想讓你的接收器在這樣的通信問題中生存下來,就趕上它得到的異常。