i_RecreatedIVDFSJob_i Class Reference
[Partition Manager]

#include <i_recreateivdfsjob_impl.h>

Inheritance diagram for i_RecreatedIVDFSJob_i:

Inheritance graph
[legend]
Collaboration diagram for i_RecreatedIVDFSJob_i:

Collaboration graph
[legend]

List of all members.


Detailed Description

Definition at line 21 of file i_recreateivdfsjob_impl.h.


Public Member Functions

 i_RecreatedIVDFSJob_i (pm_JobMgr &a_jobMgr, i_PartitionManager_i &a_iPM, i_UIMessageServer_ptr a_uims)
virtual ~i_RecreatedIVDFSJob_i ()
void AbortJob ()

Public Attributes

 log_CLASSID_m

Protected Member Functions

void Execute ()

Constructor & Destructor Documentation

i_RecreatedIVDFSJob_i::i_RecreatedIVDFSJob_i ( pm_JobMgr a_jobMgr,
i_PartitionManager_i a_iPM,
i_UIMessageServer_ptr  a_uims 
)

Definition at line 39 of file i_recreateivdfsjob_impl.cpp.

References log_FUNC_m.

00043                       : i_ThreadJob_i(a_jobMgr, a_iPM, a_uims)
00044 {
00045     log_FUNC_m(i_RecreatedIVDFSJob_i);
00046 }

i_RecreatedIVDFSJob_i::~i_RecreatedIVDFSJob_i (  )  [virtual]

Definition at line 48 of file i_recreateivdfsjob_impl.cpp.

References log_FUNC_m.

00048                                              {
00049     log_FUNC_m(~i_RecreatedIVDFSJob_i);
00050 }


Member Function Documentation

void i_RecreatedIVDFSJob_i::AbortJob (  )  [virtual]

Reimplemented from i_Job_i.

Definition at line 53 of file i_recreateivdfsjob_impl.cpp.

References i_Job_i::AbortJob(), i_FSC_i::IVDFSRecoveryAbort(), log_FUNC_m, i_PartitionManager_i::m_iFSCi, and i_ThreadJob_i::m_iPM.

00053                                     {
00054     log_FUNC_m(AbortJob);
00055     i_Job_i::AbortJob();
00056     m_iPM.m_iFSCi->IVDFSRecoveryAbort();
00057 }

Here is the call graph for this function:

void i_RecreatedIVDFSJob_i::Execute (  )  [protected, virtual]

Implements i_ThreadJob_i.

Definition at line 59 of file i_recreateivdfsjob_impl.cpp.

References cfg_PMCfg::clients, dbg_DETAIL, dbg_NORM, ui_MsgWriter::DisplayError(), ui_MsgWriter::DisplayMessage(), ui_MsgWriter::DisplayWarning(), evt_ERROR, evt_WARNING, ivd_BaseException::GetFriendly(), i_PartitionManager_i::GetName(), i_FAILED, i_IVD, i_SUCCEDED, ie_PRECONDITION, ipc_EXEC_m, ivd_Error, ivd_Sleep, i_FSC_i::IVDFSRecovery(), log_DBG_m, log_FUNC_m, log_WriteEvent(), i_PartitionManager_i::m_config, i_PartitionManager_i::m_iFSCi, i_PartitionManager_i::m_iHSM, i_ThreadJob_i::m_iPM, i_Job_i::m_status, i_ThreadJob_i::m_uiMsgWriter, i_PartitionManager_i::RecoveryOfIVDFSClear(), i_PartitionManager_i::RecoveryOfIVDFSSet(), and ipc_Corba::ResolveSvc().

