From 610c29d0d9f288ab5dc871c41874becd7adb9c7d Mon Sep 17 00:00:00 2001 From: Brian Bockelman Date: Fri, 27 Jul 2018 21:36:29 -0500 Subject: [PATCH 1/2] Update the throttle plugin to propogate underlying errors. Make sure to always set the error member appropriately whenever something besides SFS_OK is returned. --- src/XrdThrottle/XrdThrottleFile.cc | 48 ++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/XrdThrottle/XrdThrottleFile.cc b/src/XrdThrottle/XrdThrottleFile.cc index f0c252ebb67..cca1bbde515 100644 --- a/src/XrdThrottle/XrdThrottleFile.cc +++ b/src/XrdThrottle/XrdThrottleFile.cc @@ -21,6 +21,30 @@ DO_LOADSHED \ m_throttle.Apply(amount, 1, m_uid); \ XrdThrottleTimer xtimer = m_throttle.StartIOTimer(); +class ErrorSentry +{ +public: + ErrorSentry(XrdOucErrInfo &dst_err, XrdOucErrInfo &src_err) + : m_dst_err(dst_err), m_src_err(src_err) + {} + + ~ErrorSentry() + { + if (m_src_err.getErrInfo()) + { + m_dst_err = m_src_err;; + } + else + { + m_dst_err.Reset(); + } + } + +private: + XrdOucErrInfo &m_dst_err; + XrdOucErrInfo &m_src_err; +}; + File::File(const char *user, int monid, unique_sfs_ptr sfs, @@ -49,12 +73,14 @@ File::open(const char *fileName, { m_uid = XrdThrottleManager::GetUid(client->name); m_throttle.PrepLoadShed(opaque, m_loadshed); + ErrorSentry sentry(error, m_sfs->error); return m_sfs->open(fileName, openMode, createMode, client, opaque); } int File::close() { + ErrorSentry sentry(error, m_sfs->error); return m_sfs->close(); } @@ -63,20 +89,27 @@ File::fctl(const int cmd, const char *args, XrdOucErrInfo &out_error) { + ErrorSentry sentry(error, m_sfs->error); // Disable sendfile - if (cmd == SFS_FCTL_GETFD) return SFS_ERROR; + if (cmd == SFS_FCTL_GETFD) + { + error.setErrInfo(ENOTSUP, "Sendfile not supported by throttle plugin."); + return SFS_ERROR; + } else return m_sfs->fctl(cmd, args, out_error); } const char * File::FName() { + ErrorSentry sentry(error, m_sfs->error); return m_sfs->FName(); } int File::getMmap(void **Addr, off_t &Size) { // We cannot monitor mmap-based reads, so we disable them. + error.setErrInfo(ENOTSUP, "Mmap not supported by throttle plugin."); return SFS_ERROR; } @@ -85,6 +118,7 @@ File::read(XrdSfsFileOffset fileOffset, XrdSfsXferSize amount) { DO_THROTTLE(amount) + ErrorSentry sentry(error, m_sfs->error); return m_sfs->read(fileOffset, amount); } @@ -94,6 +128,7 @@ File::read(XrdSfsFileOffset fileOffset, XrdSfsXferSize buffer_size) { DO_THROTTLE(buffer_size); + ErrorSentry sentry(error, m_sfs->error); return m_sfs->read(fileOffset, buffer, buffer_size); } @@ -104,6 +139,7 @@ File::read(XrdSfsAio *aioparm) (char *)aioparm->sfsAio.aio_buf, (XrdSfsXferSize)aioparm->sfsAio.aio_nbytes); aioparm->doneRead(); + ErrorSentry sentry(error, m_sfs->error); return SFS_OK; } @@ -113,6 +149,7 @@ File::write( XrdSfsFileOffset fileOffset, XrdSfsXferSize buffer_size) { DO_THROTTLE(buffer_size); + ErrorSentry sentry(error, m_sfs->error); return m_sfs->write(fileOffset, buffer, buffer_size); } @@ -123,14 +160,14 @@ File::write(XrdSfsAio *aioparm) (char *)aioparm->sfsAio.aio_buf, (XrdSfsXferSize)aioparm->sfsAio.aio_nbytes); aioparm->doneRead(); + ErrorSentry sentry(error, m_sfs->error); return SFS_OK; - - return m_sfs->write(aioparm); } int File::sync() { + ErrorSentry sentry(error, m_sfs->error); return m_sfs->sync(); } @@ -139,24 +176,28 @@ File::sync(XrdSfsAio *aiop) { aiop->Result = this->sync(); aiop->doneWrite(); + ErrorSentry sentry(error, m_sfs->error); return m_sfs->sync(aiop); } int File::stat(struct stat *buf) { + ErrorSentry sentry(error, m_sfs->error); return m_sfs->stat(buf); } int File::truncate(XrdSfsFileOffset fileOffset) { + ErrorSentry sentry(error, m_sfs->error); return m_sfs->truncate(fileOffset); } int File::getCXinfo(char cxtype[4], int &cxrsz) { + ErrorSentry sentry(error, m_sfs->error); return m_sfs->getCXinfo(cxtype, cxrsz); } @@ -165,6 +206,7 @@ File::SendData(XrdSfsDio *sfDio, XrdSfsFileOffset offset, XrdSfsXferSize size) { + ErrorSentry sentry(error, m_sfs->error); DO_THROTTLE(size); return m_sfs->SendData(sfDio, offset, size); } From 1048181d881afcb546b08a1e3b6808dff6e29793 Mon Sep 17 00:00:00 2001 From: Brian Bockelman Date: Mon, 30 Jul 2018 09:25:48 -0500 Subject: [PATCH 2/2] Copy forward the callback object and user capabilities. --- src/XrdThrottle/XrdThrottleFile.cc | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/XrdThrottle/XrdThrottleFile.cc b/src/XrdThrottle/XrdThrottleFile.cc index cca1bbde515..f55e2e30a8c 100644 --- a/src/XrdThrottle/XrdThrottleFile.cc +++ b/src/XrdThrottle/XrdThrottleFile.cc @@ -24,15 +24,24 @@ XrdThrottleTimer xtimer = m_throttle.StartIOTimer(); class ErrorSentry { public: - ErrorSentry(XrdOucErrInfo &dst_err, XrdOucErrInfo &src_err) + ErrorSentry(XrdOucErrInfo &dst_err, XrdOucErrInfo &src_err, bool forOpen=false) : m_dst_err(dst_err), m_src_err(src_err) - {} + { + unsigned long long cbArg; + XrdOucEICB *cbVal = dst_err.getErrCB(cbArg); + + if (forOpen) + { + src_err.setUCap(dst_err.getUCap()); + } + src_err.setErrCB(cbVal, cbArg); + } ~ErrorSentry() { if (m_src_err.getErrInfo()) { - m_dst_err = m_src_err;; + m_dst_err = m_src_err; } else { @@ -73,7 +82,7 @@ File::open(const char *fileName, { m_uid = XrdThrottleManager::GetUid(client->name); m_throttle.PrepLoadShed(opaque, m_loadshed); - ErrorSentry sentry(error, m_sfs->error); + ErrorSentry sentry(error, m_sfs->error, true); return m_sfs->open(fileName, openMode, createMode, client, opaque); }