blk_DiskFRIWriter Class Reference
[IVD Data format.]

#include <df.h>

Inheritance diagram for blk_DiskFRIWriter:

Inheritance graph
[legend]
Collaboration diagram for blk_DiskFRIWriter:

Collaboration graph
[legend]

List of all members.


Detailed Description

Definition at line 389 of file df.h.


Public Member Functions

 blk_DiskFRIWriter (df_BlockManager &a_mgr, const string &a_medVolID, bool a_createOnTmp=false, bool a_createNew=false, bool a_createInto=false, cmn_Path a_intoPath="", const string &a_extension="")
 blk_DiskFRIWriter (df_BlockManager &a_mgr, const string &a_medVolID, ivd_MigrationID_t a_migID, UInt32_t a_copyID, UInt32_t a_mediumKey, UInt32_t a_medVolNum, i_FSC_ptr a_fsc)
virtual ~blk_DiskFRIWriter ()

Protected Member Functions

virtual void Write (const UInt8_t *a_data, const UInt32_t a_size)

Protected Attributes

cmn_File m_diskFRI

Private Member Functions

void OpenFRIFile (const string &a_medVolID, bool a_createOnTmp, bool a_createNew, bool a_createInto=false, cmn_Path a_intoPath="", const string &a_extension="")

Private Attributes

 log_CLASSID_m
ivd_MigrationID_t m_migID
UInt32_t m_copyID
UInt32_t m_mediumKey
UInt32_t m_medVolNum
i_FSC_var m_fsc

Constructor & Destructor Documentation

blk_DiskFRIWriter::blk_DiskFRIWriter ( df_BlockManager a_mgr,
const string &  a_medVolID,
bool  a_createOnTmp = false,
bool  a_createNew = false,
bool  a_createInto = false,
cmn_Path  a_intoPath = "",
const string &  a_extension = "" 
)

Definition at line 44 of file blk_diskfriwriter.cpp.

References log_FUNC_A_m, and OpenFRIFile().

00052     : blk_BufferWriter(a_mgr),
00053       m_migID(0),
00054       m_copyID(0),
00055       m_mediumKey(0),
00056       m_medVolNum(0) {
00057 
00058     log_FUNC_A_m(blk_DiskFRIWriter,
00059         "a_medVolID=" << a_medVolID <<
00060         " createOnTmp = " << boolalpha << a_createOnTmp <<
00061         " create = " << boolalpha << a_createNew <<
00062         " a_createInto = " << boolalpha << a_createInto <<
00063         " a_intoPath = " << boolalpha << a_intoPath );
00064 
00065     OpenFRIFile(    a_medVolID, 
00066                     a_createOnTmp, 
00067                     a_createNew, 
00068                     a_createInto,
00069                     a_intoPath,
00070                     a_extension);
00071 }

Here is the call graph for this function:

blk_DiskFRIWriter::blk_DiskFRIWriter ( df_BlockManager a_mgr,
const string &  a_medVolID,
ivd_MigrationID_t  a_migID,
UInt32_t  a_copyID,
UInt32_t  a_mediumKey,
UInt32_t  a_medVolNum,
i_FSC_ptr  a_fsc 
)

Definition at line 73 of file blk_diskfriwriter.cpp.

References ie_INVALID_ARG, log_FUNC_A_m, m_fsc, and OpenFRIFile().

00081     : blk_BufferWriter(a_mgr),
00082       m_migID(a_migID),
00083       m_copyID(a_copyID),
00084       m_mediumKey(a_mediumKey),
00085       m_medVolNum(a_medVolNum),
00086       m_fsc(i_FSC::_duplicate(a_fsc))  {
00087 
00088     log_FUNC_A_m(blk_DiskFRIWriter,
00089         "a_medVolID=" << a_medVolID <<
00090         " a_migID = " << a_migID <<
00091         " a_copyID = " << a_copyID <<
00092         " a_mediumKey = " << a_mediumKey <<
00093         " a_medVolNum = " << a_medVolNum);
00094 
00095     if (CORBA::is_nil(m_fsc)) {
00096         throw ivd_InternalError(ie_INVALID_ARG, "a_fsc is nil.");
00097     };
00098 
00099     OpenFRIFile(a_medVolID, false, false);
00100 }

