Vinouse, Jean-Pierre (Jean-Pierre)
2007-03-19 18:54:20 UTC
Hello Duncan and All,
Our project uses omniOrb version 4.0.6 and we' ve just got the following
issue:
When the client (non omniORb) sends a request to the servant (omniOrb)
and the servant is not able to reply to the client (e.g. because the IP
connectivity is disturbed) we observe that the client sends a
CancelRequest to the servant. The servant then enters an endless loop in
giopWorker::real_execute() and occupies the full cpu. This leads later
to a reboot of our application.
do {
{
GIOP_S_Holder iops_holder(pd_strand,this);
GIOP_S* iop_s = iops_holder.operator->();
if (iop_s) {
exit_on_error = !iop_s->dispatcher();
}
else {
exit_on_error = 1;
}
}
go = pd_server->notifyWkDone(this,exit_on_error);
} while(go && !exit_on_error);
Variable "go" keeps true and "exit_on_error" keeps false so that the
loop is executed for ever.
Looking at the code of CORBA::Boolean GIOP_S::handleCancelRequest()
{
// We do not have the means to asynchronously abort the execution of
// an upcall by another thread. Therefore it is not possible to
// cancel a request that has already been in progress. The best we
// can do is prevent the reply from happening.
omniORB::logs(5, "Received a CancelRequest message.");
pd_state = WaitingForReply;
response_expected(0);
return 1;
}
Would it be an acceptable solution to return 0 to avoid the endless loop
without side effects.
Is there any plan to improve the handling of cancelRequest in a future
release ?
Thanks in advance for any help
Jean-Pierre Vinouse
Alcatel-Lucent
Nuremberg Germany
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.omniorb-support.com/pipermail/omniorb-list/attachments/20070319/932638d6/attachment.htm
Our project uses omniOrb version 4.0.6 and we' ve just got the following
issue:
When the client (non omniORb) sends a request to the servant (omniOrb)
and the servant is not able to reply to the client (e.g. because the IP
connectivity is disturbed) we observe that the client sends a
CancelRequest to the servant. The servant then enters an endless loop in
giopWorker::real_execute() and occupies the full cpu. This leads later
to a reboot of our application.
do {
{
GIOP_S_Holder iops_holder(pd_strand,this);
GIOP_S* iop_s = iops_holder.operator->();
if (iop_s) {
exit_on_error = !iop_s->dispatcher();
}
else {
exit_on_error = 1;
}
}
go = pd_server->notifyWkDone(this,exit_on_error);
} while(go && !exit_on_error);
Variable "go" keeps true and "exit_on_error" keeps false so that the
loop is executed for ever.
Looking at the code of CORBA::Boolean GIOP_S::handleCancelRequest()
{
// We do not have the means to asynchronously abort the execution of
// an upcall by another thread. Therefore it is not possible to
// cancel a request that has already been in progress. The best we
// can do is prevent the reply from happening.
omniORB::logs(5, "Received a CancelRequest message.");
pd_state = WaitingForReply;
response_expected(0);
return 1;
}
Would it be an acceptable solution to return 0 to avoid the endless loop
without side effects.
Is there any plan to improve the handling of cancelRequest in a future
release ?
Thanks in advance for any help
Jean-Pierre Vinouse
Alcatel-Lucent
Nuremberg Germany
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.omniorb-support.com/pipermail/omniorb-list/attachments/20070319/932638d6/attachment.htm