Skip to content

Commit

Permalink
Check XrdOss::Create() return value in File::Open().
Browse files Browse the repository at this point in the history
  • Loading branch information
alja committed Jun 15, 2016
1 parent 3c56d49 commit 73933db
Showing 1 changed file with 41 additions and 49 deletions.
90 changes: 41 additions & 49 deletions src/XrdFileCache/XrdFileCacheFile.cc
Expand Up @@ -214,71 +214,63 @@ bool File::Open()
XrdOss &m_output_fs = *Cache::GetInstance().GetOss();
// Create the data file itself.
XrdOucEnv myEnv;
m_output_fs.Create(Cache::GetInstance().RefConfiguration().m_username.c_str(), m_temp_filename.c_str(), 0600, myEnv, XRDOSS_mkpath);
m_output = m_output_fs.newFile(Cache::GetInstance().RefConfiguration().m_username.c_str());
if (m_output)
{
int res = m_output->Open(m_temp_filename.c_str(), O_RDWR, 0600, myEnv);
if (res < 0)
{
TRACEF(Error, "File::Open() can't open data file, " << strerror(errno));
delete m_output;
m_output = 0;
return false;
}
if ( m_output_fs.Create(Cache::GetInstance().RefConfiguration().m_username.c_str(), m_temp_filename.c_str(), 0600, myEnv, XRDOSS_mkpath) !=XrdOssOK)
{
TRACEF(Error, "File::Open() can't create data file, " << strerror(errno));
return false;
}
else

m_output = m_output_fs.newFile(Cache::GetInstance().RefConfiguration().m_username.c_str());
if (m_output->Open(m_temp_filename.c_str(), O_RDWR, 0600, myEnv) != XrdOssOK)
{
TRACEF(Error, "File::Open() can't get file handle");
TRACEF(Error, "File::Open() can't get FD for data file, " << strerror(errno));
delete m_output;
m_output = 0;
return false;
}


// Create the info file
std::string ifn = m_temp_filename + Info::m_infoExtension;

struct stat infoStat;
bool fileExisted = (Cache::GetInstance().GetOss()->Stat(ifn.c_str(), &infoStat) == XrdOssOK);

m_output_fs.Create(Cache::GetInstance().RefConfiguration().m_username.c_str(), ifn.c_str(), 0600, myEnv, XRDOSS_mkpath);
m_infoFile = m_output_fs.newFile(Cache::GetInstance().RefConfiguration().m_username.c_str());
if (m_infoFile)
if (m_output_fs.Create(Cache::GetInstance().RefConfiguration().m_username.c_str(), ifn.c_str(), 0600, myEnv, XRDOSS_mkpath) != XrdOssOK)
{
if (fileExisted) assert(infoStat.st_size > 0);
int res = m_infoFile->Open(ifn.c_str(), O_RDWR, 0600, myEnv);
if (res < 0)
{
TRACEF(Error, "File::Open() can't open info file, " << strerror(errno));
delete m_infoFile;
m_infoFile = 0;
return false;
}
else {
if (fileExisted)
{
int res = m_cfi.Read(m_infoFile);
TRACEF(Debug, "Reading existing info file bytes = " << res);
m_downloadCond.Lock();
// this method is called from constructor, no need to lock downloadStaus
bool complete = m_cfi.IsComplete();
if (complete) m_prefetchState = kComplete;
m_downloadCond.UnLock();
}
else {
m_fileSize = m_fileSize;
int ss = (m_fileSize - 1)/m_cfi.GetBufferSize() + 1;
TRACEF(Debug, "Creating new file info, data size = " << m_fileSize << " num blocks = " << ss);
m_cfi.SetBufferSize(Cache::GetInstance().RefConfiguration().m_bufferSize);
m_cfi.SetFileSize(m_fileSize);
m_cfi.WriteHeader(m_infoFile);
m_infoFile->Fsync();
}
}
TRACEF(Error, "File::Open() can't create info file, " << strerror(errno));
return false;
}
else
m_infoFile = m_output_fs.newFile(Cache::GetInstance().RefConfiguration().m_username.c_str());
if (fileExisted) assert(infoStat.st_size > 0);
if (m_infoFile->Open(ifn.c_str(), O_RDWR, 0600, myEnv) != XrdOssOK)
{
// this should be a rare case wher FD can't be created
TRACEF(Error, "File::Open() can't get FD info file, " << strerror(errno));
delete m_infoFile;
m_infoFile = 0;
return false;
}

if (fileExisted)
{
int res = m_cfi.Read(m_infoFile);
TRACEF(Debug, "Reading existing info file bytes = " << res);
m_downloadCond.Lock();
// this method is called from constructor, no need to lock downloadStaus
bool complete = m_cfi.IsComplete();
if (complete) m_prefetchState = kComplete;
m_downloadCond.UnLock();
}
else {
m_fileSize = m_fileSize;
int ss = (m_fileSize - 1)/m_cfi.GetBufferSize() + 1;
TRACEF(Debug, "Creating new file info, data size = " << m_fileSize << " num blocks = " << ss);
m_cfi.SetBufferSize(Cache::GetInstance().RefConfiguration().m_bufferSize);
m_cfi.SetFileSize(m_fileSize);
m_cfi.WriteHeader(m_infoFile);
m_infoFile->Fsync();
}

if (m_prefetchState != kComplete) cache()->RegisterPrefetchFile(this);
return true;
}
Expand Down

0 comments on commit 73933db

Please sign in to comment.