From 623d314d96de76c49df11ce796d2583d33568bd9 Mon Sep 17 00:00:00 2001 From: Andrew Hanushevsky Date: Tue, 17 Sep 2019 18:11:41 -0700 Subject: [PATCH] [Server] Add plug-in interface for performance reporting. --- src/XrdCms/XrdCmsAdmin.cc | 39 +++++-- src/XrdCms/XrdCmsAdmin.hh | 1 + src/XrdCms/XrdCmsClient.hh | 18 +++- src/XrdCms/XrdCmsClientConfig.cc | 92 +++++++++++++++- src/XrdCms/XrdCmsClientConfig.hh | 21 +++- src/XrdCms/XrdCmsConfig.cc | 127 ++++++---------------- src/XrdCms/XrdCmsConfig.hh | 6 +- src/XrdCms/XrdCmsFinder.cc | 101 +++++++++++++++++- src/XrdCms/XrdCmsFinder.hh | 11 +- src/XrdCms/XrdCmsMeter.cc | 178 ++++++++++++++++++++++++++----- src/XrdCms/XrdCmsMeter.hh | 28 +++-- src/XrdCms/XrdCmsNode.cc | 15 +-- src/XrdCms/XrdCmsPerfMon.hh | 156 +++++++++++++++++++++++++++ src/XrdCms/XrdCmsUtils.cc | 16 +++ src/XrdCms/XrdCmsUtils.hh | 16 +++ src/XrdHeaders.cmake | 1 + src/XrdOuc/XrdOucUtils.cc | 33 ++++++ src/XrdOuc/XrdOucUtils.hh | 3 + src/XrdServer.cmake | 13 +-- src/XrdSsi/XrdSsiClient.cc | 3 +- src/XrdSsi/XrdSsiCluster.hh | 13 +++ src/XrdSsi/XrdSsiCms.hh | 3 + 22 files changed, 724 insertions(+), 170 deletions(-) create mode 100644 src/XrdCms/XrdCmsPerfMon.hh diff --git a/src/XrdCms/XrdCmsAdmin.cc b/src/XrdCms/XrdCmsAdmin.cc index 277af4c0851..a38af540600 100644 --- a/src/XrdCms/XrdCmsAdmin.cc +++ b/src/XrdCms/XrdCmsAdmin.cc @@ -42,6 +42,7 @@ #include "XrdCms/XrdCmsAdmin.hh" #include "XrdCms/XrdCmsConfig.hh" #include "XrdCms/XrdCmsManager.hh" +#include "XrdCms/XrdCmsMeter.hh" #include "XrdCms/XrdCmsPrepare.hh" #include "XrdCms/XrdCmsState.hh" #include "XrdCms/XrdCmsTrace.hh" @@ -112,6 +113,8 @@ static XrdSysMutex QMutex; static AdminReq *First; static AdminReq *Last; }; + +extern XrdCmsMeter Meter; }; /******************************************************************************/ @@ -140,28 +143,31 @@ static AdminReq *Last; /* E x t e r n a l T h r e a d I n t e r f a c e s */ /******************************************************************************/ -void *XrdCmsAdminLogin(void *carg) +namespace +{ +void *AdminLogin(void *carg) {XrdCmsAdmin *Admin = new XrdCmsAdmin(); Admin->Login(*(int *)carg); delete Admin; return (void *)0; } -void *XrdCmsAdminMonAds(void *carg) +void *AdminMonAds(void *carg) {XrdCmsAdmin *Admin = (XrdCmsAdmin *)carg; Admin->MonAds(); return (void *)0; } -void *XrdCmsAdminMonARE(void *carg) +void *AdminMonARE(void *carg) {XrdCmsAdmin::RelayAREvent(); return (void *)0; } -void *XrdCmsAdminSend(void *carg) +void *AdminSend(void *carg) {XrdCmsAdmin::Relay(0,0); return (void *)0; } +} /******************************************************************************/ /* I n i t A R E v e n t s */ @@ -177,7 +183,7 @@ bool XrdCmsAdmin::InitAREvents(void *arFunc) // Start the event relay // - if (XrdSysThread::Run(&tid,XrdCmsAdminMonARE,(void *)0)) + if (XrdSysThread::Run(&tid, AdminMonARE, (void *)0)) {Say.Emsg("InitAREvents", errno, "start arevent relay"); return false; } @@ -227,6 +233,8 @@ void XrdCmsAdmin::Login(int socknum) } else if (!strcmp("rmdid", tp)) do_RmDid(); // via lfn else if (!strcmp("newfn", tp)) do_RmDud(); // via lfn + else if (!strcmp("perf", tp)) do_Perf(); + else if (!strcmp("PERF", tp)) do_Perf(true); else if (!strcmp("suspend", tp)) {if ((tp = Stream.GetToken()) && *tp == 't') sPerm = 0; else sPerm = 1; @@ -448,7 +456,7 @@ void *XrdCmsAdmin::Start(XrdNetSocket *AdminSock) // Start the relay thread // - if (XrdSysThread::Run(&tid,XrdCmsAdminSend,(void *)0)) + if (XrdSysThread::Run(&tid, AdminSend, (void *)0)) Say.Emsg(epname, errno, "start admin relay"); // If we are in independent mode then let the caller continue @@ -463,7 +471,7 @@ void *XrdCmsAdmin::Start(XrdNetSocket *AdminSock) // while(1) if ((InSock = AdminSock->Accept()) >= 0) {XrdNetSocket::setOpts(InSock, 0); - if (XrdSysThread::Run(&tid,XrdCmsAdminLogin,(void *)&InSock)) + if (XrdSysThread::Run(&tid, AdminLogin, (void *)&InSock)) {Say.Emsg(epname, errno, "start admin"); close(InSock); } @@ -513,7 +521,7 @@ void XrdCmsAdmin::BegAds() // Start the connection/ping thread for the alternate data server // - if (XrdSysThread::Run(&tid,XrdCmsAdminMonAds,(void *)this)) + if (XrdSysThread::Run(&tid, AdminMonAds, (void *)this)) Say.Emsg(epname, errno, "start alternate data server monitor"); } @@ -732,6 +740,21 @@ int XrdCmsAdmin::do_Login() return 1; } +/******************************************************************************/ +/* d o _ P e r f */ +/******************************************************************************/ + +void XrdCmsAdmin::do_Perf(bool alert) +{ + const char *epname = "do_Perf"; + char buff[256]; + + if (!Stream.GetRest(buff, sizeof(buff))) + Say.Emsg(epname,"performance data is too long."); + else if (!Meter.Update(buff, alert)) + Say.Emsg(epname,"performance data is invalid."); +} + /******************************************************************************/ /* d o _ R m D i d */ /******************************************************************************/ diff --git a/src/XrdCms/XrdCmsAdmin.hh b/src/XrdCms/XrdCmsAdmin.hh index ab30332830e..55dcaaeae11 100644 --- a/src/XrdCms/XrdCmsAdmin.hh +++ b/src/XrdCms/XrdCmsAdmin.hh @@ -75,6 +75,7 @@ void BegAds(); bool CheckVNid(const char *xNid); int Con2Ads(const char *pname); int do_Login(); +void do_Perf(bool alert=false); void do_RmDid(int dotrim=0); void do_RmDud(int dotrim=0); diff --git a/src/XrdCms/XrdCmsClient.hh b/src/XrdCms/XrdCmsClient.hh index 2c7c2090086..62d5f0a8cd0 100644 --- a/src/XrdCms/XrdCmsClient.hh +++ b/src/XrdCms/XrdCmsClient.hh @@ -329,6 +329,20 @@ virtual int Release (int n=1) { (void)n; return 0;} virtual int Space(XrdOucErrInfo &Resp, const char *path, XrdOucEnv *Info=0) = 0; +//------------------------------------------------------------------------------ +//! Report utilization of this server. This may be used in lieu of general +//! performance metric reporting. For consistent results use only one method. +//! +//! @param util A value from 0 to 100 representing utilization. Values +//! greater than 100 are set to be 100. +//! @param alert When true the utilization is forcibly report to the +//! cluster managers. Otherwise, reporting is done only when +//! it will significantly change server selection. +//------------------------------------------------------------------------------ + +virtual void Utilization(unsigned int util, bool alert=false) + {(void)util; (void)alert;} + //------------------------------------------------------------------------------ //! Constructor //! @@ -336,8 +350,8 @@ virtual int Space(XrdOucErrInfo &Resp, const char *path, //------------------------------------------------------------------------------ enum Persona {amLocal, //!< Not affiliated with a cluster - amRemote, //!< Am a manager an issue redirects - amTarget //!< Am a server an field redirects + amRemote, //!< Am a manager and issue redirects + amTarget //!< Am a server and field redirects }; XrdCmsClient(Persona acting) : myPersona(acting) {} diff --git a/src/XrdCms/XrdCmsClientConfig.cc b/src/XrdCms/XrdCmsClientConfig.cc index 30e7d3c634d..3c804506976 100644 --- a/src/XrdCms/XrdCmsClientConfig.cc +++ b/src/XrdCms/XrdCmsClientConfig.cc @@ -38,6 +38,7 @@ #include "XrdCms/XrdCmsClientConfig.hh" #include "XrdCms/XrdCmsClientMsg.hh" +#include "XrdCms/XrdCmsPerfMon.hh" #include "XrdCms/XrdCmsSecurity.hh" #include "XrdCms/XrdCmsTrace.hh" #include "XrdCms/XrdCmsUtils.hh" @@ -49,6 +50,15 @@ #include "XrdOuc/XrdOucUtils.hh" #include "XrdSys/XrdSysHeaders.hh" +/******************************************************************************/ +/* G l o b a l s */ +/******************************************************************************/ + +namespace XrdCms +{ +extern XrdVersionInfo myVersion; +} + using namespace XrdCms; /******************************************************************************/ @@ -69,6 +79,11 @@ XrdCmsClientConfig::~XrdCmsClientConfig() while((tp = tpp)) {tpp = tp->next; delete tp;} tpp = PanList; while((tp = tpp)) {tpp = tp->next; delete tp;} + + if (VNID_Lib) free(VNID_Lib); + if (VNID_Parms) free(VNID_Parms); + if (prfLib) free(prfLib); + if (prfParms) free(prfParms); } /******************************************************************************/ @@ -96,8 +111,9 @@ int XrdCmsClientConfig::Configure(const char *cfn, configWhat What, if (!myHost) myHost = "localhost"; myName = XrdOucUtils::InstName(1); CMSPath= strdup("/tmp/"); - isMeta = How & configMeta; - isMan = What& configMan; + isMeta = (How & configMeta) != 0; + isMan = (What& configMan) != 0; + isServer = What == configServer; // Process the configuration file // @@ -177,6 +193,17 @@ int XrdCmsClientConfig::Configure(const char *cfn, configWhat What, NoGo = 1; } +// Load the performance monitor (server pre-screened) if specified. +// + if (prfLib && cmsMon) + {perfMon = XrdCmsUtils::loadPerfMon(&Say, prfLib, XrdCms::myVersion); + if (!perfMon || !perfMon->Configure(cfn, prfParms, *Say.logger(), + *cmsMon, 0, false)) + {Say.Emsg("Config","Unable to configure performance monitor plugin."); + NoGo = 1; + } + } + return NoGo; } @@ -273,10 +300,11 @@ int XrdCmsClientConfig::ConfigXeq(char *var, XrdOucStream &Config) // Process items. for either a local or a remote configuration // + TS_Xeq("adminpath", xapath); TS_Xeq("cidtag", xcidt); TS_Xeq("conwait", xconw); TS_Xeq("manager", xmang); - TS_Xeq("adminpath", xapath); + TS_Xeq("perf", xperf); TS_Xeq("request", xreqs); TS_Xeq("trace", xtrac); TS_Xeq("vnid", xvnid); @@ -487,6 +515,64 @@ int XrdCmsClientConfig::xmang(XrdOucStream &Config) return (XrdCmsUtils::ParseMan(&Say, theList, hSpec, hPort, 0) ? 0 : 1); } + +/******************************************************************************/ +/* x p e r f */ +/******************************************************************************/ + +/* Function: xperf + + Purpose: To parse the directive: perf [xrootd] [int ] + [lib [] | pgm ] + + int