Here is the call graph for this function:

blk_DiskFRIWriter::~blk_DiskFRIWriter (  )  [virtual]

Definition at line 103 of file blk_diskfriwriter.cpp.

References cmn_File::GetFullPathRef(), log_ERR_m, log_FUNC_m, m_diskFRI, and cmn_File::SyncF().

00103                                       {
00104     log_FUNC_m(~blk_DiskFRIWriter);
00105 
00106     try {
00107         m_diskFRI.SyncF();
00108     }
00109     catch (ivd_Exception &ie) {
00110         log_ERR_m(
00111             "SyncF failed for file: " << m_diskFRI.GetFullPathRef() <<
00112             " . Ignored. Error: " << ie);
00113     }
00114 }

Here is the call graph for this function:


Member Function Documentation

void blk_DiskFRIWriter::Write ( const UInt8_t a_data,
const UInt32_t  a_size 
) [protected, virtual]

Implements blk_BufferWriter.

Definition at line 116 of file blk_diskfriwriter.cpp.

References dbg_DETAIL, dbg_LOW, dbg_NORM, i_MinorCol_t::flags, cmn_File::GetCurrentPosF(), ivd_BaseException::GetError(), cmn_File::GetFullPathRef(), ie_NO_DISK_SPACE, ie_RMDB_NOTFOUND, ipc_EXEC_m, ivd_Error, log_DBG_m, log_FUNC_m, log_WRN_m, m_copyID, m_diskFRI, m_fsc, m_mediumKey, m_medVolNum, m_migID, ipc_Corba::ResolveRM(), size, cmn_File::TruncF(), and cmn_File::WriteF().

00116                                                                           {
00117     log_FUNC_m(Write);
00118 
00119     //
00120     // Atomic append to the file.
00121     // TODO: Shall this functionality be moved to cmn_File?
00122     //
00123     ivd_FileRetSize_t wrote = m_diskFRI.WriteF(a_data, a_size);
00124 
00125     if (static_cast<UInt32_t>(wrote) < a_size) {
00126         log_WRN_m(
00127             "Writing failed. Truncating file to last full block: " <<
00128             m_diskFRI.GetFullPathRef() );
00129 
00130         ivd_FilePosition_t filePos = m_diskFRI.GetCurrentPosF();
00131         m_diskFRI.TruncF(filePos - wrote);
00132 
00133         throw ivd_Error(ie_NO_DISK_SPACE, "FRI disk out of space.");
00134     }
00135 
00136     if (!CORBA::is_nil(m_fsc)) {
00137 
00138         log_DBG_m(dbg_DETAIL, "Sending block to FSC.");
00139 
00140         i_CollocationIDs_t_var colIds;
00141         ipc_EXEC_m(
00142             i_FRIBlockInfo_t friInfo;
00143 
00144             friInfo.migID = m_migID;
00145             friInfo.copyID = m_copyID;
00146             friInfo.medVolNum = m_medVolNum;
00147             friInfo.mediaKey = m_mediumKey;
00148 
00149             i_DataBlock_t friBlock(
00150                 a_size, a_size, const_cast<CORBA::Octet*>(a_data), 0);
00151 
00152             colIds = m_fsc->InsertSplitFromFRIBlock(friInfo, friBlock);
00153         );
00154         UInt32_t size = colIds->length();
00155         log_DBG_m(dbg_DETAIL, "Number of minor collocation IDs: " << size);
00156 
00157         if (size > 0) {
00158             // Get RM reference.
00159             i_ResourceManager_var rm;
00160             ipc_EXEC_m(
00161                 CORBA::Object_var obj = ipc_Corba::ResolveRM();
00162                 rm = i_ResourceManager::_narrow(obj);
00163                 log_DBG_m(dbg_DETAIL,"Sucessfully resolved RM");
00164             );
00165             i_ColMediaVol_t entry;
00166             for (UInt32_t i(0); i < size; i++) {
00167                 entry.minColId = colIds[i];
00168                 entry.mediaKey = m_mediumKey;
00169                 entry.medVolNr = m_medVolNum;
00170                 log_DBG_m(dbg_DETAIL, "Adding minorColID " << entry.minColId 
00171                     << " to medium " << entry.mediaKey 
00172                     << " volume " << entry.medVolNr);
00173 
00174                 i_MinorCol_t minorCol;
00175                 try {
00176                     ipc_EXEC_m(
00177                         minorCol = rm->SelectMinorCol(entry.minColId);
00178                     );
00179                     log_DBG_m(dbg_DETAIL, "Flags: " << minorCol.flags); 
00180                     ipc_EXEC_m(
00181                         rm->AddColMediaVol(entry, minorCol.flags);
00182                     );
00183                     log_DBG_m(dbg_NORM, "Added.");
00184                 }
00185                 catch (ivd_Exception &e) {
00186                     if (e.GetError() == ie_RMDB_NOTFOUND){
00187                         log_DBG_m(dbg_LOW, "Minor collocation ID " << entry.minColId 
00188                                             << " is missing in RMDB for target medium key=" << m_mediumKey
00189                                             << " vol=" << m_medVolNum
00190                                             << " migID=" << m_migID
00191                                             << " copyID=" << m_copyID);
00192                     }
00193                     else {
00194                         throw;
00195                     }
00196                 }
00197             }
00198         } // if (size > 0)
00199     } // if (!CORBA::is_nil(m_fsc))
00200 }

