#include <i_migrationjob_impl.h>


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_t * | GetFiles () |
| i_FSC_ptr | GetFSC () |
| virtual void | Execute () |
Protected Attributes | |
| i_PartitionManager_i & | m_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 |
| 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 }

| 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 }

| 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 }

| 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 }

| 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 }


| 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 }

| 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 }

| 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 }

| 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 }

| 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 }


friend class pm_AssignResThread [friend] |
i_PartitionManager_i& i_MigrationJob_i::m_iPM [protected] |
Definition at line 84 of file i_migrationjob_impl.h.
Referenced by CompleteJob(), Execute(), GetFSC(), and i_MigrationJob_i().
bool i_MigrationJob_i::m_allBeaSuccess [private] |
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().
pm_FileList i_MigrationJob_i::m_files [private] |
Definition at line 93 of file i_migrationjob_impl.h.
Referenced by CompleteJob(), Execute(), GetFiles(), and i_MigrationJob_i().
UInt32_t i_MigrationJob_i::m_numOfBeas [private] |
Definition at line 94 of file i_migrationjob_impl.h.
Referenced by CompleteJob(), i_MigrationJob_i(), and MediumOperationComplete().
UInt64_t i_MigrationJob_i::m_majColId [private] |
UInt64_t i_MigrationJob_i::m_minColId [private] |
UInt32_t i_MigrationJob_i::m_flags [private] |
i_MigrationJob_i::log_CLASSID_m [private] |
1.5.6