From 0d5bf498fc04628c08dc0549821a8cced9a505fb Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Mon, 16 Dec 2013 12:16:23 +0100 Subject: [PATCH 01/18] [XrdCl] Use auto_ptr in C++03 and unique_ptr in C++11 --- src/XrdCl/XrdClCheckSumManager.cc | 4 +++- src/XrdCl/XrdClClassicCopyJob.cc | 6 +++--- src/XrdCl/XrdClFileStateHandler.cc | 6 ++++-- src/XrdCl/XrdClMessageUtils.hh | 8 +++++--- src/XrdCl/XrdClUglyHacks.hh | 6 ++++++ src/XrdCl/XrdClXRootDMsgHandler.cc | 9 +++++---- 6 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/XrdCl/XrdClCheckSumManager.cc b/src/XrdCl/XrdClCheckSumManager.cc index 3a71c768d65..afdaaa97d03 100644 --- a/src/XrdCl/XrdClCheckSumManager.cc +++ b/src/XrdCl/XrdClCheckSumManager.cc @@ -21,6 +21,8 @@ #include "XrdCl/XrdClUtils.hh" #include "XrdCl/XrdClDefaultEnv.hh" #include "XrdCl/XrdClConstants.hh" +#include "XrdCl/XrdClUglyHacks.hh" +#include "XrdCks/XrdCksCalc.hh" #include "XrdCks/XrdCksLoader.hh" #include "XrdCks/XrdCksCalc.hh" #include "XrdCks/XrdCksCalcmd5.hh" @@ -108,7 +110,7 @@ namespace XrdCl algName.c_str() ); return false; } - std::auto_ptr calcPtr( calc ); + XRDCL_SMART_PTR_T calcPtr( calc ); //-------------------------------------------------------------------------- // Open the file diff --git a/src/XrdCl/XrdClClassicCopyJob.cc b/src/XrdCl/XrdClClassicCopyJob.cc index 72572043b3c..898606ae2c9 100644 --- a/src/XrdCl/XrdClClassicCopyJob.cc +++ b/src/XrdCl/XrdClClassicCopyJob.cc @@ -579,7 +579,7 @@ namespace if( pChunks.empty() ) return XRootDStatus( stOK, suDone ); - std::auto_ptr ch( pChunks.front() ); + XRDCL_SMART_PTR_T ch( pChunks.front() ); pChunks.pop(); ch->sem->Wait(); @@ -993,7 +993,7 @@ namespace XrdCl //-------------------------------------------------------------------------- // Initialize the source and the destination //-------------------------------------------------------------------------- - std::auto_ptr src; + XRDCL_SMART_PTR_T src; if( pJob->source.GetProtocol() == "file" ) src.reset( new LocalSource( &pJob->source ) ); else if( pJob->source.GetProtocol() == "stdio" ) @@ -1006,7 +1006,7 @@ namespace XrdCl XRootDStatus st = src->Initialize(); if( !st.IsOK() ) return st; - std::auto_ptr dest; + XRDCL_SMART_PTR_T dest; URL newDestUrl( pJob->target ); if( pJob->target.GetProtocol() == "file" ) diff --git a/src/XrdCl/XrdClFileStateHandler.cc b/src/XrdCl/XrdClFileStateHandler.cc index 4f3a4400907..d35b184f4a4 100644 --- a/src/XrdCl/XrdClFileStateHandler.cc +++ b/src/XrdCl/XrdClFileStateHandler.cc @@ -30,8 +30,10 @@ #include "XrdCl/XrdClFileTimer.hh" #include "XrdCl/XrdClResponseJob.hh" #include "XrdCl/XrdClJobManager.hh" +#include "XrdCl/XrdClUglyHacks.hh" #include +#include #include namespace @@ -179,8 +181,8 @@ namespace XrdCl::HostList *hostList ) { using namespace XrdCl; - std::auto_ptr statusPtr( status ); - std::auto_ptr responsePtr( response ); + XRDCL_SMART_PTR_T statusPtr( status ); + XRDCL_SMART_PTR_T responsePtr( response ); pSendParams.hostList = hostList; //---------------------------------------------------------------------- diff --git a/src/XrdCl/XrdClMessageUtils.hh b/src/XrdCl/XrdClMessageUtils.hh index 18641a67e78..001693e872c 100644 --- a/src/XrdCl/XrdClMessageUtils.hh +++ b/src/XrdCl/XrdClMessageUtils.hh @@ -23,7 +23,6 @@ #include "XrdCl/XrdClURL.hh" #include "XrdCl/XrdClMessage.hh" #include "XrdCl/XrdClUglyHacks.hh" -#include namespace XrdCl { @@ -134,19 +133,22 @@ namespace XrdCl { handler->WaitForResponse(); - std::auto_ptr resp( handler->GetResponse() ); + AnyObject *resp = handler->GetResponse(); XRootDStatus *status = handler->GetStatus(); XRootDStatus ret( *status ); delete status; if( ret.IsOK() ) { - if( !resp.get() ) + if( resp ) return XRootDStatus( stError, errInternal ); resp->Get( response ); resp->Set( (int *)0 ); if( !response ) + { + delete resp; return XRootDStatus( stError, errInternal ); + } } return ret; diff --git a/src/XrdCl/XrdClUglyHacks.hh b/src/XrdCl/XrdClUglyHacks.hh index 38ea7663fd6..610841ef4fc 100644 --- a/src/XrdCl/XrdClUglyHacks.hh +++ b/src/XrdCl/XrdClUglyHacks.hh @@ -36,6 +36,12 @@ namespace XrdCl typedef XrdSysSemaphore Semaphore; #endif +#if __cplusplus >= 201103L +#define XRDCL_SMART_PTR_T std::unique_ptr +#else +#define XRDCL_SMART_PTR_T std::auto_ptr +#endif + } #endif // __XRD_CL_UGLY_HACKS_HH__ diff --git a/src/XrdCl/XrdClXRootDMsgHandler.cc b/src/XrdCl/XrdClXRootDMsgHandler.cc index 73f22e0dff0..b12ada389d0 100644 --- a/src/XrdCl/XrdClXRootDMsgHandler.cc +++ b/src/XrdCl/XrdClXRootDMsgHandler.cc @@ -23,6 +23,7 @@ #include "XrdCl/XrdClXRootDTransport.hh" #include "XrdCl/XrdClMessage.hh" #include "XrdCl/XrdClURL.hh" +#include "XrdCl/XrdClUglyHacks.hh" #include "XrdCl/XrdClUtils.hh" #include "XrdCl/XrdClTaskManager.hh" #include "XrdCl/XrdClSIDManager.hh" @@ -313,7 +314,7 @@ namespace XrdCl //------------------------------------------------------------------------ case kXR_redirect: { - std::auto_ptr msgPtr( pResponse ); + XRDCL_SMART_PTR_T msgPtr( pResponse ); pResponse = 0; if( rsp->hdr.dlen < 4 ) @@ -443,7 +444,7 @@ namespace XrdCl //------------------------------------------------------------------------ case kXR_wait: { - std::auto_ptr msgPtr( pResponse ); + XRDCL_SMART_PTR_T msgPtr( pResponse ); pResponse = 0; uint32_t waitSeconds = 0; @@ -493,7 +494,7 @@ namespace XrdCl //------------------------------------------------------------------------ case kXR_waitresp: { - std::auto_ptr msgPtr( pResponse ); + XRDCL_SMART_PTR_T msgPtr( pResponse ); pResponse = 0; if( rsp->hdr.dlen < 4 ) @@ -517,7 +518,7 @@ namespace XrdCl //------------------------------------------------------------------------ default: { - std::auto_ptr msgPtr( pResponse ); + XRDCL_SMART_PTR_T msgPtr( pResponse ); pResponse = 0; log->Dump( XRootDMsg, "[%s] Got unrecognized response %d to " "message %s", pUrl.GetHostId().c_str(), From 1b51ada041c82ac579b2dacaf8e73e67a255b6cf Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Mon, 16 Dec 2013 11:52:34 -0500 Subject: [PATCH 02/18] Fix C++11 narrowing issues --- src/XrdCms/XrdCmsManager.cc | 2 +- src/XrdCms/XrdCmsTalk.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/XrdCms/XrdCmsManager.cc b/src/XrdCms/XrdCmsManager.cc index 6a199e39767..44e35bb3b28 100644 --- a/src/XrdCms/XrdCmsManager.cc +++ b/src/XrdCms/XrdCmsManager.cc @@ -167,7 +167,7 @@ void XrdCmsManager::Inform(const char *What, struct iovec *vP, int vN, int vT) void XrdCmsManager::Inform(XrdCms::CmsReqCode rCode, int rMod, const char *Arg, int Alen) { - CmsRRHdr Hdr = {0, rCode, (kXR_char)rMod, + CmsRRHdr Hdr = {0, static_cast(rCode), (kXR_char)rMod, htons(static_cast(Alen))}; struct iovec ioV[2] = {{(char *)&Hdr, sizeof(Hdr)}, {(char *)Arg, (size_t)Alen}}; diff --git a/src/XrdCms/XrdCmsTalk.cc b/src/XrdCms/XrdCmsTalk.cc index 599637ef252..ee5b2c46c09 100644 --- a/src/XrdCms/XrdCmsTalk.cc +++ b/src/XrdCms/XrdCmsTalk.cc @@ -119,7 +119,7 @@ const char *XrdCmsTalk::Respond(XrdLink *Link, XrdCms::CmsRspCode rcode, char *buff, int blen) { static const unsigned short ovhd = sizeof(kXR_unt32); - CmsResponse Resp = {{0, rcode, 0, + CmsResponse Resp = {{0, static_cast(rcode), 0, htons(static_cast(blen+ovhd))}, 0}; struct iovec ioV[2] = {{(char *)&Resp, sizeof(Resp)}, { buff, (size_t)blen}}; From 1361c481f2560c18195b6afe8cedaac435d67db0 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Mon, 16 Dec 2013 11:53:47 -0500 Subject: [PATCH 03/18] Change link interface definitions according to policy CMP0022 --- src/XrdCl/CMakeLists.txt | 2 ++ src/XrdClient.cmake | 1 + src/XrdCrypto.cmake | 3 +++ src/XrdFfs.cmake | 1 + src/XrdOfs.cmake | 1 + src/XrdPlugins.cmake | 2 ++ src/XrdPosix.cmake | 2 ++ src/XrdSec.cmake | 4 ++++ src/XrdSecgsi.cmake | 4 ++++ src/XrdSeckrb5.cmake | 1 + src/XrdServer.cmake | 2 ++ src/XrdUtils.cmake | 2 ++ 12 files changed, 25 insertions(+) diff --git a/src/XrdCl/CMakeLists.txt b/src/XrdCl/CMakeLists.txt index 14003648a8b..4fda8370222 100644 --- a/src/XrdCl/CMakeLists.txt +++ b/src/XrdCl/CMakeLists.txt @@ -79,6 +79,8 @@ target_link_libraries( set_target_properties( XrdCl PROPERTIES + INTERFACE_LINK_LIBRARIES "" + LINK_INTERFACE_LIBRARIES "" VERSION ${XRD_CL_VERSION} SOVERSION ${XRD_CL_SOVERSION} ) diff --git a/src/XrdClient.cmake b/src/XrdClient.cmake index 7710f5f5462..4b2a751b74b 100644 --- a/src/XrdClient.cmake +++ b/src/XrdClient.cmake @@ -50,6 +50,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_CLIENT_VERSION} SOVERSION ${XRD_CLIENT_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- diff --git a/src/XrdCrypto.cmake b/src/XrdCrypto.cmake index c0fe39b561b..6016bc64bf9 100644 --- a/src/XrdCrypto.cmake +++ b/src/XrdCrypto.cmake @@ -45,6 +45,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_CRYPTO_VERSION} SOVERSION ${XRD_CRYPTO_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -72,6 +73,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_CRYPTO_LITE_VERSION} SOVERSION ${XRD_CRYPTO_LITE_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -107,6 +109,7 @@ if( BUILD_CRYPTO ) PROPERTIES VERSION ${XRD_CRYPTO_SSL_VERSION} SOVERSION ${XRD_CRYPTO_SSL_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) endif() diff --git a/src/XrdFfs.cmake b/src/XrdFfs.cmake index 0fd92426063..1b5f824a573 100644 --- a/src/XrdFfs.cmake +++ b/src/XrdFfs.cmake @@ -33,6 +33,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_FFS_VERSION} SOVERSION ${XRD_FFS_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- diff --git a/src/XrdOfs.cmake b/src/XrdOfs.cmake index 5b75b569402..d6a657971eb 100644 --- a/src/XrdOfs.cmake +++ b/src/XrdOfs.cmake @@ -48,6 +48,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_OFS_VERSION} SOVERSION ${XRD_OFS_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- diff --git a/src/XrdPlugins.cmake b/src/XrdPlugins.cmake index ab87081e432..a0f629e4724 100644 --- a/src/XrdPlugins.cmake +++ b/src/XrdPlugins.cmake @@ -31,6 +31,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_PSS_VERSION} SOVERSION ${XRD_PSS_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -58,6 +59,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_BWM_VERSION} SOVERSION ${XRD_BWM_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- diff --git a/src/XrdPosix.cmake b/src/XrdPosix.cmake index e24b18fddd2..6f390025d40 100644 --- a/src/XrdPosix.cmake +++ b/src/XrdPosix.cmake @@ -36,6 +36,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_POSIX_VERSION} SOVERSION ${XRD_POSIX_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -61,6 +62,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_POSIX_PRELOAD_VERSION} SOVERSION ${XRD_POSIX_PRELOAD_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- diff --git a/src/XrdSec.cmake b/src/XrdSec.cmake index d82dfc044c9..51baf81a32d 100644 --- a/src/XrdSec.cmake +++ b/src/XrdSec.cmake @@ -40,6 +40,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SEC_VERSION} SOVERSION ${XRD_SEC_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) # FIXME: test @@ -67,6 +68,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SEC_PWD_VERSION} SOVERSION ${XRD_SEC_PWD_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -102,6 +104,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SEC_SSS_VERSION} SOVERSION ${XRD_SEC_SSS_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -133,6 +136,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SEC_UNIX_VERSION} SOVERSION ${XRD_SEC_UNIX_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- diff --git a/src/XrdSecgsi.cmake b/src/XrdSecgsi.cmake index 61f6aabe7d0..5b616a0de6f 100644 --- a/src/XrdSecgsi.cmake +++ b/src/XrdSecgsi.cmake @@ -37,6 +37,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SEC_GSI_VERSION} SOVERSION ${XRD_SEC_GSI_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -56,6 +57,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SEC_GSI_GMAPLDAP_VERSION} SOVERSION ${XRD_SEC_GSI_GMAPLDAP_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -75,6 +77,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SEC_GSI_AUTHZVO_VERSION} SOVERSION ${XRD_SEC_GSI_AUTHZVO_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -95,6 +98,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SEC_GSI_GMAPDN_VERSION} SOVERSION ${XRD_SEC_GSI_GMAPDN_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- diff --git a/src/XrdSeckrb5.cmake b/src/XrdSeckrb5.cmake index 498f87d1c8f..fd4a37f4f62 100644 --- a/src/XrdSeckrb5.cmake +++ b/src/XrdSeckrb5.cmake @@ -25,6 +25,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SEC_KRB5_VERSION} SOVERSION ${XRD_SEC_KRB5_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- diff --git a/src/XrdServer.cmake b/src/XrdServer.cmake index b790d867bef..5eb47a4e945 100644 --- a/src/XrdServer.cmake +++ b/src/XrdServer.cmake @@ -109,6 +109,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_SERVER_VERSION} SOVERSION ${XRD_SERVER_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -162,6 +163,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_XROOTD_VERSION} SOVERSION ${XRD_XROOTD_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- diff --git a/src/XrdUtils.cmake b/src/XrdUtils.cmake index 765b772199d..356a975d470 100644 --- a/src/XrdUtils.cmake +++ b/src/XrdUtils.cmake @@ -177,6 +177,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_UTILS_VERSION} SOVERSION ${XRD_UTILS_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- @@ -197,6 +198,7 @@ set_target_properties( PROPERTIES VERSION ${XRD_ZCRC32_VERSION} SOVERSION ${XRD_ZCRC32_SOVERSION} + INTERFACE_LINK_LIBRARIES "" LINK_INTERFACE_LIBRARIES "" ) #------------------------------------------------------------------------------- From 90e0f971d45e5f24592c792b3b4651b9ccb11314 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Mon, 16 Dec 2013 12:12:52 -0500 Subject: [PATCH 04/18] Make it possible to build in C++11 mode and with clang --- packaging/rhel/xrootd.spec.in | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/packaging/rhel/xrootd.spec.in b/packaging/rhel/xrootd.spec.in index 34154a7d0ba..68f4f9739ff 100644 --- a/packaging/rhel/xrootd.spec.in +++ b/packaging/rhel/xrootd.spec.in @@ -4,7 +4,7 @@ Name: xrootd Epoch: 1 Version: __VERSION__ -Release: __RELEASE__%{?dist} +Release: __RELEASE__%{?dist}%{?_with_cpp11:.cpp11}%{?_with_clang:.clang} Summary: Extended ROOT file server Group: System Environment/Daemons License: LGPL @@ -37,6 +37,10 @@ BuildRequires: graphviz BuildRequires: graphviz-gd %endif +%if %{?_with_clang:1}%{!?_with_clang:0} +BuildRequires: clang +%endif + Requires: %{name}-libs = %{epoch}:%{version}-%{release} Requires: %{name}-client-libs = %{epoch}:%{version}-%{release} Requires: %{name}-server-libs = %{epoch}:%{version}-%{release} @@ -225,6 +229,15 @@ cd %{name} mkdir build cd build +%if %{?_with_cpp11:1}%{!?_with_cpp11:0} +export CXXFLAGS=-std=c++11 +%endif + +%if %{?_with_clang:1}%{!?_with_clang:0} +export CC=clang +export CXX=clang++ +%endif + %if %{?_with_tests:1}%{!?_with_tests:0} cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_TESTS=TRUE ../ %else @@ -515,7 +528,7 @@ exit 0 * Fri Oct 21 2011 Lukasz Janyst 3.1.0-1 - bump the version to 3.1.0 -* Tue Apr 11 2011 Lukasz Janyst 3.0.3-1 +* Mon Apr 11 2011 Lukasz Janyst 3.0.3-1 - the first RPM release - version 3.0.3 - the detailed release notes are available at: http://xrootd.org/download/ReleaseNotes.html From af851c41eaae6e9dc7d5f96a52ba43dc43e94ffe Mon Sep 17 00:00:00 2001 From: Andrew Hanushevsky Date: Mon, 16 Dec 2013 17:27:18 -0800 Subject: [PATCH 05/18] Preferentially use c-style reinterpret cast for consistency. --- src/XrdCms/XrdCmsManager.cc | 2 +- src/XrdCms/XrdCmsTalk.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/XrdCms/XrdCmsManager.cc b/src/XrdCms/XrdCmsManager.cc index 44e35bb3b28..abf0fdd4c88 100644 --- a/src/XrdCms/XrdCmsManager.cc +++ b/src/XrdCms/XrdCmsManager.cc @@ -167,7 +167,7 @@ void XrdCmsManager::Inform(const char *What, struct iovec *vP, int vN, int vT) void XrdCmsManager::Inform(XrdCms::CmsReqCode rCode, int rMod, const char *Arg, int Alen) { - CmsRRHdr Hdr = {0, static_cast(rCode), (kXR_char)rMod, + CmsRRHdr Hdr = {0, (kXR_char)rCode, (kXR_char)rMod, htons(static_cast(Alen))}; struct iovec ioV[2] = {{(char *)&Hdr, sizeof(Hdr)}, {(char *)Arg, (size_t)Alen}}; diff --git a/src/XrdCms/XrdCmsTalk.cc b/src/XrdCms/XrdCmsTalk.cc index ee5b2c46c09..7e4f41de66f 100644 --- a/src/XrdCms/XrdCmsTalk.cc +++ b/src/XrdCms/XrdCmsTalk.cc @@ -119,7 +119,7 @@ const char *XrdCmsTalk::Respond(XrdLink *Link, XrdCms::CmsRspCode rcode, char *buff, int blen) { static const unsigned short ovhd = sizeof(kXR_unt32); - CmsResponse Resp = {{0, static_cast(rcode), 0, + CmsResponse Resp = {{0, (kXR_char)rcode, 0, htons(static_cast(blen+ovhd))}, 0}; struct iovec ioV[2] = {{(char *)&Resp, sizeof(Resp)}, { buff, (size_t)blen}}; From f445da271652833c787e268d4bde7238e8cf9049 Mon Sep 17 00:00:00 2001 From: Andrew Hanushevsky Date: Mon, 16 Dec 2013 18:17:31 -0800 Subject: [PATCH 06/18] Make sure pings get sent even when a manager is busy with non-response activity. This prevents mysterious server disc/recon events. --- src/XrdCms/XrdCmsConfig.cc | 30 +++++++++++++++++++++++++++++- src/XrdCms/XrdCmsConfig.hh | 1 + src/XrdCms/XrdCmsProtocol.cc | 17 ++++++++++++++--- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/XrdCms/XrdCmsConfig.cc b/src/XrdCms/XrdCmsConfig.cc index a04d3cd4f56..ba845e6b0ad 100644 --- a/src/XrdCms/XrdCmsConfig.cc +++ b/src/XrdCms/XrdCmsConfig.cc @@ -164,6 +164,29 @@ void *XrdCmsStartSupervising(void *carg) return (void *)0; } +/******************************************************************************/ +/* P i n g C l o c k H a n d l e r */ +/******************************************************************************/ + +namespace XrdCms +{ + +class PingClock : XrdJob +{ +public: + + void DoIt() {Config.PingTick++; + Sched->Schedule((XrdJob *)this,time(0)+Config.AskPing); + } + +static void Start() {static PingClock selfie;} + + PingClock() : XrdJob("ping clock") {DoIt();} + ~PingClock() {} +private: +}; +}; + /******************************************************************************/ /* d e f i n e s */ /******************************************************************************/ @@ -547,6 +570,10 @@ void XrdCmsConfig::DoIt() } } +// Start the ping clock if we are a manager of any kind +// + if (isManager) PingClock::Start(); + // Start the admin thread if we need to, we will not continue until told // to do so by the admin interface. // @@ -660,6 +687,7 @@ void XrdCmsConfig::ConfigDefaults(void) P_pag = 0; AskPerf = 10; // Every 10 pings AskPing = 60; // Every 1 minute + PingTick = 0; MaxDelay = -1; LogPerf = 10; // Every 10 usage requests DiskMin = 10240; // 10GB*1024 (Min partition space) in MB @@ -2073,7 +2101,7 @@ int XrdCmsConfig::xping(XrdSysError *eDest, XrdOucStream &CFile) if (!(val = CFile.GetWord())) {eDest->Emsg("Config", "ping value not specified"); return 1;} if (XrdOuca2x::a2tm(*eDest, "ping interval",val,&ping,0)) return 1; - + if (ping < 3) ping = 3; while((val = CFile.GetWord())) { if (!strcmp("log", val)) diff --git a/src/XrdCms/XrdCmsConfig.hh b/src/XrdCms/XrdCmsConfig.hh index c80245ee529..65f71742bdd 100644 --- a/src/XrdCms/XrdCmsConfig.hh +++ b/src/XrdCms/XrdCmsConfig.hh @@ -87,6 +87,7 @@ int RefReset; // Min seconds before a global ref count reset int RefTurn; // Min references before a global ref count reset int AskPerf; // Seconds between perf queries int AskPing; // Number of ping requests per AskPerf window +int PingTick; // Ping clock value int LogPerf; // AskPerf intervals before logging perf int PortTCP; // TCP Port to listen on diff --git a/src/XrdCms/XrdCmsProtocol.cc b/src/XrdCms/XrdCmsProtocol.cc index fa972b8284b..3a73b2b962b 100644 --- a/src/XrdCms/XrdCmsProtocol.cc +++ b/src/XrdCms/XrdCmsProtocol.cc @@ -790,7 +790,7 @@ const char *XrdCmsProtocol::Dispatch(Bearing cDir, int maxWait, int maxTries) : "server not responding"); const char *myArgs, *myArgt; char buff[8]; - int rc, toLeft = maxTries; + int rc, toLeft = maxTries, lastPing = Config.PingTick; // Dispatch runs with the current thread bound to the link. // @@ -801,11 +801,22 @@ const char *XrdCmsProtocol::Dispatch(Bearing cDir, int maxWait, int maxTries) do{if ((rc = Link->RecvAll((char *)&Data->Request, ReqSize, maxWait)) < 0) {if (rc != -ETIMEDOUT) return "request read failed"; if (!toLeft--) return toRC; - if (cDir == isDown && Link->Send((char *)&Ping, sizeof(Ping)) < 0) - return "server unreachable"; + if (cDir == isDown) + {if (Link->Send((char *)&Ping, sizeof(Ping)) < 0) + return "server unreachable"; + lastPing = Config.PingTick; + } continue; } +// Check if we need to ping as non-response activity may cause ping misses +// + if (cDir == isDown && lastPing != Config.PingTick) + {if (Link->Send((char *)&Ping, sizeof(Ping)) < 0) + return "server unreachable"; + lastPing = Config.PingTick; + } + // Decode the length and get the rest of the data // toLeft = maxTries; From 9e0a03490ca31c924b2759b87adcbc66292cb33f Mon Sep 17 00:00:00 2001 From: Andrew Hanushevsky Date: Mon, 16 Dec 2013 18:22:02 -0800 Subject: [PATCH 07/18] Update notes on ping patch. --- docs/PreReleaseNotes.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/PreReleaseNotes.txt b/docs/PreReleaseNotes.txt index a6e3b8dc712..3c94e9620ab 100644 --- a/docs/PreReleaseNotes.txt +++ b/docs/PreReleaseNotes.txt @@ -189,6 +189,8 @@ Prerelease Notes * Properly recognize a loaded checksum as a native checksum. + **Miscellaneous** + * Prevent constant server disc/recon events when a manager is busy + doing non-response activity on behalf of the server. * Add a generic control method to the file/dir and system classes. OSS plugin writers need only to recompile as a default is provided. * Allow SendData() to send less than the amount of bytes requested. From f8556d6049675f7cdcd02f0e298061e0d42fbf64 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Wed, 18 Dec 2013 09:43:27 +0100 Subject: [PATCH 08/18] [XrdCl] Correct logic mistake introduced when getting rid of std::auto_ptrs --- src/XrdCl/XrdClMessageUtils.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/XrdCl/XrdClMessageUtils.hh b/src/XrdCl/XrdClMessageUtils.hh index 001693e872c..d12d01cc314 100644 --- a/src/XrdCl/XrdClMessageUtils.hh +++ b/src/XrdCl/XrdClMessageUtils.hh @@ -140,7 +140,7 @@ namespace XrdCl if( ret.IsOK() ) { - if( resp ) + if( !resp ) return XRootDStatus( stError, errInternal ); resp->Get( response ); resp->Set( (int *)0 ); From 942c8fa177d16736d0f862657d3e3accf0df3cd7 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Wed, 18 Dec 2013 14:39:34 +0100 Subject: [PATCH 09/18] [RPM] Use 'make -i' while building --- packaging/rhel/xrootd.spec.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/rhel/xrootd.spec.in b/packaging/rhel/xrootd.spec.in index 68f4f9739ff..ce8ef1b78e0 100644 --- a/packaging/rhel/xrootd.spec.in +++ b/packaging/rhel/xrootd.spec.in @@ -244,7 +244,7 @@ cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_TES cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo ../ %endif -make VERBOSE=1 %{?_smp_mflags} +make -i VERBOSE=1 %{?_smp_mflags} cd .. doxygen Doxyfile From fd628051880e3301d86a0df503a45577c28657a8 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Wed, 18 Dec 2013 15:20:22 +0100 Subject: [PATCH 10/18] [XrdCl] Fix a memory leak when determining the country code --- src/XrdCl/XrdClXRootDTransport.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/XrdCl/XrdClXRootDTransport.cc b/src/XrdCl/XrdClXRootDTransport.cc index 2feba3e56e5..4edfe11e0b3 100644 --- a/src/XrdCl/XrdClXRootDTransport.cc +++ b/src/XrdCl/XrdClXRootDTransport.cc @@ -1061,7 +1061,9 @@ namespace XrdCl // Compute the login cgi //-------------------------------------------------------------------------- int timeZone = XrdSysTimer::TimeZone(); - std::string countryCode = Utils::FQDNToCC( XrdNetUtils::MyHostName() ); + char *hostName = XrdNetUtils::MyHostName(); + std::string countryCode = Utils::FQDNToCC( hostName ); + free( hostName ); char *cgiBuffer = new char[1024]; snprintf( cgiBuffer, 1024, "?xrd.cc=%s&xrd.tz=%d", countryCode.c_str(), timeZone ); From ccfd887da9737c2250cf2469aed7f9519fffc6f7 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Wed, 18 Dec 2013 15:21:02 +0100 Subject: [PATCH 11/18] [XrdCl] Send applicaton name during login --- src/XrdCl/XrdClXRootDTransport.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/XrdCl/XrdClXRootDTransport.cc b/src/XrdCl/XrdClXRootDTransport.cc index 4edfe11e0b3..45d5308a903 100644 --- a/src/XrdCl/XrdClXRootDTransport.cc +++ b/src/XrdCl/XrdClXRootDTransport.cc @@ -30,7 +30,7 @@ #include "XrdOuc/XrdOucErrInfo.hh" #include "XrdOuc/XrdOucUtils.hh" #include "XrdSys/XrdSysTimer.hh" - +#include "XrdSys/XrdSysUtils.hh" #include #include @@ -1065,8 +1065,8 @@ namespace XrdCl std::string countryCode = Utils::FQDNToCC( hostName ); free( hostName ); char *cgiBuffer = new char[1024]; - snprintf( cgiBuffer, 1024, "?xrd.cc=%s&xrd.tz=%d", countryCode.c_str(), - timeZone ); + snprintf( cgiBuffer, 1024, "?xrd.cc=%s&xrd.tz=%d&xrd.appname=%s", + countryCode.c_str(), timeZone, XrdSysUtils::ExecName() ); uint16_t cgiLen = strlen( cgiBuffer ); //-------------------------------------------------------------------------- From db63e95d64d3e80cf77a64ababc11234ca80be69 Mon Sep 17 00:00:00 2001 From: Lukasz Janyst Date: Wed, 18 Dec 2013 15:21:25 +0100 Subject: [PATCH 12/18] [CMake] Add missing pthread dependency --- src/XrdCl/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/XrdCl/CMakeLists.txt b/src/XrdCl/CMakeLists.txt index 4fda8370222..1be58a9909e 100644 --- a/src/XrdCl/CMakeLists.txt +++ b/src/XrdCl/CMakeLists.txt @@ -94,6 +94,7 @@ add_executable( target_link_libraries( xrdfs + pthread XrdCl ${READLINE_LIBRARY} ${NCURSES_LIBRARY} ) From b135afd8b2706dfc171c9daa958438880ed655b7 Mon Sep 17 00:00:00 2001 From: Andrew Hanushevsky Date: Thu, 9 Jan 2014 14:36:04 -0800 Subject: [PATCH 13/18] Avoid SEGV after an error occurs during a stat() call. --- src/XrdXrootd/XrdXrootdXeq.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/XrdXrootd/XrdXrootdXeq.cc b/src/XrdXrootd/XrdXrootdXeq.cc index 848dee8b6ce..5d171781dd4 100644 --- a/src/XrdXrootd/XrdXrootdXeq.cc +++ b/src/XrdXrootd/XrdXrootdXeq.cc @@ -2295,7 +2295,7 @@ int XrdXrootdProtocol::do_Stat() rc = fp->XrdSfsp->stat(&buf); TRACEP(FS, "stat rc=" < Date: Fri, 10 Jan 2014 13:45:33 +0100 Subject: [PATCH 16/18] Borrow the initialization of XrdCryptossl, in order to share the OpenSSL threading setup --- src/XrdHTTP.cmake | 2 +- src/XrdHTTP/XrdHttpProtocol.cc | 14 +++++++++++++- src/XrdHTTP/XrdHttpProtocol.hh | 4 +++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/XrdHTTP.cmake b/src/XrdHTTP.cmake index 9947d38c572..00b27b33400 100644 --- a/src/XrdHTTP.cmake +++ b/src/XrdHTTP.cmake @@ -20,7 +20,7 @@ set_target_properties(XrdHttp PROPERTIES VERSION "${XRD_HTTP_VERSION}" SOVERSION "${XRD_HTTP_SOVERSION}") -target_link_libraries(XrdHttp XrdMain dl ssl ) +target_link_libraries(XrdHttp XrdMain XrdCrypto dl ssl ) # Install directive. install(TARGETS XrdHttp diff --git a/src/XrdHTTP/XrdHttpProtocol.cc b/src/XrdHTTP/XrdHttpProtocol.cc index 104afd93cc1..258c674496a 100644 --- a/src/XrdHTTP/XrdHttpProtocol.cc +++ b/src/XrdHTTP/XrdHttpProtocol.cc @@ -82,7 +82,7 @@ char *XrdHttpProtocol::secretkey = 0; int XrdHttpProtocol::sslverifydepth = 9; SSL_CTX *XrdHttpProtocol::sslctx = 0; BIO *XrdHttpProtocol::sslbio_err = 0; - +XrdCryptoFactory *XrdHttpProtocol::myCryptoFactory = 0; XrdHttpSecXtractor *XrdHttpProtocol::secxtractor = 0; static const unsigned char *s_server_session_id_context = (const unsigned char *) "XrdHTTPSessionCtx"; @@ -1263,6 +1263,18 @@ int verify_callback(int ok, X509_STORE_CTX * store) { int XrdHttpProtocol::InitSecurity() { +#ifdef HAVE_XRDCRYPTO +#ifndef WIN32 + // Borrow the initialization of XrdCryptossl, in order to share the + // OpenSSL threading bits + if (!(myCryptoFactory = XrdCryptoFactory::GetCryptoFactory("ssl"))) { + cerr << "Cannot instantiate crypto factory ssl" << endl; + exit(1); + } + +#endif +#endif + SSL_library_init(); SSL_load_error_strings(); OpenSSL_add_all_ciphers(); diff --git a/src/XrdHTTP/XrdHttpProtocol.hh b/src/XrdHTTP/XrdHttpProtocol.hh index 86e010a0fcc..336ec836726 100644 --- a/src/XrdHTTP/XrdHttpProtocol.hh +++ b/src/XrdHTTP/XrdHttpProtocol.hh @@ -41,7 +41,7 @@ #include "XrdSys/XrdSysError.hh" #include "XrdSys/XrdSysPthread.hh" #include "XrdSec/XrdSecInterface.hh" - +#include "XrdCrypto/XrdCryptoFactory.hh" #include "Xrd/XrdObject.hh" #include "XrdXrootd/XrdXrootdBridge.hh" #include "XrdOuc/XrdOucStream.hh" @@ -216,6 +216,8 @@ private: /// Flag to tell if the https handshake has finished, in the case of an https /// connection being established bool ssldone; + + static XrdCryptoFactory *myCryptoFactory; protected: From 288cefbac582d1ccdffd23d0075757d673b48428 Mon Sep 17 00:00:00 2001 From: Fabrizio Furano Date: Fri, 17 Jan 2014 11:55:01 +0100 Subject: [PATCH 17/18] Don't link XrdMain Add link properties --- src/XrdHTTP.cmake | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/XrdHTTP.cmake b/src/XrdHTTP.cmake index 00b27b33400..a7dbf3106e9 100644 --- a/src/XrdHTTP.cmake +++ b/src/XrdHTTP.cmake @@ -20,7 +20,15 @@ set_target_properties(XrdHttp PROPERTIES VERSION "${XRD_HTTP_VERSION}" SOVERSION "${XRD_HTTP_SOVERSION}") -target_link_libraries(XrdHttp XrdMain XrdCrypto dl ssl ) +target_link_libraries(XrdHttp XrdServer XrdUtils XrdCrypto dl pthread ssl ) + +set_target_properties( + XrdHttp + PROPERTIES + VERSION ${XRD_HTTP_VERSION} + SOVERSION ${XRD_HTTP_SOVERSION} + INTERFACE_LINK_LIBRARIES "" + LINK_INTERFACE_LIBRARIES "" ) # Install directive. install(TARGETS XrdHttp From 3e76ec052387b603e2b47942121db4693847e3b2 Mon Sep 17 00:00:00 2001 From: Fabrizio Furano Date: Fri, 17 Jan 2014 13:42:46 +0100 Subject: [PATCH 18/18] Add missing link dep --- src/XrdHTTP.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/XrdHTTP.cmake b/src/XrdHTTP.cmake index a7dbf3106e9..06665144fce 100644 --- a/src/XrdHTTP.cmake +++ b/src/XrdHTTP.cmake @@ -20,7 +20,7 @@ set_target_properties(XrdHttp PROPERTIES VERSION "${XRD_HTTP_VERSION}" SOVERSION "${XRD_HTTP_SOVERSION}") -target_link_libraries(XrdHttp XrdServer XrdUtils XrdCrypto dl pthread ssl ) +target_link_libraries(XrdHttp XrdServer XrdXrootd XrdUtils XrdCrypto dl pthread ssl ) set_target_properties( XrdHttp