Here is the call graph for this function:

void blk_DiskFRIWriter::OpenFRIFile ( const string &  a_medVolID,
bool  a_createOnTmp,
bool  a_createNew,
bool  a_createInto = false,
cmn_Path  a_intoPath = "",
const string &  a_extension = "" 
) [private]

Definition at line 202 of file blk_diskfriwriter.cpp.

References cmn_Global::dirs, fom_CREATE_ALWAYS, fom_OPEN_ALWAYS, fom_WRITE, ivd_Directories::fri, g_cmn, m_diskFRI, cmn_File::OpenF(), cmn_File::SeekEndF(), cmn_File::SetFullPath(), and ivd_Directories::tmp.

Referenced by blk_DiskFRIWriter().

00208                                   {
00209 
00210     if (a_createOnTmp) {
00211         m_diskFRI.SetFullPath(g_cmn.dirs.tmp + string("fri") + a_medVolID);
00212 /*
00213         m_diskFRI.OpenF(
00214             O_BINARY | O_WRONLY | O_CREAT |
00215             (a_createNew? O_TRUNC : O_APPEND) );
00216 */
00217     }
00218     else if (a_createInto) {
00219         string filename(a_medVolID + "." + a_extension);
00220         m_diskFRI.SetFullPath(a_intoPath + filename);    
00221     }
00222     else {
00223         m_diskFRI.SetFullPath(g_cmn.dirs.fri + a_medVolID);
00224 /*
00225     It would be better that create new would not overwrite the file
00226     if it exists when creating file for non-recovery purposes.
00227         m_diskFRI.OpenF(
00228             O_BINARY | O_WRONLY |
00229             (a_createNew? (O_CREAT | O_EXCL) : O_APPEND) );
00230 */
00231     }
00232     m_diskFRI.OpenF(fom_WRITE |(a_createNew ? fom_CREATE_ALWAYS :
00233                                               fom_OPEN_ALWAYS));
00234 
00235     if (!a_createNew) {
00236         // append to exiting FRI file
00237         m_diskFRI.SeekEndF();
00238     }
00239 }

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

Definition at line 416 of file df.h.

Referenced by OpenFRIFile(), Write(), and ~blk_DiskFRIWriter().

Reimplemented from blk_BufferWriter.

Definition at line 421 of file df.h.

Definition at line 431 of file df.h.

Referenced by Write().

Definition at line 432 of file df.h.

Referenced by Write().

Definition at line 433 of file df.h.

Referenced by Write().

Definition at line 434 of file df.h.

Referenced by Write().

i_FSC_var blk_DiskFRIWriter::m_fsc [private]

Definition at line 435 of file df.h.

Referenced by blk_DiskFRIWriter(), and Write().


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

Generated on Mon Feb 27 19:02:08 2012 for OPENARCHIVE by  doxygen 1.5.6