📄 ft_replicafactory_i.cpp
字号:
/* -*- C++ -*- */
//=============================================================================
/**
* @file FT_ReplicaFactory_i.cpp
*
* FT_ReplicaFactory_i.cpp,v 1.2 2003/12/22 01:44:38 wilson_d Exp
*
* This file is part of Fault Tolerant CORBA.
*
* @author Dale Wilson <wilson_d@ociweb.com>
*/
//=============================================================================
#include "FT_ReplicaFactory_i.h"
#include "FT_TestReplica_i.h"
#include <ace/Get_Opt.h>
#include <orbsvcs/CosNamingC.h>
#include <orbsvcs/PortableGroupC.h>
#include <tao/PortableServer/ORB_Manager.h>
#include <orbsvcs/PortableGroup/PG_Property_Set.h>
// Use this macro at the beginning of CORBA methods
// to aid in debugging.
#define METHOD_ENTRY(name) \
ACE_DEBUG (( LM_DEBUG, \
"Enter %s\n", #name \
))
// Use this macro to return from CORBA methods
// to aid in debugging. Note that you can specify
// the return value after the macro, for example:
// METHOD_RETURN(Plugh::plover) xyzzy; is equivalent
// to return xyzzy;
// METHOD_RETURN(Plugh::troll); is equivalent to
// return;
// WARNING: THIS GENERATES TWO STATEMENTS!!! THE FOLLOWING
// will not do what you want it to:
// if (cave_is_closing) METHOD_RETURN(Plugh::pirate) aarrggh;
// Moral: Always use braces.
#define METHOD_RETURN(name) \
ACE_DEBUG (( LM_DEBUG, \
"Leave %s\n", #name \
)); \
return /* value goes here */
static const char * criterion_initial_value = "INITIAL_VALUE";
//////////////////////////////////////////////////////
// FT_ReplicaFactory_i Construction/destruction
FT_ReplicaFactory_i::FT_ReplicaFactory_i ()
: internals_ ()
, orb_ (CORBA::ORB::_nil ())
, poa_ (PortableServer::POA::_nil ())
, object_id_ ()
, ior_ ()
, ior_output_file_ (0)
, identity_ ()
, have_replication_manager_(0)
, replication_manager_(0)
, factory_registry_ior_(0)
, factory_registry_ (0)
, registered_(0)
, test_output_file_(0)
, ns_name_(0)
, naming_context_ (CosNaming::NamingContext::_nil ())
, this_name_ ()
, roles_ ()
, location_ ("unknown")
, quit_on_idle_ (0)
, unregister_by_location_ (0)
, replicas_ ()
, empty_slots_(0)
, quit_requested_(0)
{
ACE_DEBUG((LM_DEBUG, "TestReplica type_id: %s\n", FT_TEST::_tc_TestReplica->id() ));
// ACE_DEBUG((LM_DEBUG, "Hobbit type_id: %s\n", FT_TEST::_tc_Hobbit->id() ));
// ACE_DEBUG((LM_DEBUG, "Elf type_id: %s\n", FT_TEST::_tc_Elf->id() ));
// ACE_DEBUG((LM_DEBUG, "Human type_id: %s\n", FT_TEST::_tc_Human->id() ));
}
FT_ReplicaFactory_i::~FT_ReplicaFactory_i ()
{
//scope the guard
{
InternalGuard guard (this->internals_);
// be sure all replicas are gone
// before this object disappears
shutdown_i ();
}
}
////////////////////////////////////////////
// FT_ReplicaFactory_i private methods
CORBA::ULong FT_ReplicaFactory_i::allocate_id()
{
// assume mutex is locked
CORBA::ULong id = this->replicas_.size();
if (this->empty_slots_ != 0)
{
for(CORBA::ULong pos = 0; pos < id; ++pos)
{
if (this->replicas_[pos] == 0)
{
id = pos;
}
}
}
else
{
this->replicas_.push_back(0);
this->empty_slots_ += 1;
}
return id;
}
void FT_ReplicaFactory_i::shutdown_i()
{
// assume mutex is locked
for (size_t nReplica = 0; nReplica < this->replicas_.size(); ++nReplica)
{
FT_TestReplica_i * replica = this->replicas_[nReplica];
if (replica != 0)
{
replica->request_quit();
}
}
}
int FT_ReplicaFactory_i::write_ior(const char * outputFile, const char * ior)
{
int result = -1;
FILE* out = ACE_OS::fopen (outputFile, "w");
if (out)
{
ACE_OS::fprintf (out, "%s", ior);
ACE_OS::fclose (out);
result = 0;
}
else
{
ACE_ERROR ((LM_ERROR,
"Open failed for %s\n", outputFile
));
}
return result;
}
//////////////////////////////////////////////////////
// FT_ReplicaFactory_i public, non-CORBA methods
int FT_ReplicaFactory_i::parse_args (int argc, char * argv[])
{
ACE_Get_Opt get_opts (argc, argv, "o:n:f:i:l:t:qu");
int c;
while ((c = get_opts ()) != -1)
{
switch (c)
{
case 'o':
{
this->ior_output_file_ = get_opts.opt_arg ();
break;
}
case 'n':
{
this->ns_name_ = get_opts.opt_arg ();
break;
}
case 'f':
{
this->factory_registry_ior_ = get_opts.opt_arg ();
break;
}
case 'i':
{
this->roles_.push_back(get_opts.opt_arg ());
break;
}
case 'l':
{
this->location_ = get_opts.opt_arg ();
break;
}
case 'q':
{
this->quit_on_idle_ = 1;
break;
}
case 'u':
{
this->unregister_by_location_ = 1;
break;
}
case 't':
{
this->test_output_file_ = get_opts.opt_arg ();
break;
}
case '?':
// fall thru
default:
ACE_ERROR_RETURN ((LM_ERROR,
"usage: %s \n"
" -o <factory ior file>\n"
" -n <naming service registration name>\n"
" -f <factory registry ior file>\n"
" -i <registration: role>\n"
" -l <registration: location>\n"
" -t <test replica ior file>\n"
" -u{nregister by location}\n"
" -q{uit on idle}\n",
argv [0]),
-1);
break;
}
}
// Indicates sucessful parsing of the command line
return 0;
}
const char * FT_ReplicaFactory_i::location () const
{
return this->location_;
}
const char * FT_ReplicaFactory_i::identity () const
{
return this->identity_.c_str();
}
int FT_ReplicaFactory_i::idle (int & result)
{
result = 0;
size_t replicaCount = this->replicas_.size();
if (replicaCount != this->empty_slots_)
{
for (size_t nReplica = 0; result == 0 && nReplica < replicaCount; ++nReplica)
{
FT_TestReplica_i * replica = this->replicas_[nReplica];
if (replica != 0)
{
// give the replica's idle processing a change
// ignore the return status (the replica should shut itself down
// unless result is non-zero.
// non-zero result means panic.
replica->idle(result);
}
}
}
int quit = (this->quit_requested_ || result != 0);
if (!quit && this->replicas_.size() == this->empty_slots_)
{
/* if you re-enable this, add some kind of throttle to avoid noise.
ACE_ERROR (( LM_ERROR,
"ReplicaFactory is idle.\n"
));
*/
if (this->quit_on_idle_ && this->empty_slots_ != 0)
{
ACE_ERROR (( LM_ERROR,
"%s exits due to quit on idle option.\n",
identity()
));
quit = 1;
}
}
return quit;
}
int FT_ReplicaFactory_i::init (CORBA::ORB_ptr orb ACE_ENV_ARG_DECL)
{
int result = 0;
this->orb_ = CORBA::ORB::_duplicate (orb);
// Use the ROOT POA for now
CORBA::Object_var poa_object =
this->orb_->resolve_initial_references (TAO_OBJID_ROOTPOA
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
if (CORBA::is_nil (poa_object.in ()))
{
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT (" (%P|%t) Unable to initialize the POA.\n")),
-1);
}
// Get the POA object.
this->poa_ =
PortableServer::POA::_narrow (poa_object.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
if (CORBA::is_nil(this->poa_.in ()))
{
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT (" (%P|%t) Unable to narrow the POA.\n")),
-1);
}
PortableServer::POAManager_var poa_manager =
this->poa_->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
// Register with the POA.
this->object_id_ = this->poa_->activate_object (this ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
CORBA::Object_var this_obj =
this->poa_->id_to_reference (object_id_.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
this->ior_ = this->orb_->object_to_string (this_obj.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
if (this->factory_registry_ior_ != 0)
{
if (ACE_OS::strcmp (this->factory_registry_ior_, "none") != 0)
{
CORBA::Object_var reg_obj = this->orb_->string_to_object(factory_registry_ior_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
this->factory_registry_ = ::PortableGroup::FactoryRegistry::_narrow(reg_obj.in ());
if (CORBA::is_nil(this->factory_registry_.in ()))
{
ACE_ERROR (( LM_ERROR,
"Can't resolve Factory Registry IOR %s\n",
this->factory_registry_ior_
));
result = -1;
}
}
}
else // no -f option. Try RIR(RM)
{
///////////////////////////////
// Find the ReplicationManager
ACE_TRY_NEW_ENV
{
CORBA::Object_var rm_obj = orb->resolve_initial_references("ReplicationManager" ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
this->replication_manager_ = ::FT::ReplicationManager::_narrow(rm_obj.in() ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (!CORBA::is_nil (replication_manager_.in ()))
{
this->have_replication_manager_ = 1;
// empty criteria
::PortableGroup::Criteria criteria;
this->factory_registry_ = this->replication_manager_->get_factory_registry(criteria ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (CORBA::is_nil (this->factory_registry_.in ()))
{
ACE_ERROR ((LM_ERROR,"ReplicaFactory: ReplicationManager failed to return FactoryRegistry. Factory will not be registered.\n" ));
}
}
else
{
this->factory_registry_ = ::PortableGroup::FactoryRegistry::_narrow(rm_obj.in() ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (!CORBA::is_nil(this->factory_registry_.in ()))
{
ACE_DEBUG ((LM_DEBUG,"Found a FactoryRegistry DBA ReplicationManager\n" ));
}
else
{
ACE_ERROR ((LM_ERROR,"ReplicaFactory: Can't resolve ReplicationManager.\n" ));
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -