diff --git a/tapeserver/castor/castor.conf b/tapeserver/castor/castor.conf index 2ec2ce406ab8f7e5afde140bc2d0e82be80c6365..29aa8e427eef9605723a4f73cd5f0b160662a202 100644 --- a/tapeserver/castor/castor.conf +++ b/tapeserver/castor/castor.conf @@ -533,6 +533,9 @@ # URLs. #TapeServer XrootPrivateKey /etc/castor/xrd_tape_key.pem +# The timeout to use for Xroot functions. Default to 0 for no timeout. +#TapeServer XrootTimeout 0 + # Number of memory buffers in the data-transfer cache. #TapeServer NbBufs 300 diff --git a/tapeserver/castor/tape/tapeserver/daemon/DataTransferConfig.cpp b/tapeserver/castor/tape/tapeserver/daemon/DataTransferConfig.cpp index 0c4ed8ac2418ff64d492cc3cb0eac66271e95406..97d30186ec2951f7ded548eb7708fbac4bfc0831 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DataTransferConfig.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DataTransferConfig.cpp @@ -83,6 +83,8 @@ castor::tape::tapeserver::daemon::DataTransferConfig "TapeServer", "RemoteFileProtocol", "RFIO", log); config.xrootPrivateKey = castorConf.getConfEntString( "TapeServer", "XrootPrivateKey", "/etc/castor/xrd_tape_key.pem", log); + config.xrootTimeout = castorConf.getConfEntInt( + "TapeServer", "XrootTimeout", 0, log); const std::string useLBP = castorConf.getConfEntString( "TapeServer", "UseLogicalBlockProtection", "no", log); diff --git a/tapeserver/castor/tape/tapeserver/daemon/DataTransferConfig.hpp b/tapeserver/castor/tape/tapeserver/daemon/DataTransferConfig.hpp index ef038be971d2890b9560fd9abc3e453c9a1b3b4c..19530c466b3ce8eaca4f222bb21216ae194e9687 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DataTransferConfig.hpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DataTransferConfig.hpp @@ -106,6 +106,11 @@ struct DataTransferConfig { */ std::string xrootPrivateKey; + /** + * The timeout for all the xroot functions. The default is 0 (no timeout) + */ + uint16_t xrootTimeout; + /** * The boolean variable describing to use on not to use Logical * Block Protection. diff --git a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.cpp b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.cpp index a543c7b3724b9a02f0f2719cb49d679a2c6f1750..61ab18840f5f44c7d81812e8db062a183ab70bc9 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DataTransferSession.cpp @@ -161,7 +161,8 @@ castor::tape::tapeserver::daemon::Session::EndOfSessionAction rwd, lc, m_castorConf.remoteFileProtocol, - m_castorConf.xrootPrivateKey); + m_castorConf.xrootPrivateKey, + m_castorConf.xrootTimeout); RecallTaskInjector rti(mm, trst, dwtp, *retrieveMount, m_castorConf.bulkRequestRecallMaxFiles, m_castorConf.bulkRequestRecallMaxBytes,lc); @@ -255,7 +256,8 @@ castor::tape::tapeserver::daemon::Session::EndOfSessionAction mwd, lc, m_castorConf.remoteFileProtocol, - m_castorConf.xrootPrivateKey); + m_castorConf.xrootPrivateKey, + m_castorConf.xrootTimeout); MigrationTaskInjector mti(mm, drtp, twst, *archiveMount, m_castorConf.bulkRequestMigrationMaxFiles, m_castorConf.bulkRequestMigrationMaxBytes,lc); diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskReadTaskTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskReadTaskTest.cpp index 586afa251bfed9c1e780ed282b9ff4f627cf0eb0..215e5612400c1dbca1dcd0375ede7bf0dda06e6a 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskReadTaskTest.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskReadTaskTest.cpp @@ -132,7 +132,7 @@ namespace unitTests{ FakeTapeWriteTask ftwt; ftwt.pushDataBlock(new MemBlock(1,blockSize)); castor::tape::tapeserver::daemon::DiskReadTask drt(ftwt,&file,blockNeeded,flag); - DiskFileFactory fileFactory("RFIO",""); + DiskFileFactory fileFactory("RFIO","", 0); castor::messages::TapeserverProxyDummy tspd; MockMigrationWatchDog mmwd(1.0, 1.0, tspd, "", lc); drt.execute(lc,fileFactory,mmwd); diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskReadThreadPool.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskReadThreadPool.cpp index e001a3a70d4104eecbbef7af13b64c903b094d8d..c136a2c5fea018ae099258a95d1bc76ef1c256f7 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskReadThreadPool.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskReadThreadPool.cpp @@ -39,8 +39,8 @@ namespace daemon { DiskReadThreadPool::DiskReadThreadPool(int nbThread, uint64_t maxFilesReq,uint64_t maxBytesReq, castor::tape::tapeserver::daemon::MigrationWatchDog & migrationWatchDog, cta::log::LogContext lc, const std::string & remoteFileProtocol, - const std::string & xrootPrivateKeyPath) : - m_diskFileFactory(remoteFileProtocol, xrootPrivateKeyPath), + const std::string & xrootPrivateKeyPath, uint16_t xrootTimeout) : + m_diskFileFactory(remoteFileProtocol, xrootPrivateKeyPath, xrootTimeout), m_watchdog(migrationWatchDog), m_lc(lc),m_maxFilesReq(maxFilesReq), m_maxBytesReq(maxBytesReq), m_nbActiveThread(0) { diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskReadThreadPool.hpp b/tapeserver/castor/tape/tapeserver/daemon/DiskReadThreadPool.hpp index 19875a4965255206c1746bc072e5f375250a7237..511d88b22b08b4e0fcedf9b6716daa6584c1c6a1 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskReadThreadPool.hpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskReadThreadPool.hpp @@ -54,7 +54,7 @@ public: DiskReadThreadPool(int nbThread, uint64_t maxFilesReq,uint64_t maxBytesReq, castor::tape::tapeserver::daemon::MigrationWatchDog & migrationWatchDog, cta::log::LogContext lc, const std::string & remoteFileProtocol, - const std::string & xrootPrivateKeyPath); + const std::string & xrootPrivateKeyPath, uint16_t xrootTimeout); /** * Destructor. diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp index 37c59ed2f9f335c61a6e22655a63b6eec1aae07c..5e2d874122c3db8e785f9517bcf6d8998ded2820 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteTaskTest.cpp @@ -101,7 +101,7 @@ namespace unitTests{ TestingRetrieveMount trm(std::move(dbrm)); MockRecallReportPacker report(&trm,lc); RecallMemoryManager mm(10,100,lc); - DiskFileFactory fileFactory("RFIO",""); + DiskFileFactory fileFactory("RFIO","", 0); cta::MockRetrieveMount mrm; std::unique_ptr<TestingRetrieveJob> fileToRecall(new TestingRetrieveJob(mrm)); diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.cpp index e3c971e51eaf7cdcbdda26e195b6b9441b5a448b..f6560cc52377069787f02bb23176302b9be4745d 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.cpp @@ -42,8 +42,9 @@ DiskWriteThreadPool::DiskWriteThreadPool(int nbThread, RecallWatchDog& recallWatchDog, cta::log::LogContext lc, const std::string & remoteFileProtocol, - const std::string & xrootPrivateKeyPath): - m_diskFileFactory(remoteFileProtocol,xrootPrivateKeyPath), + const std::string & xrootPrivateKeyPath, + uint16_t xrootTimeout): + m_diskFileFactory(remoteFileProtocol, xrootPrivateKeyPath, xrootTimeout), m_reporter(report),m_watchdog(recallWatchDog),m_lc(lc) { m_lc.pushOrReplace(cta::log::Param("threadCount", nbThread)); diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.hpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.hpp index 07c0ce159c6731648429c09fb205f6f21bacf957..a7d5a1fbcf078cb034c1c3052156b470464c2be3 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.hpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPool.hpp @@ -68,7 +68,8 @@ public: RecallWatchDog& recallWatchDog, cta::log::LogContext lc, const std::string & remoteFileProtocol, - const std::string & xrootPrivateKeyPath); + const std::string & xrootPrivateKeyPath, + uint16_t xrootTimeout); /** * Destructor: we suppose the threads are no running (waitThreads() should * be called befor destruction unless the threads were not started. diff --git a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp index 79a59900149aae841be76b3f569c6d797a5fe0e6..44e2b67ac4f07978aead52419917697670027dc4 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/DiskWriteThreadPoolTest.cpp @@ -105,7 +105,7 @@ namespace unitTests{ castor::messages::TapeserverProxyDummy tspd; RecallWatchDog rwd(1,1,tspd,"", lc); - DiskWriteThreadPool dwtp(2,report,rwd,lc,"RFIO","/dev/null"); + DiskWriteThreadPool dwtp(2,report,rwd,lc,"RFIO","/dev/null", 0); dwtp.startThreads(); for(int i=0;i<5;++i){ diff --git a/tapeserver/castor/tape/tapeserver/daemon/RecallTaskInjectorTest.cpp b/tapeserver/castor/tape/tapeserver/daemon/RecallTaskInjectorTest.cpp index 0291381fe9cd647ac5735b04442fb29e5f1da986..f0d045515c94de6a972b97e018e58ccea92e2868 100644 --- a/tapeserver/castor/tape/tapeserver/daemon/RecallTaskInjectorTest.cpp +++ b/tapeserver/castor/tape/tapeserver/daemon/RecallTaskInjectorTest.cpp @@ -94,7 +94,7 @@ namespace unitTests FakeDiskWriteThreadPool(RecallReportPacker &rrp, RecallWatchDog &rwd, cta::log::LogContext & lc): DiskWriteThreadPool(1,rrp, - rwd,lc, "RFIO","/dev/null"){} + rwd,lc, "RFIO","/dev/null", 0){} virtual ~FakeDiskWriteThreadPool() {}; }; diff --git a/tapeserver/castor/tape/tapeserver/file/CryptoPPTest.cpp b/tapeserver/castor/tape/tapeserver/file/CryptoPPTest.cpp index 1626e6ebdd15d35876d4201685c1c13195c26eec..22a3599badbe70f94279d859b0559bb8f05f71f3 100644 --- a/tapeserver/castor/tape/tapeserver/file/CryptoPPTest.cpp +++ b/tapeserver/castor/tape/tapeserver/file/CryptoPPTest.cpp @@ -163,7 +163,7 @@ namespace unitTests { } private: virtual void run() { - castor::tape::diskFile::DiskFileFactory dff("xroot", m_keyPath); + castor::tape::diskFile::DiskFileFactory dff("xroot", m_keyPath, 0); for (int i=0; i<5; i++) { // Read keys in parallel and in a loop to test MT protection of the // key reading, not protected here. diff --git a/tapeserver/castor/tape/tapeserver/file/DiskFile.cpp b/tapeserver/castor/tape/tapeserver/file/DiskFile.cpp index 0cdf4fbd6534aab0d6a5c907da794949298180e4..2925c4a4ce685d2202c215bd242eadd61973e781 100644 --- a/tapeserver/castor/tape/tapeserver/file/DiskFile.cpp +++ b/tapeserver/castor/tape/tapeserver/file/DiskFile.cpp @@ -38,7 +38,7 @@ namespace tape { namespace diskFile { DiskFileFactory::DiskFileFactory(const std::string & remoteFileProtocol, - const std::string & xrootPrivateKeyFile): + const std::string & xrootPrivateKeyFile, uint16_t xrootTimeout): m_NoURLLocalFile("^(localhost:|)(/.*)$"), m_NoURLRemoteFile("^([^:]*:)(.*)$"), m_NoURLRadosStriperFile("^localhost:([^/]+)/(.*)$"), @@ -48,7 +48,8 @@ DiskFileFactory::DiskFileFactory(const std::string & remoteFileProtocol, m_URLCephFile("^radosStriper://(.*)$"), m_remoteFileProtocol(remoteFileProtocol), m_xrootPrivateKeyFile(xrootPrivateKeyFile), - m_xrootPrivateKeyLoaded(false) + m_xrootPrivateKeyLoaded(false), + m_xrootTimeout(xrootTimeout) { // Lowercase the protocol string std::transform(m_remoteFileProtocol.begin(), m_remoteFileProtocol.end(), @@ -140,7 +141,7 @@ ReadFile * DiskFileFactory::createReadFile(const std::string& path) { // Xroot URL? regexResult = m_URLXrootFile.exec(path); if (regexResult.size()) { - return new XrootReadFile(regexResult[1]); + return new XrootReadFile(regexResult[1], m_xrootTimeout); } // radosStriper URL? regexResult = m_URLCephFile.exec(path); @@ -159,14 +160,14 @@ ReadFile * DiskFileFactory::createReadFile(const std::string& path) { // In the current CASTOR implementation, the xrootd port is hard coded to 1095 return new XrootC2FSReadFile( std::string("root://") + regexResult[1] + "1095/" + regexResult[2], - xrootPrivateKey()); + xrootPrivateKey(), m_xrootTimeout); } // Do we have a radosStriper file? regexResult = m_NoURLRadosStriperFile.exec(path); if (regexResult.size()) { return new XrootC2FSReadFile( std::string("root://localhost:1095/")+regexResult[1]+"/"+regexResult[2], - xrootPrivateKey(), regexResult[1]); + xrootPrivateKey(), m_xrootTimeout, regexResult[1]); } throw cta::exception::Exception( std::string("In DiskFileFactory::createReadFile failed to parse URL: ")+path); @@ -187,7 +188,7 @@ WriteFile * DiskFileFactory::createWriteFile(const std::string& path) { // Xroot URL? regexResult = m_URLXrootFile.exec(path); if (regexResult.size()) { - return new XrootWriteFile(regexResult[1]); + return new XrootWriteFile(regexResult[1], m_xrootTimeout); } // radosStriper URL? regexResult = m_URLCephFile.exec(path); @@ -206,14 +207,14 @@ WriteFile * DiskFileFactory::createWriteFile(const std::string& path) { // In the current CASTOR implementation, the xrootd port is hard coded to 1095 return new XrootC2FSWriteFile( std::string("root://") + regexResult[1] + "1095/" + regexResult[2], - xrootPrivateKey()); + xrootPrivateKey(), m_xrootTimeout); } // Do we have a radosStriper file? regexResult = m_NoURLRadosStriperFile.exec(path); if (regexResult.size()) { return new XrootC2FSWriteFile( std::string("root://localhost:1095/")+regexResult[1]+"/"+regexResult[2], - xrootPrivateKey(), regexResult[1]); + xrootPrivateKey(), m_xrootTimeout, regexResult[1]); } throw cta::exception::Exception( std::string("In DiskFileFactory::createWriteFile failed to parse URL: ")+path); @@ -312,8 +313,8 @@ std::string CryptoPPSigner::sign(const std::string msg, // XROOT READ FILE //============================================================================== XrootC2FSReadFile::XrootC2FSReadFile(const std::string &url, - const CryptoPP::RSA::PrivateKey & xrootPrivateKey, - const std::string & pool) { + const CryptoPP::RSA::PrivateKey & xrootPrivateKey, uint16_t timeout, + const std::string & pool): XrootBaseReadFile(timeout) { // Setup parent's members m_readPosition = 0; m_URL = url; @@ -363,12 +364,13 @@ XrootC2FSReadFile::XrootC2FSReadFile(const std::string &url, m_signedURL = m_URL + opaqueBloc.str(); // ... and finally open the file - XrootClEx::throwOnError(m_xrootFile.Open(m_signedURL, OpenFlags::Read), + XrootClEx::throwOnError(m_xrootFile.Open(m_signedURL, OpenFlags::Read, XrdCl::Access::None, m_timeout), std::string("In XrootC2FSReadFile::XrootC2FSReadFile failed XrdCl::File::Open() on ") +m_URL+" opaqueBlock="+opaqueBloc.str()); } -XrootReadFile::XrootReadFile(const std::string &xrootUrl) { +XrootReadFile::XrootReadFile(const std::string &xrootUrl, uint16_t timeout): + XrootBaseReadFile(timeout) { // Setup parent's variables m_readPosition = 0; m_URL = xrootUrl + "?eos.ruid=0&eos.rgid=0"; // TODO: the second part of this string has been added by Daniele @@ -378,13 +380,13 @@ XrootReadFile::XrootReadFile(const std::string &xrootUrl) { // m_URL = xrootUrl; // and simply open using XrdCl::OpenFlags; - XrootClEx::throwOnError(m_xrootFile.Open(m_URL, OpenFlags::Read), + XrootClEx::throwOnError(m_xrootFile.Open(m_URL, OpenFlags::Read, XrdCl::Access::None, m_timeout), std::string("In XrootReadFile::XrootReadFile failed XrdCl::File::Open() on ")+m_URL); } size_t XrootBaseReadFile::read(void *data, const size_t size) const { uint32_t ret; - XrootClEx::throwOnError(m_xrootFile.Read(m_readPosition, size, data, ret), + XrootClEx::throwOnError(m_xrootFile.Read(m_readPosition, size, data, ret, m_timeout), std::string("In XrootReadFile::read failed XrdCl::File::Read() on ")+m_URL); m_readPosition += ret; return ret; @@ -394,7 +396,7 @@ size_t XrootBaseReadFile::size() const { const bool forceStat=true; XrdCl::StatInfo *statInfo(NULL); size_t ret; - XrootClEx::throwOnError(m_xrootFile.Stat(forceStat, statInfo), + XrootClEx::throwOnError(m_xrootFile.Stat(forceStat, statInfo, m_timeout), std::string("In XrootReadFile::size failed XrdCl::File::Stat() on ")+m_URL); ret= statInfo->GetSize(); delete statInfo; @@ -403,7 +405,7 @@ size_t XrootBaseReadFile::size() const { XrootBaseReadFile::~XrootBaseReadFile() throw() { try{ - m_xrootFile.Close(); + m_xrootFile.Close(m_timeout); } catch (...) {} } @@ -411,8 +413,9 @@ XrootBaseReadFile::~XrootBaseReadFile() throw() { // XROOT WRITE FILE //============================================================================== XrootC2FSWriteFile::XrootC2FSWriteFile(const std::string &url, - const CryptoPP::RSA::PrivateKey & xrootPrivateKey, - const std::string & pool){ + const CryptoPP::RSA::PrivateKey & xrootPrivateKey, uint16_t timeout, + const std::string & pool): + XrootBaseWriteFile(timeout) { // Setup parent's members m_writePosition = 0; m_closeTried = false; @@ -463,24 +466,27 @@ XrootC2FSWriteFile::XrootC2FSWriteFile(const std::string &url, m_signedURL = m_URL + opaqueBloc.str(); // ... and finally open the file for write (deleting any existing one in case) - XrootClEx::throwOnError(m_xrootFile.Open(m_signedURL, OpenFlags::Delete | OpenFlags::Write), + XrootClEx::throwOnError(m_xrootFile.Open(m_signedURL, OpenFlags::Delete | OpenFlags::Write, + XrdCl::Access::None, m_timeout), std::string("In XrootC2FSWriteFile::XrootC2FSWriteFile failed XrdCl::File::Open() on ") +m_URL); } -XrootWriteFile::XrootWriteFile(const std::string& xrootUrl) { +XrootWriteFile::XrootWriteFile(const std::string& xrootUrl, uint16_t timeout): + XrootBaseWriteFile(timeout) { // Setup parent's variables m_writePosition = 0; m_URL = xrootUrl; // and simply open using XrdCl::OpenFlags; - XrootClEx::throwOnError(m_xrootFile.Open(m_URL, OpenFlags::Delete | OpenFlags::Write), + XrootClEx::throwOnError(m_xrootFile.Open(m_URL, OpenFlags::Delete | OpenFlags::Write, + XrdCl::Access::None, m_timeout), std::string("In XrootWriteFile::XrootWriteFile failed XrdCl::File::Open() on ")+m_URL); } void XrootBaseWriteFile::write(const void *data, const size_t size) { - XrootClEx::throwOnError(m_xrootFile.Write(m_writePosition, size, data), + XrootClEx::throwOnError(m_xrootFile.Write(m_writePosition, size, data, m_timeout), std::string("In XrootWriteFile::write failed XrdCl::File::Write() on ") +m_URL); m_writePosition += size; @@ -490,20 +496,21 @@ void XrootBaseWriteFile::close() { // Multiple close protection if (m_closeTried) return; m_closeTried=true; - XrootClEx::throwOnError(m_xrootFile.Close(), + XrootClEx::throwOnError(m_xrootFile.Close(m_timeout), std::string("In XrootWriteFile::close failed XrdCl::File::Stat() on ")+m_URL); } XrootBaseWriteFile::~XrootBaseWriteFile() throw() { if(!m_closeTried){ - m_xrootFile.Close(); + m_xrootFile.Close(m_timeout); } } //============================================================================== // EOS READ FILE //============================================================================== -EosReadFile::EosReadFile(const std::string &eosUrl) { +EosReadFile::EosReadFile(const std::string &eosUrl, uint16_t timeout): + m_timeout(timeout) { // Setup parent's variables m_readPosition = 0; std::stringstream ss; @@ -511,14 +518,14 @@ EosReadFile::EosReadFile(const std::string &eosUrl) { m_URL = ss.str(); // and simply open using XrdCl::OpenFlags; - XrootClEx::throwOnError(m_xrootFile.Open(m_URL, OpenFlags::Read), - std::string("In XrootReadFile::XrootReadFile failed XrdCl::File::Open() on ")+m_URL); + XrootClEx::throwOnError(m_xrootFile.Open(m_URL, OpenFlags::Read, XrdCl::Access::None, m_timeout), + std::string("In EosReadFile::EosReadFile failed XrdCl::File::Open() on ")+m_URL); } size_t EosReadFile::read(void *data, const size_t size) const { uint32_t ret; - XrootClEx::throwOnError(m_xrootFile.Read(m_readPosition, size, data, ret), - std::string("In XrootReadFile::read failed XrdCl::File::Read() on ")+m_URL); + XrootClEx::throwOnError(m_xrootFile.Read(m_readPosition, size, data, ret, m_timeout), + std::string("In EosReadFile::read failed XrdCl::File::Read() on ")+m_URL); m_readPosition += ret; return ret; } @@ -527,8 +534,8 @@ size_t EosReadFile::size() const { const bool forceStat=true; XrdCl::StatInfo *statInfo(NULL); size_t ret; - XrootClEx::throwOnError(m_xrootFile.Stat(forceStat, statInfo), - std::string("In XrootReadFile::size failed XrdCl::File::Stat() on ")+m_URL); + XrootClEx::throwOnError(m_xrootFile.Stat(forceStat, statInfo, m_timeout), + std::string("In EosReadFile::size failed XrdCl::File::Stat() on ")+m_URL); ret= statInfo->GetSize(); delete statInfo; return ret; @@ -536,14 +543,15 @@ size_t EosReadFile::size() const { EosReadFile::~EosReadFile() throw() { try{ - m_xrootFile.Close(); + m_xrootFile.Close(m_timeout); } catch (...) {} } //============================================================================== // EOS WRITE FILE //============================================================================== -EosWriteFile::EosWriteFile(const std::string& eosUrl) { +EosWriteFile::EosWriteFile(const std::string& eosUrl, uint16_t timeout): + m_timeout(timeout) { // Setup parent's variables m_writePosition = 0; std::stringstream ss; @@ -551,13 +559,14 @@ EosWriteFile::EosWriteFile(const std::string& eosUrl) { m_URL = ss.str(); // and simply open using XrdCl::OpenFlags; - XrootClEx::throwOnError(m_xrootFile.Open(m_URL, OpenFlags::Delete | OpenFlags::Write), + XrootClEx::throwOnError(m_xrootFile.Open(m_URL, OpenFlags::Delete | OpenFlags::Write, + XrdCl::Access::None, m_timeout), std::string("In XrootWriteFile::XrootWriteFile failed XrdCl::File::Open() on ")+m_URL); } void EosWriteFile::write(const void *data, const size_t size) { - XrootClEx::throwOnError(m_xrootFile.Write(m_writePosition, size, data), + XrootClEx::throwOnError(m_xrootFile.Write(m_writePosition, size, data, m_timeout), std::string("In XrootWriteFile::write failed XrdCl::File::Write() on ") +m_URL); m_writePosition += size; @@ -567,13 +576,13 @@ void EosWriteFile::close() { // Multiple close protection if (m_closeTried) return; m_closeTried=true; - XrootClEx::throwOnError(m_xrootFile.Close(), + XrootClEx::throwOnError(m_xrootFile.Close(m_timeout), std::string("In XrootWriteFile::close failed XrdCl::File::Stat() on ")+m_URL); } EosWriteFile::~EosWriteFile() throw() { if(!m_closeTried){ - m_xrootFile.Close(); + m_xrootFile.Close(m_timeout); } } diff --git a/tapeserver/castor/tape/tapeserver/file/DiskFile.hpp b/tapeserver/castor/tape/tapeserver/file/DiskFile.hpp index c5a3b693572cd754e9d751de507f3e5ca9a3f276..117eeb88f7f25a6c9abec0c82fdf5133ada4d471 100644 --- a/tapeserver/castor/tape/tapeserver/file/DiskFile.hpp +++ b/tapeserver/castor/tape/tapeserver/file/DiskFile.hpp @@ -54,7 +54,7 @@ namespace castor { typedef castor::tape::utils::Regex Regex; public: DiskFileFactory(const std::string & remoteFileProtocol, - const std::string & xrootPrivateKey); + const std::string & xrootPrivateKey, uint16_t xrootTimeout); ReadFile * createReadFile(const std::string & path); WriteFile * createWriteFile(const std::string & path); private: @@ -69,6 +69,7 @@ namespace castor { std::string m_xrootPrivateKeyFile; CryptoPP::RSA::PrivateKey m_xrootPrivateKey; bool m_xrootPrivateKeyLoaded; + const uint16_t m_xrootTimeout; static cta::threading::Mutex g_rfioOptionsLock; public: diff --git a/tapeserver/castor/tape/tapeserver/file/DiskFileImplementations.hpp b/tapeserver/castor/tape/tapeserver/file/DiskFileImplementations.hpp index 3b1602b37893af3fa673fe95333a0b344467c4f9..ee9ae30013d90e549ab140c065e57e32f358c9bd 100644 --- a/tapeserver/castor/tape/tapeserver/file/DiskFileImplementations.hpp +++ b/tapeserver/castor/tape/tapeserver/file/DiskFileImplementations.hpp @@ -76,6 +76,7 @@ namespace castor { //============================================================================== class XrootBaseReadFile: public ReadFile { public: + XrootBaseReadFile(uint16_t timeout): m_timeout(timeout) {} virtual size_t size() const; virtual size_t read(void *data, const size_t size) const; virtual ~XrootBaseReadFile() throw(); @@ -85,18 +86,20 @@ namespace castor { // There is no const-correctness with XrdCl... mutable XrdCl::File m_xrootFile; mutable uint64_t m_readPosition; + const uint16_t m_timeout; typedef castor::tape::server::exception::XrootCl XrootClEx; }; class XrootReadFile: public XrootBaseReadFile { public: - XrootReadFile(const std::string &xrootUrl); + XrootReadFile(const std::string &xrootUrl, uint16_t timeout = 0); }; class XrootC2FSReadFile: public XrootBaseReadFile { public: XrootC2FSReadFile(const std::string &xrootUrl, const CryptoPP::RSA::PrivateKey & privateKey, + uint16_t timeout = 0, const std::string & cephPool = ""); virtual ~XrootC2FSReadFile() throw () {} private: @@ -105,6 +108,7 @@ namespace castor { class XrootBaseWriteFile: public WriteFile { public: + XrootBaseWriteFile(uint16_t timeout): m_timeout(timeout) {} virtual void write(const void *data, const size_t size); virtual void close(); virtual ~XrootBaseWriteFile() throw(); @@ -113,19 +117,21 @@ namespace castor { void setURL(const std::string & v) { m_URL = v; } XrdCl::File m_xrootFile; uint64_t m_writePosition; + const uint16_t m_timeout; typedef castor::tape::server::exception::XrootCl XrootClEx; bool m_closeTried; }; class XrootWriteFile: public XrootBaseWriteFile { public: - XrootWriteFile(const std::string &xrootUrl); + XrootWriteFile(const std::string &xrootUrl, uint16_t timeout = 0); }; class XrootC2FSWriteFile: public XrootBaseWriteFile { public: XrootC2FSWriteFile(const std::string &xrootUrl, const CryptoPP::RSA::PrivateKey & privateKey, + uint16_t timeout = 0, const std::string & cephPool = ""); virtual ~XrootC2FSWriteFile() throw () {} private: @@ -137,7 +143,7 @@ namespace castor { //============================================================================== class EosReadFile: public ReadFile { public: - EosReadFile(const std::string &eosUrl); + EosReadFile(const std::string &eosUrl, uint16_t timeout = 0); virtual size_t size() const; virtual size_t read(void *data, const size_t size) const; virtual ~EosReadFile() throw(); @@ -147,12 +153,13 @@ namespace castor { // There is no const-correctness with XrdCl... mutable XrdCl::File m_xrootFile; mutable uint64_t m_readPosition; + const uint16_t m_timeout; typedef castor::tape::server::exception::XrootCl XrootClEx; }; class EosWriteFile: public WriteFile { public: - EosWriteFile(const std::string &eosUrl); + EosWriteFile(const std::string &eosUrl, uint16_t timeout = 0); virtual void write(const void *data, const size_t size); virtual void close(); virtual ~EosWriteFile() throw(); @@ -161,6 +168,7 @@ namespace castor { void setURL(const std::string & v) { m_URL = v; } XrdCl::File m_xrootFile; uint64_t m_writePosition; + const uint16_t m_timeout; typedef castor::tape::server::exception::XrootCl XrootClEx; bool m_closeTried; }; diff --git a/tapeserver/castor/tape/tapeserver/file/FileTest.cpp b/tapeserver/castor/tape/tapeserver/file/FileTest.cpp index 676f039f829ad6a0a1da4b43a535fc78674b503f..499951ff06d8d6a77fbc2878d2eedb1b3c9dbfe6 100644 --- a/tapeserver/castor/tape/tapeserver/file/FileTest.cpp +++ b/tapeserver/castor/tape/tapeserver/file/FileTest.cpp @@ -267,7 +267,7 @@ namespace unitTests { const uint32_t block_size = 1024; char data1[block_size]; char data2[block_size]; - castor::tape::diskFile::DiskFileFactory fileFactory("RFIO",""); + castor::tape::diskFile::DiskFileFactory fileFactory("RFIO","", 0); TempFile sourceFile; sourceFile.randomFill(1000); TempFile destinationFile(sourceFile.path()+"_dst");