i_MigrationJob_i Class Reference
[Partition Manager]

#include <i_migrationjob_impl.h>

Inheritance diagram for i_MigrationJob_i:

Inheritance graph
[legend]
Collaboration diagram for i_MigrationJob_i:

Collaboration graph
[legend]

List of all members.


Detailed Description

Definition at line 52 of file i_migrationjob_impl.h.


Public Member Functions

 i_MigrationJob_i (i_PartitionManager_i &a_iPM, pm_JobMgr &a_jobMgr, const pm_FileList &a_files, UInt64_t a_migId, UInt64_t a_majColId, UInt64_t a_minColId, UInt32_t a_flags)
virtual ~i_MigrationJob_i ()
virtual void GetNewResources (i_Index_t a_resNum)
virtual void MediumOperationComplete (i_Index_t a_beaNum, i_CompletionStatus_e a_status)
virtual void CompleteJob (i_CompletionStatus_e a_status)
void AssignResources (const i_ResourceList_t &a_resources)
virtual i_JobRequestList_tGetFiles ()
i_FSC_ptr GetFSC ()
virtual void Execute ()

Protected Attributes

i_PartitionManager_im_iPM

Private Member Functions

void Process (Int32_t a_copyNum)
 Non-interface function.

Private Attributes

bool m_allBeaSuccess
i_UploadAgent_var m_uploadAgent
pm_FileList m_files
UInt32_t m_numOfBeas
UInt64_t m_majColId
UInt64_t m_minColId
UInt32_t m_flags
 log_CLASSID_m

Friends

class pm_AssignResThread

Constructor & Destructor Documentation

i_MigrationJob_i::i_MigrationJob_i ( i_PartitionManager_i a_iPM,
pm_JobMgr a_jobMgr,
const pm_FileList a_files,
UInt64_t  a_migId,
UInt64_t  a_majColId,
UInt64_t  a_minColId,
UInt32_t  a_flags 
)

Definition at line 40 of file i_migrationjob_impl.cpp.

References i_Resource_t::blockSize, i_JobParams::bufId, i_JobParams::bufType, i_Resource_t::collocation, i_JobParams::copies, rm_String::cvalue_p, dbg_LOW, i_Job_i::GetJobTypeText(), i_Job_i::GetResources(), i_DISK_BUF, i_REMOTE_BUF, ie_CFG_INVALID, i_Job_i::InitBeaStatus(), ipc_EXEC_m, ivd_Error, i_JobParams::jobID, i_JobParams::jobPriority, i_JobParams::jobType, jt_MIGRATION, log_DBG_m, log_FUNC_m, log_WriteEvent(), ipc_Log::LogJobParams(), ipc_Log::LogResources(), i_Job_i::m_activeBeas, i_PartitionManager_i::m_config, i_PartitionManager_i::m_externalClient, m_files, cfg_PM::m_globalTree, i_Job_i::m_iJobParams, m_iPM, m_numOfBeas, i_PartitionManager_i::m_rmPart, i_Resource_t::majColId, i_Resource_t::mediumFamily, i_JobParams::migID, cfg_PMCfg::migrationPriority, i_Resource_t::minColId, i_Resource_t::minFlags, cfg_PMCfg::name, pm_FileList::NumOfFiles(), rm_Partition::partitionUUIDString, i_JobParams::partName, i_JobParams::partUUID, i_Resource_t::poolKey, i_Resource_t::poolName, cfg_Tree::pools, i_Resource_t::poolType, i_Resource_t::poolUUID, i_Resource_t::resNum, ipc_Init::ResourceInit(), and i_Job_i::SetResources().

