2016-04-23 94 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)。

如果你想让你的接收器在这样的通信问题中生存下来,就赶上它得到的异常。