From 3c64ccb2672da3b475fbe0e864de8c36b9cbef21 Mon Sep 17 00:00:00 2001 From: Michal Simon Date: Tue, 26 Jan 2021 16:05:40 +0100 Subject: [PATCH] [XrdCl] Socket: lazy initialize srv addr. --- src/XrdCl/XrdClAsyncSocketHandler.cc | 2 +- src/XrdCl/XrdClSocket.cc | 13 +++++++------ src/XrdCl/XrdClSocket.hh | 26 +++++++++++++------------- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/XrdCl/XrdClAsyncSocketHandler.cc b/src/XrdCl/XrdClAsyncSocketHandler.cc index ef1c8f36be5..3b65f2a5a00 100644 --- a/src/XrdCl/XrdClAsyncSocketHandler.cc +++ b/src/XrdCl/XrdClAsyncSocketHandler.cc @@ -344,7 +344,7 @@ namespace XrdCl //-------------------------------------------------------------------------- pHandShakeData = new HandShakeData( pStream->GetURL(), pSubStreamNum ); - pHandShakeData->serverAddr = &pSocket->GetServerAddress(); + pHandShakeData->serverAddr = pSocket->GetServerAddress(); pHandShakeData->clientName = pSocket->GetSockName(); pHandShakeData->streamName = pStreamName; diff --git a/src/XrdCl/XrdClSocket.cc b/src/XrdCl/XrdClSocket.cc index c745200f1a9..fe00599a777 100644 --- a/src/XrdCl/XrdClSocket.cc +++ b/src/XrdCl/XrdClSocket.cc @@ -42,7 +42,7 @@ namespace XrdCl { Socket::Socket( int socket, SocketStatus status ): - pSocket(socket), pStatus( status ), pServerAddr( 0 ), + pSocket(socket), pStatus( status ), pProtocolFamily( AF_INET ), pChannelID( 0 ), pCorked( false ) @@ -215,7 +215,7 @@ namespace XrdCl if( pSocket == -1 || pStatus == Connected || pStatus == Connecting ) return XRootDStatus( stError, errInvalidOp ); - pServerAddr = addr; + pServerAddr.reset( new XrdNetAddr( addr ) );; //-------------------------------------------------------------------------- // Make sure TLS is off when the physical connection is newly established @@ -225,8 +225,8 @@ namespace XrdCl //-------------------------------------------------------------------------- // Connect //-------------------------------------------------------------------------- - int status = XrdNetConnect::Connect( pSocket, pServerAddr.SockAddr(), - pServerAddr.SockSize(), timeout ); + int status = XrdNetConnect::Connect( pSocket, pServerAddr->SockAddr(), + pServerAddr->SockSize(), timeout ); if( status != 0 ) { XRootDStatus st( stError ); @@ -778,12 +778,13 @@ namespace XrdCl // Enable encryption //------------------------------------------------------------------------ XRootDStatus Socket::TlsHandShake( AsyncSocketHandler *socketHandler, - const std::string &thehost ) + const std::string &thehost ) { try { + if( !pServerAddr ) return XRootDStatus( stError, errInvalidOp ); if( !pTls ) pTls.reset( new Tls( this, socketHandler ) ); - return pTls->Connect( thehost, &pServerAddr ); + return pTls->Connect( thehost, pServerAddr.get() ); } catch( std::exception& ex ) { diff --git a/src/XrdCl/XrdClSocket.hh b/src/XrdCl/XrdClSocket.hh index c29511f0326..86b85212c9b 100644 --- a/src/XrdCl/XrdClSocket.hh +++ b/src/XrdCl/XrdClSocket.hh @@ -212,9 +212,9 @@ namespace XrdCl //------------------------------------------------------------------------ //! Get the server address //------------------------------------------------------------------------ - const XrdNetAddr &GetServerAddress() const + const XrdNetAddr* GetServerAddress() const { - return pServerAddr; + return pServerAddr.get(); } //------------------------------------------------------------------------ @@ -302,17 +302,17 @@ namespace XrdCl XRootDStatus Poll( bool readyForReading, bool readyForWriting, int32_t timeout ); - int pSocket; - SocketStatus pStatus; - XrdNetAddr pServerAddr; - mutable std::string pSockName; // mutable because it's for caching - mutable std::string pPeerName; - mutable std::string pName; - int pProtocolFamily; - AnyObject *pChannelID; - bool pCorked; - - std::unique_ptr pTls; + int pSocket; + SocketStatus pStatus; + std::unique_ptr pServerAddr; + mutable std::string pSockName; // mutable because it's for caching + mutable std::string pPeerName; + mutable std::string pName; + int pProtocolFamily; + AnyObject *pChannelID; + bool pCorked; + + std::unique_ptr pTls; }; }