00049     : i_Job_i(a_jobMgr),
00050         m_iPM(a_iPM),
00051         m_allBeaSuccess(true),
00052         m_files(a_files),
00053         m_majColId(a_majColId),
00054         m_minColId(a_minColId),
00055         m_flags(a_flags)
00056 
00057 {
00058     log_FUNC_m(i_MigrationJob_i);
00059     
00060     ipc_EXEC_m(
00061         m_iJobParams.migID = a_migID;
00062 
00063         m_iJobParams.jobPriority = m_iPM.m_config.migrationPriority;
00064         
00065         m_iJobParams.partName =
00066             CORBA::string_dup(m_iPM.m_config.name.c_str());
00067         
00068         m_iJobParams.partUUID =
00069             CORBA::string_dup(m_iPM.m_rmPart.partitionUUIDString.cvalue_p);
00070 
00071         m_iJobParams.copies   = m_iPM.m_config.m_globalTree.pools.size();
00072     );
00073     
00074     m_iJobParams.jobType  = jt_MIGRATION;
00075     
00076     if (m_iPM.m_externalClient) {
00077         m_iJobParams.bufType  = i_REMOTE_BUF;
00078     }
00079     else {
00080         m_iJobParams.bufType  = i_DISK_BUF;
00081     }
00082     m_iJobParams.bufId    = m_iJobParams.jobID;
00083 
00084     //set length of allocation table to number of pools
00085     i_ResourceList_t resources;
00086     ipc_EXEC_m(        
00087         resources.length(m_iPM.m_config.m_globalTree.pools.size());
00088     );
00089     
00090     // for each copy prepare row
00091     for (UInt32_t i(0); i < m_iPM.m_config.m_globalTree.pools.size(); i++){
00092 
00093         //check if block size is equal for all pools
00094         if (i > 0) {
00095             if (m_iPM.m_config.m_globalTree.pools[i].blockSize !=
00096                 m_iPM.m_config.m_globalTree.pools[i-1].blockSize) {
00097                     throw ivd_Error(
00098                         ie_CFG_INVALID,
00099                         "Media Pools for same set of copies "
00100                         "can not have different block size");
00101             }
00102         }
00103 
00108         i_Resource_t &allocRow = resources[i];
00109         //sets all memebers to 0 or to ipc_nilStr
00110         ipc_Init::ResourceInit(allocRow); 
00111 
00112         allocRow.resNum         = i;
00113         // Set to true if collocation IDs are present
00114         if (a_majColId > 0) {
00115             allocRow.collocation = true;
00116             allocRow.majColId = a_majColId;
00117             allocRow.minColId = a_minColId;
00118             allocRow.minFlags = a_flags;
00119         } 
00120         else {
00121             allocRow.collocation = false;
00122         }
00123 
00124         ipc_EXEC_m(
00125             allocRow.poolKey = 
00126                     m_iPM.m_config.m_globalTree.pools[i].mediaPoolKey;
00127 
00128             allocRow.poolUUID = 
00129                     CORBA::string_dup (
00130                         m_iPM.m_config.m_globalTree.pools[i].poolUUIDString
00131                     );
00132             allocRow.poolName = 
00133                     CORBA::string_dup (
00134                         m_iPM.m_config.m_globalTree.pools[i].mediaPoolName
00135                     );
00136 
00137             allocRow.blockSize = 
00138                     m_iPM.m_config.m_globalTree.pools[i].blockSize;
00139 
00140             allocRow.mediumFamily = 
00141                     m_iPM.m_config.m_globalTree.pools[i].mediaFamily;
00142 
00143             allocRow.poolType = 
00144                     m_iPM.m_config.m_globalTree.pools[i].mediaPoolType;
00145         );
00146 
00147     };
00148     SetResources(resources);
00149     
00150     log_DBG_m(dbg_LOW, "" << endl <<
00151         "Migration Job Created:" << endl <<
00152         ipc_Log::LogJobParams(m_iJobParams) << endl <<
00153         ipc_Log::LogResources(GetResources()) << endl);
00154     
00155     ostringstream os;
00156     os  
00157         << "Started (#files: " << m_files.NumOfFiles()
00158         << ", mig. ID:" << a_migID << ")." ;
00159 
00160     log_WriteEvent(os.str(), GetJobTypeText(), m_iJobParams.jobID);
00161         
00162     m_numOfBeas = (GetResources()).length();
00163     m_activeBeas.resize(m_numOfBeas);
00164     InitBeaStatus(m_numOfBeas);
00165 }

Here is the call graph for this function:

i_MigrationJob_i::~i_MigrationJob_i (  )  [virtual]

Definition at line 168 of file i_migrationjob_impl.cpp.

References dbg_DETAIL, evt_WARNING, i_Job_i::GetJobTypeText(), i_Job_i::IsAborted(), i_JobParams::jobID, log_DBG_m, log_FUNC_m, log_WriteEvent(), i_Job_i::m_iJobParams, m_uploadAgent, and i_Job_i::ReleaseDiskBuffer().

00168                                    {
00169     log_FUNC_m(~i_MigrationJob_i);
00170     
00171     if (!CORBA::is_nil(m_uploadAgent)) {
00172         try {
00173             m_uploadAgent->Remove();
00174         }
00175         catch (...) {
00176             log_DBG_m(dbg_DETAIL,"[" << m_iJobParams.jobID <<
00177                 "] m_uploadAgent->Remove() failed. Ignored.");
00178         };
00179     }
00180     ReleaseDiskBuffer();
00181         
00182     if (IsAborted()){
00183         log_WriteEvent( evt_WARNING, 
00184                         "Aborted.", 
00185                         GetJobTypeText(), 
00186                         m_iJobParams.jobID);
00187     }
00188 
00189 }

Here is the call graph for this function:


Member Function Documentation

void i_MigrationJob_i::GetNewResources ( i_Index_t  a_resNum  )  [virtual]

Implements i_Job_i.

Definition at line 438 of file i_migrationjob_impl.cpp.

