int make_current (char *group) { if (!currentgroup) { if (!(currentgroup = malloc(GROUPNAMELEN + 1))) { LOG("make_current:no memory"); return -1; } strcpy(currentgroup, "no.group.selected.yet"); /* Better than random crap... */ } /* prevent =junk from being selected */ if (!key_exists(group, strlen(group))) return -1; if (-1 == group_info(group, ¤tinfo)) return -1; strcpy(currentgroup, group); currentserial = -1; return 0; }
void TAO_FTEC_Group_Manager::add_member ( const FTRT::ManagerInfo & info, CORBA::ULong object_group_ref_version) { TAO_FTRTEC::Log(1, ACE_TEXT("add_member location = <%s>\n"), (const char*)info.the_location[0].id); auto_ptr<TAO_FTEC_Group_Manager_Impl> new_impl(new TAO_FTEC_Group_Manager_Impl); new_impl->my_position = impl_->my_position; size_t pos = impl_->info_list.length(); new_impl->info_list.length(pos+1); for (size_t i = 0; i < pos; ++i) { new_impl->info_list[i] = impl_->info_list[i]; } new_impl->info_list[pos] = info; GroupInfoPublisherBase* publisher = GroupInfoPublisher::instance(); GroupInfoPublisherBase::Info_ptr group_info ( publisher->setup_info(new_impl->info_list, new_impl->my_position, object_group_ref_version)); int last_one = (impl_->my_position == impl_->info_list.length()-1); if (!last_one) { // I am not the last of replica, tell my successor that // a new member has joined in. try{ FTRTEC::Replication_Service::instance()->add_member(info, object_group_ref_version); } catch (const CORBA::Exception&){ // Unable to send request to all the successors. // Now this node become the last replica of the object group. // update the info list again new_impl->info_list.length(new_impl->my_position+2); new_impl->info_list[new_impl->my_position+1] = info; /// group_info = publisher->set_info(..) should be enough. /// However, GCC 2.96 is not happy with that. GroupInfoPublisherBase::Info_ptr group_info1 ( publisher->setup_info(new_impl->info_list, new_impl->my_position, object_group_ref_version)); ACE_auto_ptr_reset(group_info, group_info1.release()); last_one = true; } } if (last_one) { // this is the last replica in the list // synchornize the state with the newly joined replica. FtRtecEventChannelAdmin::EventChannelState state; get_state(state); TAO_OutputCDR cdr; cdr << state; FTRT::State s; if (cdr.begin()->cont()) { ACE_Message_Block* blk; ACE_NEW_THROW_EX(blk, ACE_Message_Block, CORBA::NO_MEMORY()); ACE_CDR::consolidate(blk, cdr.begin()); #if (TAO_NO_COPY_OCTET_SEQUENCES == 1) s.replace(blk->length(), blk); #else // If the replace method is not available, we will need // to do the copy manually. First, set the octet sequence length. CORBA::ULong length = blk->length (); s.length (length); // Now copy over each byte. char* base = blk->data_block ()->base (); for(CORBA::ULong i = 0; i < length; i++) { s[i] = base[i]; } #endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */ blk->release(); } else { #if (TAO_NO_COPY_OCTET_SEQUENCES == 1) s.replace(cdr.begin()->length(), cdr.begin()); #else // If the replace method is not available, we will need // to do the copy manually. First, set the octet sequence length. CORBA::ULong length = cdr.begin ()->length (); s.length (length); // Now copy over each byte. char* base = cdr.begin()->data_block ()->base (); for(CORBA::ULong i = 0; i < length; i++) { s[i] = base[i]; } #endif /* TAO_NO_COPY_OCTET_SEQUENCES == 1 */ } TAO_FTRTEC::Log(2, ACE_TEXT("Setting state\n")); info.ior->set_state(s); info.ior->create_group(new_impl->info_list, object_group_ref_version); TAO_FTRTEC::Log(2, ACE_TEXT("After create_group\n")); } // commit the changes IOGR_Maker::instance()->set_ref_version( object_group_ref_version ); publisher->update_info(group_info); delete impl_; impl_ = new_impl.release(); }