void ServerRequestInterceptor::receive_request ( PortableInterceptor::ServerRequestInfo_ptr ri) { // If no response is expected, then we're invoking the oneway // shutdown operation. Don't bother displaying output a second // time. CORBA::Boolean response_expected = ri->response_expected (); if (!response_expected) return; PortableServer::POA_var poa; try { poa = this->poa_current_->get_POA (); } catch (const PortableServer::Current::NoContext& ex) { ex._tao_print_exception ("ServerRequestInterceptor::receive_request"); throw CORBA::INTERNAL (); } PortableServer::POA_var parent_poa = poa->the_parent (); // Make sure there is more than one POA in the POA hierarchy since // the servant should have been registered with a child POA, not the // RootPOA. ACE_ASSERT (!CORBA::is_nil (parent_poa.in ())); PortableInterceptor::AdapterName_var name = ri->adapter_name (); ACE_DEBUG ((LM_INFO, "POA Hierarchy:\n" "==============\n")); const CORBA::ULong len = name->length (); // Make sure there is more than one AdapterName in the AdapterName // sequence since the servant should have been registered with a // child POA, not the RootPOA. ACE_ASSERT (len > 1); for (CORBA::ULong i = 0; i < len; ++i) { for (CORBA::ULong j = 0; j < i; ++j) ACE_DEBUG ((LM_INFO, "\t")); ACE_DEBUG ((LM_INFO, "%C\n", static_cast<char const*>(name[i]))); } ACE_DEBUG ((LM_INFO, "\n" "==============\n")); // Make sure the name of the RootPOA is the first in the AdapterName // sequence. ACE_ASSERT (ACE_OS::strcmp ("RootPOA", name[(CORBA::ULong) 0]) == 0); CORBA::String_var orb_id = ri->orb_id (); ACE_ASSERT (ACE_OS::strcmp (this->orb_id_.in (), orb_id.in ()) == 0); CORBA::String_var server_id = ri->server_id (); ACE_ASSERT (ACE_OS::strcmp (server_id.in (), "ORT_test_server") == 0); }
void ReplicaController::send_reply ( PortableInterceptor::ServerRequestInfo_ptr ri) { FT::FTRequestServiceContext_var ftr ( extract_context (ri)); ACE_DEBUG ((LM_DEBUG, "(%P|%t) Sending reply for %s with rid %i\n", ftr->client_id.in (), ftr->retention_id)); // Prepare reply for logging. CORBA::Any_var result = ri->result (); TAO_OutputCDR cdr; result->impl ()->marshal_value (cdr); Dynamic::ParameterList_var pl = ri->arguments (); CORBA::ULong len = pl->length (); for (CORBA::ULong index = 0; index != len ; ++index) { //@@ No chance for PARAM_OUT if ((*pl)[index].mode == CORBA::PARAM_INOUT) { (*pl)[index].argument.impl ()->marshal_value (cdr); } } CORBA::OctetSeq_var reply; ACE_NEW (reply.out (), CORBA::OctetSeq (cdr.total_length ())); reply->length (cdr.total_length ()); CORBA::Octet* buf = reply->get_buffer (); // @@ What if this throws an exception?? We don't have any way to // check whether this succeeded for (ACE_Message_Block const* mb = cdr.begin (); mb != 0; mb = mb->cont ()) { ACE_OS::memcpy (buf, mb->rd_ptr (), mb->length ()); buf += mb->length (); } // Logging the reply and state update. // // First send message to members. // { // Extract state update. CORBA::OctetSeq_var oid = ri->object_id (); PortableInterceptor::AdapterName_var an = ri->adapter_name (); CORBA::Any_var state = ri->get_slot (state_slot_id ()); CORBA::TypeCode_var tc = state->type (); if (tc->kind () == CORBA::tk_null) { ACE_DEBUG ((LM_DEBUG, "Slot update is void\n")); PortableServer::POA_var poa = resolve_poa (an.in ()); PortableServer::ServantBase_var servant = poa->id_to_servant (oid.in ()); Checkpointable* target = dynamic_cast<Checkpointable*> (servant.in ()); if (target) { CORBA::Any_var tmp = target->get_state (); if (tmp.ptr () != 0) state = tmp._retn (); } } TAO_OutputCDR cdr; cdr << oid.in (); cdr << an.in (); cdr << ftr->client_id.in (); cdr << ftr->retention_id; cdr << reply.in (); cdr << state.in (); size_t size = cdr.total_length (); CORBA::OctetSeq_var msg; ACE_NEW (msg.out (), CORBA::OctetSeq (size)); msg->length (size); { CORBA::Octet* buf = msg->get_buffer (); for (ACE_Message_Block const* mb = cdr.begin (); mb != 0; mb = mb->cont ()) { ACE_OS::memcpy (buf, mb->rd_ptr (), mb->length ()); buf += mb->length (); } } CORBA::Octet* buf = msg->get_buffer (); // Crash point 1. // if (crash_point == 1 && ftr->retention_id > 2) ACE_OS::exit (1); try { while (true) { try { group_->send (buf, size); ACE_DEBUG ((LM_DEBUG, "Sent log record of length %i\n", size)); break; } catch (ACE_TMCast::Group::Aborted const&) { ACE_DEBUG ((LM_DEBUG, "Retrying to send log record.\n")); } } } catch (ACE_TMCast::Group::Failed const&) { ACE_DEBUG ((LM_DEBUG, "Group failure. Perhaps, I am alone in the group.\n")); } } // Now perform local logging. // RecordId rid (ftr->client_id.in (), ftr->retention_id); // This is slow but eh-safe ;-). // log_.insert (rid, reply); // Crash point 2. // if (crash_point == 2 && ftr->retention_id > 2) ACE_OS::exit (1); }