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: ![]()
|