References cmn_Condition::Broadcast(), bs_RUNNING, i_Job_i::ClearResStatus(), i_Job_i::GetResources(), ipc_CATCH_IVD_THROW_CORBA_m, ipc_EXEC_m, i_Job_i::IsAborted(), i_JobParams::jobID, log_FUNC_A_m, i_Job_i::m_activate_c, i_Job_i::m_activate_x, i_Job_i::m_beasStatus_x, i_Job_i::m_iJob, i_Job_i::m_iJobParams, i_Job_i::m_rm, i_JobParams::phase, i_Job_i::SetBeaStatus(), i_Job_i::SetResBeaStarted(), and i_Job_i::SetResRequested().

00438                                                         {
00439     log_FUNC_A_m(GetNewResources, "[" << m_iJobParams.jobID <<
00440                                   "] " << "a_resNum= " << a_resNum);
00441 
00442     {
00443         cmn_MutexLock l(m_beasStatus_x);
00444         SetBeaStatus(a_resNum, bs_RUNNING);
00445     }
00446 
00447     if (IsAborted()){
00448         cmn_MutexLock l(m_activate_x);
00449         m_activate_c.Broadcast();
00450         return;
00451     }
00452 
00453     try {
00454         m_iJobParams.phase++;
00455         ClearResStatus(a_resNum);
00456         SetResBeaStarted(a_resNum);
00457         SetResRequested(a_resNum);
00458         i_ResourceList_t resources;
00459         resources.length(1);
00460         resources[0] = (GetResources())[a_resNum];
00461         ipc_EXEC_m(
00462             m_rm->ExchangeResources(m_iJob, m_iJobParams, resources);
00463         );
00464 
00465     } ipc_CATCH_IVD_THROW_CORBA_m;
00466 
00467 }

Here is the call graph for this function:

void i_MigrationJob_i::MediumOperationComplete ( i_Index_t  a_beaNum,
i_CompletionStatus_e  a_status 
) [virtual]

Implements i_Job_i.

Definition at line 191 of file i_migrationjob_impl.cpp.

References cmn_Condition::Broadcast(), bs_NOT_RUNNING, CompleteJob(), dbg_NORM, evt_ERROR, i_Job_i::GetJobTypeText(), i_Job_i::GetResources(), i_DATA_ERROR, i_FAILED, i_HW_ERROR, i_SUCCEDED, ie_FATAL_ERROR, ipc_CATCH_IVD_THROW_CORBA_m, ipc_EXEC_m, i_Job_i::IsAborted(), job_POST_MED_PROC, i_JobParams::jobID, log_DBG_m, log_ERR_m, log_FUNC_m, log_WriteEvent(), ipc_Log::LogStatus(), i_Job_i::m_activate_c, i_Job_i::m_activate_x, m_allBeaSuccess, i_Job_i::m_beasStatus_x, i_Job_i::m_iJobParams, m_numOfBeas, i_Job_i::m_rm, i_Job_i::m_status, i_JobParams::phase, i_Job_i::ReleaseResource(), i_Job_i::SetBeaStatus(), i_Job_i::SetResMedOpComplete(), and i_Job_i::SetStatus().

