Skip to content

Commit

Permalink
[XrdCl] Try all IP addresses in case posix connect fails.
Browse files Browse the repository at this point in the history
  • Loading branch information
simonmichal committed Jan 17, 2018
1 parent b63a244 commit a9e2bfa
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 10 deletions.
5 changes: 5 additions & 0 deletions docs/man/xrdcp.1
Expand Up @@ -456,6 +456,11 @@ XRD_NODELAY
Disables the Nagle algorithm if set to 1 (default), enables it if set to 0.
.RE

XRD_PREFERIPV4
.RS 5
If set the client tries first IPv4 address (turned off by default).
.RE

.SH NOTES
Documentation for all components associated with \fBxrdcp\fR can be found at
http://xrootd.org/docs.html
Expand Down
1 change: 1 addition & 0 deletions src/XrdCl/XrdClConstants.hh
Expand Up @@ -69,6 +69,7 @@ namespace XrdCl
const int DefaultXCpBlockSize = 134217728; // DefaultCPChunkSize * DefaultCPParallelChunks * 2
const int DefaultNoDelay = 1;
const int DefaultAioSignal = 1;
const int DefaultPreferIPv4 = 0;

const char * const DefaultPollerPreference = "built-in";
const char * const DefaultNetworkStack = "IPAuto";
Expand Down
1 change: 1 addition & 0 deletions src/XrdCl/XrdClDefaultEnv.cc
Expand Up @@ -289,6 +289,7 @@ namespace XrdCl
REGISTER_VAR_INT( varsInt, "XCpBlockSize", DefaultXCpBlockSize );
REGISTER_VAR_INT( varsInt, "NoDelay", DefaultNoDelay );
REGISTER_VAR_INT( varsInt, "AioSignal", DefaultAioSignal );
REGISTER_VAR_INT( varsInt, "PreferIPv4", DefaultPreferIPv4 );

REGISTER_VAR_STR( varsStr, "PollerPreference", DefaultPollerPreference );
REGISTER_VAR_STR( varsStr, "ClientMonitor", DefaultClientMonitor );
Expand Down
37 changes: 27 additions & 10 deletions src/XrdCl/XrdClStream.cc
Expand Up @@ -240,7 +240,6 @@ namespace XrdCl
return pLastFatalError;

gettimeofday( &pConnectionStarted, 0 );
pConnectionInitTime = now;
++pConnectionCount;

//--------------------------------------------------------------------------
Expand All @@ -265,12 +264,23 @@ namespace XrdCl
// It's more efficient to remove addresses from the back of a vector
// so we reverse the it.
//--------------------------------------------------------------------------
std::reverse( pAddresses.begin(), pAddresses.end() );
pSubStreams[0]->socket->SetAddress( pAddresses.back() );
pAddresses.pop_back();
st = pSubStreams[0]->socket->Connect( pConnectionWindow );
if( st.IsOK() )
pSubStreams[0]->status = Socket::Connecting;
int preferIPv4 = DefaultPreferIPv4;
DefaultEnv::GetEnv()->GetInt( "PreferIPv4", preferIPv4 );
if( !preferIPv4 )
std::reverse( pAddresses.begin(), pAddresses.end() );

while( !pAddresses.empty() )
{
pSubStreams[0]->socket->SetAddress( pAddresses.back() );
pAddresses.pop_back();
pConnectionInitTime = ::time( 0 );
st = pSubStreams[0]->socket->Connect( pConnectionWindow );
if( st.IsOK() )
{
pSubStreams[0]->status = Socket::Connecting;
break;
}
}
return st;
}

Expand Down Expand Up @@ -676,12 +686,19 @@ namespace XrdCl
//------------------------------------------------------------------------
if( !pAddresses.empty() )
{
pSubStreams[0]->socket->SetAddress( pAddresses.back() );
pAddresses.pop_back();
Status st;
do
{
pSubStreams[0]->socket->SetAddress( pAddresses.back() );
pAddresses.pop_back();
pConnectionInitTime = ::time( 0 );
st = pSubStreams[0]->socket->Connect( pConnectionWindow );
}
while( !pAddresses.empty() && !st.IsOK() );

Status st = pSubStreams[0]->socket->Connect( pConnectionWindow-elapsed );
if( !st.IsOK() )
OnFatalError( subStream, st, scopedLock );

return;
}
//------------------------------------------------------------------------
Expand Down

0 comments on commit a9e2bfa

Please sign in to comment.