[omniORB] RE: endless loop when cancelRequest received.

Vinouse, Jean-Pierre (Jean-Pierre) jvinouse at alcatel-lucent.com
Mon Mar 19 14:54:20 GMT 2007


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


More information about the omniORB-list mailing list