00059                                    {
00060     log_FUNC_m(Execute);
00061     m_status = i_FAILED;
00062     if (!m_iPM.RecoveryOfIVDFSSet()) {
00063         string sstr("HSMFS recovery already in progress.");
00064         m_uiMsgWriter.DisplayWarning(sstr);
00065         log_WriteEvent(evt_WARNING, sstr);
00066         return;
00067     }
00068 
00069     // HSM must be mounted by recovery job
00070     if ( !CORBA::is_nil(m_iPM.m_iHSM)) {
00071         string sstr("HSM File System mounted - can't start HSMFS recovery.");
00072         m_uiMsgWriter.DisplayError(sstr);
00073         log_WriteEvent(evt_ERROR, sstr);
00074         m_iPM.RecoveryOfIVDFSClear();
00075         return;
00076     }
00077 
00078     string clientHostName = m_iPM.m_config.clients[0].name;
00079     string fileSystemID   = m_iPM.m_config.clients[0].fileSystemId;
00080 
00081     i_Service_var svc;
00082 
00083     try {
00084         CORBA::Object_var obj = ipc_Corba::ResolveSvc(clientHostName);
00085         svc = i_Service::_narrow(obj);
00086     }
00087     catch (...) {
00088         string sstr("Cannot resolve client " + clientHostName + ". Probably disconnected.");
00089         m_uiMsgWriter.DisplayError(sstr);
00090         log_WriteEvent(evt_ERROR, sstr);
00091         m_iPM.RecoveryOfIVDFSClear();
00092         return;
00093     }
00094 
00095     log_DBG_m(dbg_DETAIL, "PM: m_svc referenced as: " << svc << endl);
00096 
00097     i_StringList_t argSequence;
00098     argSequence.length(3);
00099     argSequence[0] = CORBA::string_dup("--mount-recovery");
00100 
00101     // Pass empty argument for mount point. ivd-svc will define it.
00102     cmn_Path mountPoint("");
00103 
00104     argSequence[1] = CORBA::string_dup(mountPoint.c_str());
00105 
00106     argSequence[2] = CORBA::string_dup(fileSystemID.c_str());
00107 
00108     log_DBG_m(dbg_DETAIL, " Recovery on host " << clientHostName
00109                        << " mount point " << mountPoint
00110                        << " fileSystem ID " << fileSystemID);
00111     ipc_EXEC_m(
00112         svc->Execute(i_IVD, argSequence);
00113     );
00114     
00115     // wait for 120 seconds for HSM to register with new CORBA reference
00116     const int maxWait = 120; // two minutes
00117     for (int count=0; count < maxWait && CORBA::is_nil(m_iPM.m_iHSM); ++count) {
00118         log_DBG_m(dbg_DETAIL, "RecoverHSMFS: waiting for HSM to register...");
00119         ivd_Sleep(1);
00120     }
00121 
00122     if (CORBA::is_nil(m_iPM.m_iHSM)) {
00123         ostringstream sstr;
00124         sstr << "HSM did not start in " << maxWait 
00125              << " seconds. HSMFS failed to mount to temporary recovery location.";
00126         m_uiMsgWriter.DisplayError(sstr.str());
00127         log_WriteEvent(evt_ERROR, sstr.str());
00128 
00129         m_iPM.RecoveryOfIVDFSClear();
00130         throw ivd_Error(ie_PRECONDITION, sstr.str());
00131     }
00132     else {
00133         //mounted
00134         string msg = "HSMFS successfully mounted to temporary recovery location.";
00135         m_uiMsgWriter.DisplayMessage(msg);
00136     }      
00137     
00138     try {
00139         for (int count=0; count < maxWait && !m_iPM.m_iHSM->IsHSMReady(); ++count) {
00140             log_DBG_m(dbg_DETAIL, "RecoverHSMFS: waiting for HSM to become ready...");
00141             ivd_Sleep(1);
00142         }
00143 
00144         if (!m_iPM.m_iHSM->IsHSMReady()) {
00145             ostringstream sstr;
00146             sstr << "HSM is not ready in " << maxWait << " seconds. Cannot start recovery.";
00147             m_uiMsgWriter.DisplayError(sstr.str());
00148             log_WriteEvent(evt_ERROR, sstr.str());
00149             goto end;
00150         }
00151 
00152         ipc_EXEC_m(
00153             m_iPM.m_iFSCi->IVDFSRecovery(
00154                                 m_iPM.GetName(), 
00155                                 i_HSM::_duplicate(m_iPM.m_iHSM), 
00156                                 m_uiMsgWriter);
00157         );
00158     }
00159     catch (ivd_Exception &e) {
00160         string msg("HSMFS recovery failed: " + e.GetFriendly());
00161         m_uiMsgWriter.DisplayError(msg);
00162         log_WriteEvent(evt_ERROR, msg);
00163     }
00164     catch (...) {
00165         string msg("HSMFS recovery failed. See error.log");
00166         m_uiMsgWriter.DisplayError(msg);
00167         log_WriteEvent(evt_ERROR, msg);
00168     }
00169 end:
00170     argSequence[0] = CORBA::string_dup("--umount-recovery");
00171     ipc_EXEC_m(
00172         svc->Execute(i_IVD, argSequence);
00173     );
00174 
00175     m_iPM.RecoveryOfIVDFSClear();
00176     m_status = i_SUCCEDED;
00177 
00178     log_DBG_m(dbg_NORM, "END HSMFSRecovery");
00179 }

Here is the call graph for this function:


Member Data Documentation

Reimplemented from i_ThreadJob_i.

Definition at line 30 of file i_recreateivdfsjob_impl.h.


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

Generated on Mon Feb 27 19:38:17 2012 for OPENARCHIVE by  doxygen 1.5.6