00193                                                                    {
00194 
00195     log_FUNC_m(MediumOperationComplete);
00196     log_DBG_m(dbg_NORM,"[" << m_iJobParams.jobID <<
00197                         "] " << "Migration MediumOperationComplete called by Bea: " << 
00198                         a_beaNum << "  status: [" << a_status << "]" <<
00199                         ipc_Log::LogStatus(a_status) << endl <<
00200                         m_iJobParams.jobID);
00201     
00202     if (IsAborted()){
00203         return;
00204     }
00205     SetResMedOpComplete(a_beaNum);
00206 
00207     try {
00208         if (a_beaNum > static_cast<i_Index_t>(GetResources().length() ) ) {
00209             throw ivd_InternalError(
00210                 ie_FATAL_ERROR, "Non existing Bea wants to Complete Job??");
00211         };
00212     } ipc_CATCH_IVD_THROW_CORBA_m;
00213 
00214     {
00215         cmn_MutexLock l(m_beasStatus_x);
00216         SetBeaStatus(a_beaNum, bs_NOT_RUNNING);
00217     }
00218 
00219     //free up resources
00220     ReleaseResource(a_beaNum);
00221             
00222     if (m_numOfBeas > 1) { // are there any more beas active
00223         m_numOfBeas--;     // decrease bea counter
00224         ostringstream os;
00225         os << "Copy num:" << a_beaNum << " failed";
00226 
00227         switch (a_status){
00228             case(i_SUCCEDED):
00229                 
00230                 //log_ERR_m("BEA num:" << a_beaNum << " SUCCEDED");
00231                 break;
00232             case(i_FAILED):
00233                 m_allBeaSuccess = false;
00234                 os << ".";
00235                 log_ERR_m( os.str() );
00236                 log_WriteEvent( evt_ERROR, 
00237                                 os.str(), 
00238                                 GetJobTypeText(), 
00239                                 m_iJobParams.jobID);
00240                 break;
00241             case(i_HW_ERROR):
00242                 m_allBeaSuccess = false;
00243                 os << " (HW ERROR).";
00244                 log_ERR_m( os.str() );
00245                 log_WriteEvent( evt_ERROR, 
00246                                 os.str(), 
00247                                 GetJobTypeText(), 
00248                                 m_iJobParams.jobID);
00249                 break;
00250             case(i_DATA_ERROR):
00251                 m_allBeaSuccess = false;
00252                 os << " (DATA ERROR).";
00253                 log_ERR_m( os.str() );
00254                 log_WriteEvent( evt_ERROR, 
00255                                 os.str(), 
00256                                 GetJobTypeText(), 
00257                                 m_iJobParams.jobID);
00258                 break;
00259             default:
00260                 log_ERR_m(  "Unhandled bea completion status " << 
00261                             ipc_Log::LogStatus(a_status));
00262 
00263                 m_allBeaSuccess = false;
00264                 os << " (" << ipc_Log::LogStatus(a_status) << ").";
00265                 log_ERR_m( os.str() );
00266                 log_WriteEvent( os.str(),
00267                                 GetJobTypeText(),
00268                                 m_iJobParams.jobID);
00269 
00270         }
00271         ipc_EXEC_m(m_rm->SetPhase(m_iJobParams.jobID, m_iJobParams.phase++););
00272     }
00273     else {    //no more beas active
00274         if (m_allBeaSuccess && (a_status == i_SUCCEDED)) {
00275             //if all previous bea succeeded
00276             CompleteJob(i_SUCCEDED);
00277 
00278         } else {
00279             m_status = i_FAILED;
00280             cmn_MutexLock l(m_activate_x);
00281             m_activate_c.Broadcast();
00282         }
00283         SetStatus(job_POST_MED_PROC);
00284     }
00285 }

Here is the call graph for this function:

void i_MigrationJob_i::CompleteJob ( i_CompletionStatus_e  a_status  )  [virtual]

Implements i_Job_i.

Definition at line 287 of file i_migrationjob_impl.cpp.

References i_JobParams::bufType, pm_FileList::ConvertToCorba(), dbg_NORM, evt_ERROR, evt_WARNING, i_PartitionManager_i::GetHSM(), i_Job_i::GetJobTypeText(), i_Job_i::GetResources(), i_ABORTED, i_BEA_ERROR, i_CLIENT_ERROR, i_CLIENT_NOFILES, i_DATA_ERROR, i_FAILED, i_HW_ERROR, i_LA_ERROR, i_MEDIUM_ERROR, i_NO_HOST, i_RESOURCE_ERROR, i_SUCCEDED, i_SVC_ERROR, ipc_EXEC_m, i_JobParams::jobID, log_DBG_m, log_ERR_m, log_FUNC_m, log_WriteEvent(), ipc_Log::LogStatus(), i_Job_i::m_aborted, m_files, m_flags, i_Job_i::m_iJobParams, m_iPM, m_majColId, m_minColId, m_numOfBeas, i_Job_i::m_rm, i_Job_i::m_status, i_JobParams::migID, i_PartitionManager_i::Migrate(), and i_Job_i::Remove().

Referenced by MediumOperationComplete().

