Home || Visual Search || Applications || Architecture || Important Messages || OGL || Src

Util::IOBuffer* Impala::Persistency::FileSystem::GetIOBuffer ( CString  fileName,
bool  readMode,
bool  useMemoryIfLocal,
String  useLocalFileIfRemote,
Int64  useLocalSizeIfRemote = 0,
bool  useIOBufferChannel = false 
) [inline]

Obtain a new IOBuffer to read/write the given fileName.

Ownership lies with caller.

The function checks whether the data server should be used. The user has some control over the type of buffer returned via the other parameters: useMemoryIfLocal determines whether the buffer should be memory or file based in case there is no data server. In case there is a data server, useLocalFileIfRemote determines whether the buffer should be file based or memory based. In the latter case, useLocalSizeIfRemote determines the (fixed) size of the buffer.

The SAFE way to use this function is. For a read mode buffer: GetIOBuffer(fileName, true, false, ""); For a write mode buffer: GetIOBuffer(fileName, false, false, "tmp");

The BEST way to use this function is. Read mode buffer: GetIOBuffer(fileName, true, false, "", 0, true); Write mode buffer: GetIOBuffer(fileName, false, false, "tmp", 0, true);

Definition at line 174 of file FileSystem.h.

References Impala::FileNameTmp(), ILOG_DEBUG, mDataChannel, mDataServer, Impala::Util::ReadIOBufferFromChannel(), Impala::Util::IOBuffer::SetUseChannel(), Impala::Util::IOBuffer::Valid(), and Valid().

Referenced by Impala::Persistency::File::GetReadBuffer(), and Impala::Persistency::File::GetWriteBuffer().

00177     {
00178         Util::IOBuffer* res = 0;
00179         ILOG_DEBUG("GetIOBuffer [" << fileName << "]");
00180         if (! Valid())
00181             return res;
00182 
00183         if (mDataChannel)
00184         {
00185             if (readMode)
00186             {
00187                 if (useIOBufferChannel)
00188                 {
00189                     ILOG_DEBUG("GetIOBuffer: Read using Channel to " <<
00190                                mDataServer << ": " << fileName);
00191                     res = new Util::IOBufferChannel(fileName, true,
00192                                                     mDataChannel);
00193                 }
00194                 else
00195                 {
00196                     ILOG_DEBUG("GetIOBuffer: Read using File: " << fileName);
00197                     /* the race condition that occurs when someone passes in
00198                        "tmp" while reading a file is very difficult to track
00199                        down (only happens with MPI-jobs). Therefore, generate 
00200                        a temporary filename even in read mode */
00201                     if (useLocalFileIfRemote == "tmp")
00202                         useLocalFileIfRemote = FileNameTmp();
00203                     res = Util::ReadIOBufferFromChannel(mDataChannel, fileName,
00204                                                         useLocalFileIfRemote);
00205                 }
00206             }
00207             else
00208             {
00209                 if (useIOBufferChannel)
00210                 {
00211                     ILOG_DEBUG("GetIOBuffer: Write using Channel " << fileName);
00212                     res = new Util::IOBufferChannel(fileName, false,
00213                                                     mDataChannel);
00214                 }
00215                 else if (useLocalFileIfRemote.empty())
00216                 {
00217                     ILOG_DEBUG("GetIOBuffer: Write using mem " << fileName);
00218                     res = new Util::IOBuffer(useLocalSizeIfRemote);
00219                 }
00220                 else
00221                 {
00222                     ILOG_DEBUG("GetIOBuffer: Write using File " << fileName);
00223                     if (useLocalFileIfRemote == "tmp")
00224                         useLocalFileIfRemote = FileNameTmp();
00225                     res = new Util::IOBufferFile(useLocalFileIfRemote, false,
00226                                                  false);
00227                 }
00228                 if (!useIOBufferChannel)
00229                     res->SetUseChannel(mDataChannel, fileName,
00230                                        useLocalFileIfRemote);
00231             }
00232         }
00233         else
00234         {
00235             res = new Util::IOBufferFile(fileName, readMode, useMemoryIfLocal);
00236         }
00237 
00238         if (res)
00239         {
00240             if (!res->Valid())
00241             {
00242                 delete res;
00243                 res = 0;
00244             }
00245         }
00246         return res;
00247     }

Here is the call graph for this function:


Generated on Thu Jan 13 09:22:52 2011 for ImpalaSrc by  doxygen 1.5.1