diff --git a/docs/man/xrdcp.1 b/docs/man/xrdcp.1 index 5a6acc9b090..1e0d4a86dd7 100644 --- a/docs/man/xrdcp.1 +++ b/docs/man/xrdcp.1 @@ -12,7 +12,7 @@ xrdcp - copy files [\fB--recursive\fR] [\fB--retry\fR \fItime\fR] [\fB--server\fR] [\fB--silent\fR] [\fB--sources\fR \fInum\fR] [\fB--streams\fR \fInum\fR] [\fB--tpc\fR \fIfirst\fR|\fIonly\fR] [\fB--verbose\fR] [\fB--version\fR] -[\fB--xrate\fR \fIrate\fR] [\fB--metalink\fR] +[\fB--xrate\fR \fIrate\fR] \fIlegacy options\fR: [\fB-adler\fR] [\fB-DS\fR\fIparm string\fR] [\fB-DI\fR\fIparm number\fR] [\fB-md5\fR] [\fB-np\fR] [\fB-OD\fR\fIcgi\fR] [\fB-OS\fR\fIcgi\fR] [\fB-x\fR] @@ -133,11 +133,6 @@ displays version information and immediately exits. .RS 5 [NOT YET IMPLEMENTED] -.RE -\fB-M\fR | \fB--metalink\fR -.RS 5 -treats source as a metalink. - limits the copy speed to the specified \fIrate\fB. The rate may be qualified with the letter \fBk\fR, \fBm\fR, or \fBg\fR to indicate kilo, mega, or giga bytes, respectively. The option only applies when the source or destination is diff --git a/src/XrdApps/XrdCpConfig.cc b/src/XrdApps/XrdCpConfig.cc index b02700a13d2..304d4013cf7 100644 --- a/src/XrdApps/XrdCpConfig.cc +++ b/src/XrdApps/XrdCpConfig.cc @@ -81,7 +81,7 @@ static XrdSysError eDest(&Logger, ""); XrdSysError *XrdCpConfig::Log = &XrdCpConfiguration::eDest; -const char *XrdCpConfig::opLetters = ":C:d:D:fFhHI:NpPrRsS:t:T:vVX:y:Z:M"; +const char *XrdCpConfig::opLetters = ":C:d:D:fFhHI:NpPrRsS:t:T:vVX:y:Z"; struct option XrdCpConfig::opVec[] = // For getopt_long() { @@ -108,7 +108,6 @@ struct option XrdCpConfig::opVec[] = // For getopt_long() {OPT_TYPE "version", 0, 0, XrdCpConfig::OpVersion}, {OPT_TYPE "xrate", 1, 0, XrdCpConfig::OpXrate}, {OPT_TYPE "parallel", 1, 0, XrdCpConfig::OpParallel}, - {OPT_TYPE "metalink", 0, 0, XrdCpConfig::OpMetalink}, {0, 0, 0, 0} }; @@ -222,8 +221,6 @@ do{while(optind < Argc && Legacy(optind)) {} break; case OpForce: OpSpec |= DoForce; break; - case OpMetalink: OpSpec |= DoMetalink; - break; case OpHelp: Usage(0); break; case OpIfile: if (inFile) free(inFile); @@ -289,9 +286,9 @@ do{while(optind < Argc && Legacy(optind)) {} // Make sure we have the right number of files // - if (inFile) {if (!parmCnt ) UMSG("Destination not specified.");} - else { if (!parmCnt ) UMSG("No files specified."); - if ( parmCnt == 1 && !( OpSpec & DoMetalink ) ) UMSG("Destination not specified."); + if (inFile) {if (!parmCnt ) UMSG("Destination not specified.");} + else { if (!parmCnt ) UMSG("No files specified."); + if ( parmCnt == 1 ) UMSG("Destination not specified."); } // Check for conflicts wit third party copy @@ -333,13 +330,6 @@ do{while(optind < Argc && Legacy(optind)) {} FMSG(strerror(rc) <<" processing " <Path, 2); } } - else - { -// Create an empty destination file -// - dstFile = new XrdCpFile(); - dstFile->Path = strdup( "" ); - } // Now pick up all the source files from the command line // @@ -859,7 +849,7 @@ void XrdCpConfig::Usage(int rc) " [--path] [--posc] [--proxy :] [--recursive]\n" " [--retry ] [--server] [--silent] [--sources ] [--streams ]\n" " [--tpc {first|only}] [--verbose] [--version] [--xrate ]\n" - " [--parallel ] [--metalink]"; + " [--parallel ]"; static const char *Syntax2= "\n" ": [[x]root://[:]/] | -"; @@ -903,8 +893,7 @@ void XrdCpConfig::Usage(int rc) "-V | --version prints the version number\n" "-X | --xrate limits the transfer to the specified rate. You can\n" " suffix the value with 'k', 'm', or 'g'\n" - " --parallel number of copy jobs to be run simultaneously\n" - "-M | --metalink treats source as a metalink\n\n" + " --parallel number of copy jobs to be run simultaneously\n\n" "Legacy options: [-adler] [-DI ] [-DS ] [-np]\n" " [-md5] [-OD] [-OS] [-version] [-x]"; diff --git a/src/XrdApps/XrdCpConfig.hh b/src/XrdApps/XrdCpConfig.hh index 1d70890b5bc..045c30bd94b 100644 --- a/src/XrdApps/XrdCpConfig.hh +++ b/src/XrdApps/XrdCpConfig.hh @@ -155,9 +155,6 @@ static const int DoParallel = 0x00200000; // --parallel static const int OpDynaSrc = 'Z'; static const int DoDynaSrc = 0x00400000; // --dynamic-src -static const int OpMetalink = 'M'; -static const int DoMetalink = 0x01000000; // -M | --metalink - // Call Config with the parameters passed to main() to fill out this object. If // the method returns then no errors have been found. Otherwise, it exits. // The following options may be passed (largely to support legacy stuff): diff --git a/src/XrdCl/XrdClChannel.cc b/src/XrdCl/XrdClChannel.cc index 598744db3f3..763f8ed23cc 100644 --- a/src/XrdCl/XrdClChannel.cc +++ b/src/XrdCl/XrdClChannel.cc @@ -288,7 +288,7 @@ namespace XrdCl if( redirector ) { - XRootDStatus st = redirector->Redirect( msg, pStreams[path.down] ); + XRootDStatus st = redirector->HandleRequest( msg, pStreams[path.down] ); if( st.IsOK() ) handler->OnStatusReady( msg, Status() ); return st; diff --git a/src/XrdCl/XrdClClassicCopyJob.cc b/src/XrdCl/XrdClClassicCopyJob.cc index 7c5ef1ff04a..b2fbef3da0f 100644 --- a/src/XrdCl/XrdClClassicCopyJob.cc +++ b/src/XrdCl/XrdClClassicCopyJob.cc @@ -549,11 +549,10 @@ namespace //------------------------------------------------------------------------ XRootDSource( const XrdCl::URL *url, uint32_t chunkSize, - uint8_t parallelChunks, - bool virtRedirector ): + uint8_t parallelChunks ): pUrl( url ), pFile( new XrdCl::File() ), pSize( -1 ), pCurrentOffset( 0 ), pChunkSize( chunkSize ), - pParallel( parallelChunks ), pVirtRedirector( virtRedirector ) + pParallel( parallelChunks ) { } @@ -581,7 +580,7 @@ namespace DefaultEnv::GetEnv()->GetString( "ReadRecovery", value ); pFile->SetProperty( "ReadRecovery", value ); - XRootDStatus st = pFile->Open( pUrl->GetURL(), OpenFlags::Read, Access::None, 0, pVirtRedirector ); + XRootDStatus st = pFile->Open( pUrl->GetURL(), OpenFlags::Read ); if( !st.IsOK() ) return st; @@ -693,7 +692,7 @@ namespace virtual XrdCl::XRootDStatus GetCheckSum( std::string &checkSum, std::string &checkSumType ) { - if( pVirtRedirector ) + if( pUrl->IsMetalink() ) { XrdCl::RedirectorRegistry ®istry = XrdCl::RedirectorRegistry::Instance(); XrdCl::VirtualRedirector *redirector = registry.Get( *pUrl ); @@ -746,7 +745,6 @@ namespace uint32_t pChunkSize; uint8_t pParallel; std::queue pChunks; - bool pVirtRedirector; }; //---------------------------------------------------------------------------- @@ -759,10 +757,9 @@ namespace //! Constructor //------------------------------------------------------------------------ XRootDSourceDynamic( const XrdCl::URL *url, - uint32_t chunkSize, - bool virtRedirector ): + uint32_t chunkSize ): pUrl( url ), pFile( new XrdCl::File() ), pCurrentOffset( 0 ), - pChunkSize( chunkSize ), pDone( false ), pVirtRedirector( virtRedirector ) + pChunkSize( chunkSize ), pDone( false ) { } @@ -789,7 +786,7 @@ namespace DefaultEnv::GetEnv()->GetString( "ReadRecovery", value ); pFile->SetProperty( "ReadRecovery", value ); - XRootDStatus st = pFile->Open( pUrl->GetURL(), OpenFlags::Read, Access::None, 0, pVirtRedirector ); + XRootDStatus st = pFile->Open( pUrl->GetURL(), OpenFlags::Read ); if( !st.IsOK() ) return st; @@ -865,7 +862,7 @@ namespace virtual XrdCl::XRootDStatus GetCheckSum( std::string &checkSum, std::string &checkSumType ) { - if( pVirtRedirector ) + if( pUrl->IsMetalink() ) { XrdCl::RedirectorRegistry ®istry = XrdCl::RedirectorRegistry::Instance(); XrdCl::VirtualRedirector *redirector = registry.Get( *pUrl ); @@ -887,7 +884,6 @@ namespace int64_t pCurrentOffset; uint32_t pChunkSize; bool pDone; - bool pVirtRedirector; }; //---------------------------------------------------------------------------- @@ -1249,7 +1245,7 @@ namespace Access::Mode mode = Access::UR|Access::UW|Access::GR|Access::OR; - return pFile->Open( pUrl->GetURL(), flags, mode ); + return pFile->Open( pUrl->GetURL(), flags, mode, 0, false ); } //------------------------------------------------------------------------ @@ -1424,7 +1420,7 @@ namespace XrdCl std::string checkSumPreset; uint16_t parallelChunks; uint32_t chunkSize; - bool posc, force, coerce, makeDir, dynamicSource, virtRedirector = false; + bool posc, force, coerce, makeDir, dynamicSource; pProperties->Get( "checkSumMode", checkSumMode ); pProperties->Get( "checkSumType", checkSumType ); @@ -1436,7 +1432,6 @@ namespace XrdCl pProperties->Get( "coerce", coerce ); pProperties->Get( "makeDir", makeDir ); pProperties->Get( "dynamicSource", dynamicSource ); - pProperties->Get( "metalink", virtRedirector ); //-------------------------------------------------------------------------- // Initialize the source and the destination @@ -1449,9 +1444,9 @@ namespace XrdCl else { if( dynamicSource ) - src.reset( new XRootDSourceDynamic( &GetSource(), chunkSize, virtRedirector ) ); + src.reset( new XRootDSourceDynamic( &GetSource(), chunkSize ) ); else - src.reset( new XRootDSource( &GetSource(), chunkSize, parallelChunks, virtRedirector ) ); + src.reset( new XRootDSource( &GetSource(), chunkSize, parallelChunks ) ); } XRootDStatus st = src->Initialize(); diff --git a/src/XrdCl/XrdClConstants.hh b/src/XrdCl/XrdClConstants.hh index 97c22677b0f..c30239ab6b5 100644 --- a/src/XrdCl/XrdClConstants.hh +++ b/src/XrdCl/XrdClConstants.hh @@ -64,6 +64,7 @@ namespace XrdCl const int DefaultTCPKeepAliveProbes = 9; const int DefaultMultiProtocol = 0; const int DefaultParallelEvtLoop = 1; + const int DefaultMetalinkProcessing = 1; const char * const DefaultPollerPreference = "built-in"; const char * const DefaultNetworkStack = "IPAuto"; diff --git a/src/XrdCl/XrdClCopy.cc b/src/XrdCl/XrdClCopy.cc index 480804a9675..98d86480c15 100644 --- a/src/XrdCl/XrdClCopy.cc +++ b/src/XrdCl/XrdClCopy.cc @@ -548,7 +548,6 @@ int main( int argc, char **argv ) bool coerce = false; bool makedir = false; bool dynSrc = false; - bool metalink = false; std::string thirdParty = "none"; if( config.Want( XrdCpConfig::DoPosc ) ) posc = true; @@ -559,7 +558,6 @@ int main( int argc, char **argv ) if( config.Want( XrdCpConfig::DoRecurse ) ) makedir = true; if( config.Want( XrdCpConfig::DoPath ) ) makedir = true; if( config.Want( XrdCpConfig::DoDynaSrc ) ) dynSrc = true; - if( config.Want( XrdCpConfig::DoMetalink ) ) metalink = true; //---------------------------------------------------------------------------- // Checksums @@ -653,24 +651,17 @@ int main( int argc, char **argv ) else if( config.dstFile->Protocol == XrdCpFile::isXroot ) { URL target( dest ); - //---------------------------------------------------------------------------- - // In case of metalink we accept an empty path, otherwise we do a stat - // (the remaining part of the URL might be given in the metalink file) - //---------------------------------------------------------------------------- - if( !( target.GetPath().empty() && config.Want( XrdCpConfig::DoMetalink ) ) ) - { - FileSystem fs( target ); - StatInfo *statInfo = 0; - XRootDStatus st = fs.Stat( target.GetPath(), statInfo ); - if( st.IsOK() ) - {if (statInfo->TestFlags( StatInfo::IsDir ) ) targetIsDir = true;} - else if (st.errNo == kXR_NotFound && config.Want( XrdCpConfig::DoPath )) - {int n = strlen(config.dstFile->Path); - if (config.dstFile->Path[n-1] == '/') targetIsDir = true; - } - - delete statInfo; - } + FileSystem fs( target ); + StatInfo *statInfo = 0; + XRootDStatus st = fs.Stat( target.GetPath(), statInfo ); + if( st.IsOK() ) + {if (statInfo->TestFlags( StatInfo::IsDir ) ) targetIsDir = true;} + else if (st.errNo == kXR_NotFound && config.Want( XrdCpConfig::DoPath )) + {int n = strlen(config.dstFile->Path); + if (config.dstFile->Path[n-1] == '/') targetIsDir = true; + } + + delete statInfo; } //---------------------------------------------------------------------------- @@ -742,10 +733,11 @@ int main( int argc, char **argv ) //-------------------------------------------------------------------------- // Create a virtual redirector if it is a metalink file //-------------------------------------------------------------------------- - if( metalink ) + URL src( source ); + if( src.IsMetalink() ) { RedirectorRegistry ®istry = RedirectorRegistry::Instance(); - XRootDStatus st = registry.Register( source ); + XRootDStatus st = registry.Register( src ); if( !st.IsOK() ) { std::cerr << "RedirectorRegistry::Register " << source << " -> " << dest << ": "; @@ -764,7 +756,7 @@ int main( int argc, char **argv ) { target = dest + "/"; // if it is a metalink we don't want to use the metalink name - if( metalink ) + if( src.IsMetalink() ) { XrdCl::RedirectorRegistry ®istry = XrdCl::RedirectorRegistry::Instance(); VirtualRedirector *redirector = registry.Get( source ); @@ -788,7 +780,6 @@ int main( int argc, char **argv ) properties.Set( "checkSumPreset", checkSumPreset ); properties.Set( "chunkSize", chunkSize ); properties.Set( "parallelChunks", parallelChunks ); - properties.Set( "metalink", metalink ); XRootDStatus st = process.AddJob( properties, results ); if( !st.IsOK() ) diff --git a/src/XrdCl/XrdClDefaultEnv.cc b/src/XrdCl/XrdClDefaultEnv.cc index 8c0c0b777f2..0128a53f801 100644 --- a/src/XrdCl/XrdClDefaultEnv.cc +++ b/src/XrdCl/XrdClDefaultEnv.cc @@ -201,6 +201,7 @@ namespace XrdCl REGISTER_VAR_INT( varsInt, "TCPKeepProbes", DefaultTCPKeepAliveProbes ); REGISTER_VAR_INT( varsInt, "MultiProtocol", DefaultMultiProtocol ); REGISTER_VAR_INT( varsInt, "ParallelEvtLoop", DefaultParallelEvtLoop ); + REGISTER_VAR_INT( varsInt, "MetalinkProcessing", DefaultMetalinkProcessing ); REGISTER_VAR_STR( varsStr, "PollerPreference", DefaultPollerPreference ); REGISTER_VAR_STR( varsStr, "ClientMonitor", DefaultClientMonitor ); diff --git a/src/XrdCl/XrdClFile.hh b/src/XrdCl/XrdClFile.hh index 8b8a3eb9a65..a6c1b147f4d 100644 --- a/src/XrdCl/XrdClFile.hh +++ b/src/XrdCl/XrdClFile.hh @@ -69,7 +69,7 @@ namespace XrdCl Access::Mode mode, ResponseHandler *handler, uint16_t timeout = 0, - bool virtRedirector = false ) + bool virtRedirector = true ) XRD_WARN_UNUSED_RESULT; //------------------------------------------------------------------------ @@ -86,7 +86,7 @@ namespace XrdCl OpenFlags::Flags flags, Access::Mode mode = Access::None, uint16_t timeout = 0, - bool virtRedirector = false ) + bool virtRedirector = true ) XRD_WARN_UNUSED_RESULT; //------------------------------------------------------------------------ diff --git a/src/XrdCl/XrdClFileStateHandler.cc b/src/XrdCl/XrdClFileStateHandler.cc index f65916ae8ae..19c9cdd4c74 100644 --- a/src/XrdCl/XrdClFileStateHandler.cc +++ b/src/XrdCl/XrdClFileStateHandler.cc @@ -448,6 +448,8 @@ namespace XrdCl pOpenMode = mode; pOpenFlags = flags; + pUseVirtRedirector = virtRedirector && pFileUrl->IsMetalink(); + Message *msg; ClientOpenRequest *req; std::string path = pFileUrl->GetPathWithParams(); @@ -458,7 +460,7 @@ namespace XrdCl req->options = flags | kXR_async | kXR_retstat; req->dlen = path.length(); msg->Append( path.c_str(), path.length(), 24 ); - msg->SetVirtualRedirections( virtRedirector ); + msg->SetVirtualRedirections( pUseVirtRedirector ); XRootDTransport::SetDescription( msg ); OpenHandler *openHandler = new OpenHandler( this, handler ); @@ -469,7 +471,7 @@ namespace XrdCl //-------------------------------------------------------------------------- // Register a virtual redirector //-------------------------------------------------------------------------- - if( virtRedirector ) + if( pUseVirtRedirector ) { RedirectorRegistry& registry = RedirectorRegistry::Instance(); XRootDStatus st = registry.Register( url, handler ); @@ -480,7 +482,6 @@ namespace XrdCl params.loadBalancer = info; params.hostList = list; } - pUseVirtRedirector = virtRedirector; Status st = MessageUtils::SendMessage( *pFileUrl, msg, openHandler, params ); diff --git a/src/XrdCl/XrdClMetalinkRedirector.cc b/src/XrdCl/XrdClMetalinkRedirector.cc index f38069c8cb6..54527e5b483 100644 --- a/src/XrdCl/XrdClMetalinkRedirector.cc +++ b/src/XrdCl/XrdClMetalinkRedirector.cc @@ -196,7 +196,7 @@ XRootDStatus MetalinkRedirector::Load( ResponseHandler *userHandler ) { MetalinkOpenHandler * handler = new MetalinkOpenHandler( this, userHandler ); - XRootDStatus st = pFile->Open( pUrl, OpenFlags::Read, Access::None, handler ); + XRootDStatus st = pFile->Open( pUrl, OpenFlags::Read, Access::None, handler, 0, false ); if( !st.IsOK() ) { @@ -310,7 +310,7 @@ Message* MetalinkRedirector::GetErrorMsg( const Message *msg ) const // or an error response if there are no more replicas to try. // The virtual response is being handled by the given stream. //---------------------------------------------------------------------------- -XRootDStatus MetalinkRedirector::Redirect( Message *msg, Stream *stream ) +XRootDStatus MetalinkRedirector::HandleRequest( Message *msg, Stream *stream ) { XrdSysMutexHelper scopedLock( pMutex ); // if the metalink data haven't been loaded yet, make it pending @@ -320,10 +320,8 @@ XRootDStatus MetalinkRedirector::Redirect( Message *msg, Stream *stream ) return XRootDStatus(); } // otherwise generate a virtual response - Message *resp = GetResponse( msg ); - if( !resp ) resp = GetErrorMsg( msg ); // there are no more replicas to try - stream->ReceiveVirtual( resp ); - return XRootDStatus(); + Message *resp = GetResponse( msg ); + return stream->ReceiveVirtual( resp ); } //---------------------------------------------------------------------------- @@ -383,7 +381,7 @@ XRootDStatus MetalinkRedirector::GetReplica( const Message *msg, std::string &re //---------------------------------------------------------------------------- XRootDStatus MetalinkRedirector::GetCgiInfo( const Message *msg, const std::string &key, std::string &value ) const { - const ClientQueryRequest *req = reinterpret_cast( msg->GetBuffer() ); + const ClientRequestHdr *req = reinterpret_cast( msg->GetBuffer() ); kXR_int32 dlen = msg->IsMarshalled() ? ntohl( req->dlen ) : req->dlen; std::string url( msg->GetBuffer( 24 ), dlen ); size_t pos = url.find( '?' ); diff --git a/src/XrdCl/XrdClMetalinkRedirector.hh b/src/XrdCl/XrdClMetalinkRedirector.hh index 76889441f2d..ddb1d00e082 100644 --- a/src/XrdCl/XrdClMetalinkRedirector.hh +++ b/src/XrdCl/XrdClMetalinkRedirector.hh @@ -57,7 +57,7 @@ class MetalinkRedirector : public VirtualRedirector //! or an error response if there are no more replicas to try. //! The virtual response is being handled by the given stream. //---------------------------------------------------------------------------- - XRootDStatus Redirect( Message *msg, Stream *stream ); + XRootDStatus HandleRequest( Message *msg, Stream *stream ); //---------------------------------------------------------------------------- //! Gets the file name as specified in the metalink diff --git a/src/XrdCl/XrdClRedirectorRegistry.cc b/src/XrdCl/XrdClRedirectorRegistry.cc index 4f2cbbab6fa..53f35b884d6 100644 --- a/src/XrdCl/XrdClRedirectorRegistry.cc +++ b/src/XrdCl/XrdClRedirectorRegistry.cc @@ -14,7 +14,7 @@ namespace XrdCl { -void DeallcArgs( XRootDStatus *status, AnyObject *response, HostList *hostList ) +void DeallocArgs( XRootDStatus *status, AnyObject *response, HostList *hostList ) { delete status; delete response; @@ -39,9 +39,9 @@ class LoadHandler : public ResponseHandler // call the user handler if present if( pUserHandler ) pUserHandler->HandleResponseWithHosts( status, response, hostList ); // otherwise deallocate the function arguments - else DeallcArgs( status, response, hostList ); + else DeallocArgs( status, response, hostList ); } - else DeallcArgs( status, response, hostList ); + else DeallocArgs( status, response, hostList ); delete this; } @@ -71,7 +71,7 @@ class SyncLoadHandler : public ResponseHandler // call the sync handler if present if( pSyncHandler ) pSyncHandler->HandleResponseWithHosts( status, response, hostList ); // otherwise deallocate the function arguments - else DeallcArgs( status, response, hostList ); + else DeallocArgs( status, response, hostList ); delete this; } @@ -97,6 +97,9 @@ RedirectorRegistry::~RedirectorRegistry() XRootDStatus RedirectorRegistry::RegisterImpl( const URL &url, ResponseHandler *handler ) { + // we can only create a virtual redirector if + // a path to a metadata file has been provided + if( url.GetPath().empty() ) return XRootDStatus( stError, errNotSupported ); XrdSysMutexHelper scopedLock( pMutex ); // get the key and check if it is already in the registry const std::string key = url.GetLocation(); diff --git a/src/XrdCl/XrdClRedirectorRegistry.hh b/src/XrdCl/XrdClRedirectorRegistry.hh index d76d3f1679e..f642d1fa8e5 100644 --- a/src/XrdCl/XrdClRedirectorRegistry.hh +++ b/src/XrdCl/XrdClRedirectorRegistry.hh @@ -37,7 +37,7 @@ class VirtualRedirector //! or an error response if there are no more replicas to try. //! The virtual response is being handled by the given stream. //---------------------------------------------------------------------------- - virtual XRootDStatus Redirect( Message *msg, Stream *stream ) = 0; + virtual XRootDStatus HandleRequest( Message *msg, Stream *stream ) = 0; //---------------------------------------------------------------------------- //! Initializes the object with the content of the metalink file diff --git a/src/XrdCl/XrdClThirdPartyCopyJob.cc b/src/XrdCl/XrdClThirdPartyCopyJob.cc index 9c718eb0c3e..90fecbc7220 100644 --- a/src/XrdCl/XrdClThirdPartyCopyJob.cc +++ b/src/XrdCl/XrdClThirdPartyCopyJob.cc @@ -219,7 +219,7 @@ namespace XrdCl XRootDStatus st; st = targetFile.Open( realTarget.GetURL(), targetFlags, Access::None, - timeLeft ); + timeLeft, false ); if( !st.IsOK() ) { @@ -286,7 +286,7 @@ namespace XrdCl sourceFile.SetProperty( "ReadRecovery", value ); st = sourceFile.Open( tpcSource.GetURL(), OpenFlags::Read, Access::None, - timeLeft ); + timeLeft, false ); if( !st.IsOK() ) { @@ -412,11 +412,9 @@ namespace XrdCl } else { - bool virtRedirector = false; VirtualRedirector *redirector = 0; - pProperties->Get( "metalink", virtRedirector ); std::string vrCheckSum; - if( virtRedirector && + if( GetSource().IsMetalink() && ( redirector = RedirectorRegistry::Instance().Get( GetSource() ) ) && !( vrCheckSum = redirector->GetCheckSum( checkSumType ) ).empty() ) sourceCheckSum = vrCheckSum; @@ -520,9 +518,6 @@ namespace XrdCl // Check if we can open the source file and whether the actual data server // can support the third party copy //-------------------------------------------------------------------------- - bool virtRedirector = false; - properties->Get( "metalink", virtRedirector ); - File sourceFile; // set WriteRecovery property std::string value; @@ -538,7 +533,7 @@ namespace XrdCl log->Debug( UtilityMsg, "Trying to open %s for reading", sourceURL.GetURL().c_str() ); st = sourceFile.Open( sourceURL.GetURL(), OpenFlags::Read, Access::None, - timeLeft, virtRedirector ); + timeLeft ); if( !st.IsOK() ) { log->Error( UtilityMsg, "Cannot open source file %s: %s", @@ -552,7 +547,7 @@ namespace XrdCl VirtualRedirector *redirector = 0; long long size = -1; - if( virtRedirector && + if( source.IsMetalink() && ( redirector = RedirectorRegistry::Instance().Get( sourceURL ) ) && ( size = redirector->GetSize() ) >= 0 ) properties->Set( "sourceSize", size ); diff --git a/src/XrdCl/XrdClURL.cc b/src/XrdCl/XrdClURL.cc index 1d4a7d81133..c7c6471d3bc 100644 --- a/src/XrdCl/XrdClURL.cc +++ b/src/XrdCl/XrdClURL.cc @@ -368,7 +368,11 @@ namespace XrdCl bool URL::IsMetalink() const { - return PathEndsWith(".meta4") || PathEndsWith(".metalink"); + Env *env = DefaultEnv::GetEnv(); + int mlProcessing = DefaultMetalinkProcessing; + env->GetInt( "MetalinkProcessing", mlProcessing ); + if( !mlProcessing ) return false; + return PathEndsWith( ".meta4" ) || PathEndsWith( ".metalink" ); } bool URL::PathEndsWith(const std::string & sufix) const diff --git a/tests/XrdClTests/FileCopyTest.cc b/tests/XrdClTests/FileCopyTest.cc index 6a9b395cb6b..cc7778179b4 100644 --- a/tests/XrdClTests/FileCopyTest.cc +++ b/tests/XrdClTests/FileCopyTest.cc @@ -344,7 +344,6 @@ void FileCopyTest::CopyTestFunc( bool thirdParty ) results.Clear(); properties.Set( "source", metalinkURL ); properties.Set( "target", targetURL ); - properties.Set( "metalink", true ); properties.Set( "checkSumMode", "end2end" ); properties.Set( "checkSumType", "zcrc32" ); CPPUNIT_ASSERT_XRDST( process5.AddJob( properties, &results ) ); @@ -359,7 +358,6 @@ void FileCopyTest::CopyTestFunc( bool thirdParty ) properties.Set( "target", targetURL ); properties.Set( "checkSumMode", "end2end" ); properties.Set( "checkSumType", "zcrc32" ); - properties.Set( "metalink", false ); if( thirdParty ) properties.Set( "thirdParty", "only" ); diff --git a/tests/XrdClTests/FileTest.cc b/tests/XrdClTests/FileTest.cc index 2a69ce684ba..ec4c716936b 100644 --- a/tests/XrdClTests/FileTest.cc +++ b/tests/XrdClTests/FileTest.cc @@ -390,7 +390,7 @@ void FileTest::VirtualRedirectorTest() // Open the 1st metalink file // (the metalink contains just one file with a correct location) //---------------------------------------------------------------------------- - CPPUNIT_ASSERT_XRDST( f1.Open( mlUrl1, OpenFlags::Read, Access::None, 0, true ) ); + CPPUNIT_ASSERT_XRDST( f1.Open( mlUrl1, OpenFlags::Read ) ); CPPUNIT_ASSERT( f1.GetProperty( key, value ) ); CPPUNIT_ASSERT( value == fileUrl ); CPPUNIT_ASSERT_XRDST( f1.Close() ); @@ -399,7 +399,7 @@ void FileTest::VirtualRedirectorTest() // Open the 2nd metalink file // (the metalink contains 2 files, the one with higher priority does not exist) //---------------------------------------------------------------------------- - CPPUNIT_ASSERT_XRDST( f2.Open( mlUrl2, OpenFlags::Read, Access::None, 0, true ) ); + CPPUNIT_ASSERT_XRDST( f2.Open( mlUrl2, OpenFlags::Read ) ); CPPUNIT_ASSERT( f2.GetProperty( key, value ) ); CPPUNIT_ASSERT( value == fileUrl ); CPPUNIT_ASSERT_XRDST( f2.Close() ); @@ -408,7 +408,7 @@ void FileTest::VirtualRedirectorTest() // Open the 3rd metalink file // (the metalink contains 2 files, both don't exist) //---------------------------------------------------------------------------- - CPPUNIT_ASSERT_XRDST_NOTOK( f3.Open( mlUrl3, OpenFlags::Read, Access::None, 0, true ), errErrorResponse ); + CPPUNIT_ASSERT_XRDST_NOTOK( f3.Open( mlUrl3, OpenFlags::Read ), errErrorResponse ); //---------------------------------------------------------------------------- // Open the 4th metalink file @@ -417,7 +417,7 @@ void FileTest::VirtualRedirectorTest() const std::string replica1 = "root://srv3:1094//data/3c9a9dd8-bc75-422c-b12c-f00604486cc1.dat"; const std::string replica2 = "root://srv2:1094//data/3c9a9dd8-bc75-422c-b12c-f00604486cc1.dat"; - CPPUNIT_ASSERT_XRDST( f4.Open( mlUrl4, OpenFlags::Read, Access::None, 0, true ) ); + CPPUNIT_ASSERT_XRDST( f4.Open( mlUrl4, OpenFlags::Read ) ); CPPUNIT_ASSERT( f4.GetProperty( key, value ) ); CPPUNIT_ASSERT( value == replica1 ); CPPUNIT_ASSERT_XRDST( f4.Close() ); @@ -429,7 +429,7 @@ void FileTest::VirtualRedirectorTest() //---------------------------------------------------------------------------- // Now reopen the file //---------------------------------------------------------------------------- - CPPUNIT_ASSERT_XRDST( f4.Open( mlUrl4, OpenFlags::Read, Access::None, 0, true ) ); + CPPUNIT_ASSERT_XRDST( f4.Open( mlUrl4, OpenFlags::Read ) ); CPPUNIT_ASSERT( f4.GetProperty( key, value ) ); CPPUNIT_ASSERT( value == replica2 ); CPPUNIT_ASSERT_XRDST( f4.Close() );