00287                                                                  {
00288     log_FUNC_m(CompleteJob);
00289     
00290 #if TGT_OS_linux
00291 #warning: CompleteJob called only with status: i_SUCCEDED
00292 #endif
00293     m_status = a_status;
00294     
00295     try {
00296         if (a_status == i_SUCCEDED){
00297             try {
00298                 ipc_EXEC_m(
00299                     // Notify HSM about the status os the
00300                     // completed migration
00301                     i_HSM_var hsm = m_iPM.GetHSM();
00302                     if (!CORBA::is_nil(hsm)){
00303                         hsm->CompleteMigration(
00304                                 m_iJobParams.bufType,
00305                                 m_iJobParams.jobID,
00306                                 a_status);
00307                     }
00308                 );
00309             } catch (ivd_Exception& e){
00310                 log_ERR_m("[" << m_iJobParams.jobID << 
00311                            "] " << "Caught Exception when " <<
00312                            "calling hsm->CompleteMigration" << e);
00313             }
00314                 
00315             if (a_status == i_SUCCEDED) {
00316                 log_WriteEvent("Finished.", GetJobTypeText(), m_iJobParams.jobID);
00317             }
00318             else if (m_aborted) {
00319                 log_WriteEvent(evt_WARNING, "Aborted.", 
00320                                GetJobTypeText(), m_iJobParams.jobID);
00321             } 
00322             else {
00323                 log_WriteEvent(evt_ERROR, "Failed.", 
00324                                GetJobTypeText(), m_iJobParams.jobID);
00325             }
00326             Remove();
00327        
00328         } else {
00329            
00330             switch (a_status) {
00331                 case(i_DATA_ERROR):
00332                 case(i_HW_ERROR):
00333                 case(i_MEDIUM_ERROR):
00334                 //Create new Migration Job, when job completes with error
00335                     {
00336                         i_JobRequestList_t_var files(m_files.ConvertToCorba());
00337                         ipc_EXEC_m(
00338                             m_iPM.Migrate(files, m_iJobParams.migID, m_majColId, m_minColId, m_flags);
00339                         );
00340                     }
00341                     break;
00342 
00343                 case(i_CLIENT_ERROR): //if client failed just remove job
00344                     break;
00345                 case(i_CLIENT_NOFILES): //if client has no files for migration
00346                     m_numOfBeas = 0;
00347                 case(i_LA_ERROR):
00348                 case(i_SVC_ERROR):
00349                 case(i_NO_HOST): //if LA, SVC or NOHOST ERROR Release resources
00350 
00351                 case(i_BEA_ERROR):
00352                 case(i_RESOURCE_ERROR):
00353                 case(i_FAILED):
00354                 case(i_ABORTED): {
00355                     log_DBG_m(dbg_NORM,"[" << m_iJobParams.jobID <<
00356                         "] " << "Will call Client CompleteMigration");
00357                     try {
00358                         ipc_EXEC_m(
00359                             i_HSM_var hsm = m_iPM.GetHSM();
00360                             if (!CORBA::is_nil(hsm)){
00361                                 hsm->CompleteMigration(
00362                                     m_iJobParams.bufType,
00363                                     m_iJobParams.jobID,
00364                                     i_FAILED);
00365                             }
00366                         );
00367                     } catch (ivd_Exception& e){
00368                         log_ERR_m("[" << m_iJobParams.jobID <<
00369                                   "] " << "Caught Exception when " <<
00370                                   "calling hsm->CompleteMigration:" <<
00371                                   endl << e);
00372                     }
00373 
00374                     break;
00375                 }
00376 
00377                 default:
00378                     log_ERR_m("Job removed with unhandled status " << a_status);
00379             }
00380 
00381             m_numOfBeas = 0;
00382             i_ResourceList_t resources = GetResources();
00383             bool resRequested(false);
00384             for (UInt32_t i = 0; i < resources.length(); ++i){
00385                 if (resources[i].resRequested) 
00386                     resRequested = true;
00387             }
00388             if (resRequested) {
00389                 try {
00390                     ipc_EXEC_m(
00391                         m_rm->CancelGetResource(m_iJobParams.jobID);
00392                     );
00393                 }
00394                 catch (ivd_Exception &ie) {
00395                     log_DBG_m(dbg_NORM,"[" << m_iJobParams.jobID <<
00396                         "] " << "Error on canceling resources: " << ie);
00397                     // Ignore all exceptions and 
00398                     // try to do as much cleanup as possible
00399                 }
00400                 catch (...) {
00401                     log_DBG_m(dbg_NORM,"[" << m_iJobParams.jobID <<
00402                         "] " << "Error on canceling resources.");
00403                     // Ignore all exceptions and 
00404                     //try to do as much cleanup as possible
00405                 }
00406             }
00407             
00408             if ( a_status != i_CLIENT_NOFILES){
00409                 ostringstream os;
00410                 os << "Failed (" << ipc_Log::LogStatus(a_status) << ").";
00411                 log_WriteEvent( evt_ERROR, 
00412                                 os.str(), 
00413                                 GetJobTypeText(), 
00414                                 m_iJobParams.jobID);
00415             } else {
00416                 ostringstream os;
00417                 os << "Finished (no files migrated).";
00418                 log_WriteEvent( evt_WARNING, 
00419                                 os.str(), 
00420                                 GetJobTypeText(), 
00421                                 m_iJobParams.jobID);
00422             }
00423 
00424             ipc_EXEC_m( Remove(); );
00425             return;
00426         }
00427         
00428     } catch (ivd_Exception& e) {
00429         log_ERR_m(e);
00430     } catch (ivd_InternalError& ie) {
00431         log_ERR_m(ie);
00432     } catch (...) {
00433         log_ERR_m("Caught unknown" );
00434     }
00435 }

Here is the call graph for this function:

Here is the caller graph for this function:

void i_MigrationJob_i::AssignResources ( const i_ResourceList_t a_resources  )  [virtual]

Reimplemented from i_Job_i.

Definition at line 469 of file i_migrationjob_impl.cpp.

References dbg_LOW, ipc_CATCH_IVD_THROW_CORBA_m, i_JobParams::jobID, log_DBG_m, log_FUNC_m, ipc_Log::LogResources(), i_Job_i::m_activate_x, i_Job_i::m_iJobParams, pm_AssignResThread, and cmn_Thread::Start().

00469                                                                          {
00470     log_FUNC_m(AssignResources);
00471 
00472     log_DBG_m(dbg_LOW,"[" << m_iJobParams.jobID <<
00473         "] " << "  got Resources:" << endl <<
00474         ipc_Log::LogResources(a_resources) );
00475 
00476     try {
00477         pm_AssignResThread * assignThread = new pm_AssignResThread(
00478                                                         *this, 
00479                                                         a_resources,
00480                                                         m_activate_x);
00481         assignThread->Start();
00482     } ipc_CATCH_IVD_THROW_CORBA_m;
00483 }

Here is the call graph for this function:

i_JobRequestList_t * i_MigrationJob_i::GetFiles (  )  [virtual]

Implements i_Job_i.

Definition at line 559 of file i_migrationjob_impl.cpp.

References pm_FileList::ConvertToCorba(), and m_files.

00559                                                {
00560     return m_files.ConvertToCorba();
00561 }

Here is the call graph for this function:

i_FSC_ptr i_MigrationJob_i::GetFSC (  )  [virtual]

Implements i_Job_i.

Definition at line 549 of file i_migrationjob_impl.cpp.

References i_PartitionManager_i::GetFSC(), ipc_CATCH_IVD_THROW_CORBA_m, log_FUNC_m, and m_iPM.

00549                                    {
00550     log_FUNC_m(GetFSC);
00551 
00552     try {
00553         i_FSC_var tmpFSC = i_FSC::_duplicate(m_iPM.GetFSC());
00554         return tmpFSC._retn();
00555     } ipc_CATCH_IVD_THROW_CORBA_m;
00556 }

Here is the call graph for this function:

void i_MigrationJob_i::Execute (  )  [virtual]

First step: Client -> invoke writing data to buffer

Implements i_Job_i.

Definition at line 564 of file i_migrationjob_impl.cpp.

References i_JobParams::bufType, pm_FileList::ConvertToCorba(), i_JobParams::copies, dbg_DETAIL, dbg_LOW, dbg_NORM, i_JobParams::diskBufferFS, dt_DISKBUF, evt_ERROR, g_cmn, i_Job_i::GetDiskBufferFileName(), ivd_BaseException::GetFriendly(), i_PartitionManager_i::GetHSM(), i_Job_i::GetJobTypeText(), pm_FileList::GetListSize(), i_Job_i::GetResources(), i_CLIENT_ERROR, i_CLIENT_NOFILES, i_FAILED, i_RESOURCE_ERROR, ie_NO_FILES, ie_PRECONDITION, ipc_EXEC_m, i_Job_i::IsAborted(), i_Job_i::IsFinished(), ivd_Error, ivd_Sleep, job_MED_PROC, i_JobParams::jobID, log_DBG_m, log_ERR_m, log_FUNC_m, log_WriteEvent(), i_Job_i::m_activate_x, i_PartitionManager_i::m_externalClient, m_files, cmn_SysInfo::m_hostName, i_Job_i::m_iJob, i_Job_i::m_iJobParams, m_iPM, i_PartitionManager_i::m_maxDiskBuff, i_Job_i::m_rm, i_Job_i::m_status, m_uploadAgent, i_JobParams::migID, i_Job_i::NeedsProcess(), Process(), i_Job_i::ReleaseDiskBuffer(), i_Job_i::RequestDiskBuffer(), ipc_Corba::ResolveSvc(), i_Job_i::SetDiskBufferWritten(), i_Job_i::SetResProcessed(), i_Job_i::SetResRequested(), i_Job_i::SetStatus(), cmn_Global::si, WAIT_FOR_DOMIG_RETRY, and i_Job_i::WaitBeasToFinish().

00564                                {
00565     log_FUNC_m(Execute);
00566 
00568 
00569     Int32_t numOfFiles = 0;
00570     i_HSM_var hsm = m_iPM.GetHSM();
00571 
00572     if (CORBA::is_nil(hsm)){
00573         throw ivd_Error(ie_PRECONDITION, "HSM is not running.");
00574     }
00575 
00576     // Reserve Disk Buffer
00577     UInt64_t fileSize(m_files.GetListSize());
00578     UInt64_t allocated(0);
00579     RequestDiskBuffer(fileSize, fileSize, allocated, m_iPM.m_maxDiskBuff);
00580 
00581     if (m_iPM.m_externalClient) {
00582         ipc_EXEC_m(
00583             CORBA::Object_var obj = ipc_Corba::ResolveSvc(g_cmn.si.m_hostName);
00584         i_Service_var svc = i_Service::_narrow(obj);
00585         i_UploadAgent_var uagt = svc->CreateUploadAgent(
00586             dt_DISKBUF,
00587             GetDiskBufferFileName().c_str() );
00588 
00589         m_uploadAgent = i_UploadAgent::_duplicate(uagt);
00590         );
00591     };
00592 
00593     log_DBG_m(dbg_NORM, "[" << m_iJobParams.jobID << "] " << 
00594                         "Number of copies: " << m_iJobParams.copies);
00595     try {
00596     
00597         ipc_EXEC_m(
00598             SetDiskBufferWritten();
00599             i_JobRequestList_t_var files(m_files.ConvertToCorba());
00600             numOfFiles = hsm->DoMigrationJob(
00601                 m_iJobParams.bufType,
00602                 m_iJobParams.diskBufferFS,
00603                 m_iJobParams.jobID,
00604                 GetResources()[0].blockSize,
00605                 m_iJobParams.copies,
00606                 m_iJobParams.migID,
00607                 files,
00608                 i_UploadAgent::_duplicate(m_uploadAgent) );
00609 
00610             if (!CORBA::is_nil(m_uploadAgent)) {
00611                 m_uploadAgent->Remove();
00612                 m_uploadAgent = i_UploadAgent::_nil();
00613             };
00614         );
00615     } catch (ivd_Exception) {
00616 
00617         log_DBG_m(dbg_LOW, "[" << m_iJobParams.jobID <<
00618                            "] " << "DoMigrationJob failed." <<
00619                            " Trying one more time.");
00620         // NOTE: If dDoMigration failed we should try to
00621         //  find out why it failed
00622         //  Then we can adjust waiting time or even skip retry
00623         //  There should be a more advance retry procedure here
00624         ivd_Sleep(WAIT_FOR_DOMIG_RETRY);
00625 
00626         if(IsAborted())
00627             return;
00628 
00629         ReleaseDiskBuffer();
00630         
00631         try {
00632             ipc_EXEC_m(
00633                 i_JobRequestList_t_var files(m_files.ConvertToCorba());
00634                 numOfFiles = hsm->DoMigrationJob(
00635                             m_iJobParams.bufType,
00636                             m_iJobParams.diskBufferFS,
00637                             m_iJobParams.jobID,
00638                             GetResources()[0].blockSize,
00639                             m_iJobParams.copies,
00640                             m_iJobParams.migID,
00641                             files,
00642                             i_UploadAgent::_duplicate(m_uploadAgent) );
00643 
00644                 SetDiskBufferWritten();
00645                 if (!CORBA::is_nil(m_uploadAgent)) {
00646                     m_uploadAgent->Remove();
00647                     m_uploadAgent = i_UploadAgent::_nil();
00648                 };
00649             );
00650         } catch (ivd_Exception& e) {
00651             log_ERR_m("[" << m_iJobParams.jobID <<
00652                       "] " << "Caught Exception in second " <<
00653                       "DoMigration Retry: " << e);
00654                       
00655              log_WriteEvent(evt_ERROR,
00656                             e.GetFriendly(),
00657                             GetJobTypeText(),
00658                             m_iJobParams.jobID);
00659                       
00660             m_status = i_CLIENT_ERROR;
00661             throw;
00662         }
00663     }
00664 
00665     if (numOfFiles == 0) {
00666         log_DBG_m(dbg_NORM, "[" << m_iJobParams.jobID <<
00667                             "] " <<
00668                             "No files written to disk buffer. " <<
00669                             "Complete job.")
00670 
00671         m_status = i_CLIENT_NOFILES;
00672         throw ivd_Error(ie_NO_FILES);
00673     }
00674 
00675     if (IsAborted()) {
00676         return;
00677     }
00678     
00679 
00680     log_DBG_m(dbg_NORM,"[" << m_iJobParams.jobID <<
00681                        "] " <<"DoMigJob Finished, will call RM->GetResources");
00682 
00683     SetStatus(job_MED_PROC);
00684     try {
00685         ipc_EXEC_m(
00686 
00687             for (UInt32_t i(0); i < GetResources().length(); i++){
00688 
00689                 i_ResourceList_t tmpRes;
00690                 tmpRes.length(1);
00691                 tmpRes[0] = GetResources()[i];
00692                 tmpRes[0].resRequested = true;
00693 
00694                 m_rm->GetResources(
00695                         m_iJob,
00696                         m_iJobParams,
00697                         tmpRes);
00698 
00699                 SetResRequested(i);
00700             }
00701 
00702         );
00703     } catch (ivd_Exception& e){
00704         log_DBG_m(dbg_NORM, "[" << m_iJobParams.jobID <<
00705                             "] " << "RM->GetResources failed.");
00706 
00707         log_WriteEvent(evt_ERROR, 
00708                        e.GetFriendly(),
00709                        GetJobTypeText(), 
00710                        m_iJobParams.jobID);
00711 
00712         m_status = i_RESOURCE_ERROR;
00713         throw;
00714     }
00715 
00716 
00717     try {
00718 
00719         while ( !IsFinished() && !IsAborted() ) {
00720             
00721             for (UInt32_t i(0); i < GetResources().length(); i++){
00722                 log_DBG_m(dbg_NORM,
00723                                 "[" << m_iJobParams.jobID <<
00724                                 "] " <<"Processing copyNum:" << i <<
00725                                 " resources assigned:" <<
00726                                 GetResources()[i].resAssigned <<
00727                                 " copy processed:" <<
00728                                 GetResources()[i].resProcessed);
00729 
00730                 if ( NeedsProcess(i)) {
00731                     Process(i);
00732                     SetResProcessed(i);
00733                     i = 0; //start from begining
00734                 }
00735             }
00736 
00737             if (IsAborted() || (m_status == i_FAILED) ) {
00738                 return;
00739             }
00740 
00741             bool gotRes(false);
00742 
00743             log_DBG_m(dbg_DETAIL,
00744                 "[" << m_iJobParams.jobID <<
00745                 "] locking mutex.");
00746 
00747             cmn_MutexLock l(m_activate_x);
00748 
00749             log_DBG_m(dbg_DETAIL,
00750                 "[" << m_iJobParams.jobID <<
00751                 "] Mutex locked.");
00752 
00753             for (UInt32_t i(0); i < GetResources().length(); i++){
00754                 if (NeedsProcess(i)) {
00755                     gotRes = true;
00756                 }
00757             }
00758 
00759             if (!gotRes){
00760                 WaitBeasToFinish(5);
00761             }
00762 
00763             if (IsAborted() || (m_status == i_FAILED) ) {
00764                 return;
00765             }
00766         }
00767     } catch (ivd_Exception& e){
00768 
00769         log_WriteEvent(evt_ERROR,
00770                        e.GetFriendly(),
00771                        GetJobTypeText(),
00772                        m_iJobParams.jobID);
00773 
00774         m_status = i_FAILED;
00775         throw;
00776     }
00777 }

Here is the call graph for this function:

void i_MigrationJob_i::Process ( Int32_t  a_copyNum  )  [private]

Non-interface function.

Definition at line 524 of file i_migrationjob_impl.cpp.

References i_Job_i::ActivateBea(), bs_PROCESSING, ipc_EXEC_m, i_Job_i::IsAborted(), i_Job_i::LoadUnload(), log_FUNC_m, i_Job_i::m_activeBeas, i_Job_i::m_beasStatus_x, and i_Job_i::SetBeaStatus().

Referenced by Execute().

00524                                                {
00525     log_FUNC_m(Process);
00526 
00527     if (IsAborted()){
00528         return;
00529     }
00530     
00531     ipc_EXEC_m(
00532         LoadUnload(a_copyNum);
00533         cmn_MutexLock l(m_beasStatus_x);
00534         if (CORBA::is_nil(m_activeBeas[a_copyNum])) {
00535             i_Job_i::ActivateBea(a_copyNum);
00536             m_activeBeas[a_copyNum]->Migrate();
00537         }
00538         else {
00539             // ActivateBea will set the drive properties
00540             i_Job_i::ActivateBea(a_copyNum);
00541         }
00542         SetBeaStatus(a_copyNum, bs_PROCESSING);
00543     );
00544 
00545 }

Here is the call graph for this function:

Here is the caller graph for this function:


Friends And Related Function Documentation

friend class pm_AssignResThread [friend]

Definition at line 54 of file i_migrationjob_impl.h.

Referenced by AssignResources().


Member Data Documentation

Definition at line 84 of file i_migrationjob_impl.h.

Referenced by CompleteJob(), Execute(), GetFSC(), and i_MigrationJob_i().

Definition at line 89 of file i_migrationjob_impl.h.

Referenced by MediumOperationComplete().

i_UploadAgent_var i_MigrationJob_i::m_uploadAgent [private]

Definition at line 91 of file i_migrationjob_impl.h.

Referenced by Execute(), and ~i_MigrationJob_i().

Definition at line 93 of file i_migrationjob_impl.h.

Referenced by CompleteJob(), Execute(), GetFiles(), and i_MigrationJob_i().

Definition at line 94 of file i_migrationjob_impl.h.

Referenced by CompleteJob(), i_MigrationJob_i(), and MediumOperationComplete().

Definition at line 96 of file i_migrationjob_impl.h.

Referenced by CompleteJob().

Definition at line 97 of file i_migrationjob_impl.h.

Referenced by CompleteJob().

Definition at line 99 of file i_migrationjob_impl.h.

Referenced by CompleteJob().

Reimplemented from i_Job_i.

Definition at line 101 of file i_migrationjob_impl.h.


The documentation for this class was generated from the following files:

Generated on Mon Feb 27 19:36:34 2012 for OPENARCHIVE by  doxygen 1.5.6