diff --git a/src/XrdXrootd/XrdXrootdConfig.cc b/src/XrdXrootd/XrdXrootdConfig.cc index a90bcd79528..0305c0a2c72 100644 --- a/src/XrdXrootd/XrdXrootdConfig.cc +++ b/src/XrdXrootd/XrdXrootdConfig.cc @@ -73,6 +73,7 @@ #include "XrdXrootd/XrdXrootdProtocol.hh" #include "XrdXrootd/XrdXrootdStats.hh" #include "XrdXrootd/XrdXrootdTrace.hh" +#include "XrdXrootd/XrdXrootdTransit.hh" #include "XrdXrootd/XrdXrootdXPath.hh" #include "Xrd/XrdBuffer.hh" @@ -332,10 +333,12 @@ int XrdXrootdProtocol::Configure(char *parms, XrdProtocol_Config *pi) XrdXrootdFile::Init(Locker, as_nosf == 0); if (as_nosf) eDest.Say("Config warning: sendfile I/O has been disabled!"); -// Schedule protocol object cleanup +// Schedule protocol object cleanup (also advise the transit protocol) // ProtStack.Set(pi->Sched, XrdXrootdTrace, TRACE_MEM); - ProtStack.Set((pi->ConnMax/3 ? pi->ConnMax/3 : 30), 60*60); + n = (pi->ConnMax/3 ? pi->ConnMax/3 : 30); + ProtStack.Set(n, 60*60); + XrdXrootdTransit::Init(pi->Sched, n, 60*60); // Initialize the request ID generation object // diff --git a/src/XrdXrootd/XrdXrootdTransit.cc b/src/XrdXrootd/XrdXrootdTransit.cc index 6a36584f521..f2141c4be0b 100644 --- a/src/XrdXrootd/XrdXrootdTransit.cc +++ b/src/XrdXrootd/XrdXrootdTransit.cc @@ -65,7 +65,7 @@ extern XrdOucTrace *XrdXrootdTrace; const char *XrdXrootdTransit::reqTab = XrdXrootdTransit::ReqTable(); XrdObjectQ - XrdXrootdTransit::ProtStack("ProtStack", + XrdXrootdTransit::TranStack("TranStack", "transit protocol anchor"); /******************************************************************************/ @@ -83,7 +83,7 @@ XrdXrootdTransit *XrdXrootdTransit::Alloc(XrdXrootd::Bridge::Result *rsltP, // Simply return a new transit object masquerading as a bridge // - if (!(xp = ProtStack.Pop())) xp = new XrdXrootdTransit(); + if (!(xp = TranStack.Pop())) xp = new XrdXrootdTransit(); xp->Init(rsltP, linkP, seceP, nameP, protP); return xp; } @@ -182,7 +182,7 @@ bool XrdXrootdTransit::Disc() // Now just free up our object. // - ProtStack.Push(&ProtLink); + TranStack.Push(&TranLink); return true; } @@ -210,10 +210,18 @@ int XrdXrootdTransit::Fatal(int rc) } /******************************************************************************/ -/* Private: I n i t */ +/* I n i t */ /******************************************************************************/ -void XrdXrootdTransit::Init(XrdXrootd::Bridge::Result *respP, +void XrdXrootdTransit::Init(XrdScheduler *schedP, int qMax, int qTTL) +{ + TranStack.Set(schedP, XrdXrootdTrace, TRACE_MEM); + TranStack.Set(qMax, qTTL); +} + +/******************************************************************************/ + +void XrdXrootdTransit::Init(XrdXrootd::Bridge::Result *respP, // Private XrdLink *linkP, XrdSecEntity *seceP, const char *nameP, @@ -473,7 +481,7 @@ void XrdXrootdTransit::Recycle(XrdLink *lp, int consec, const char *reason) // Now just free up our object. // - ProtStack.Push(&ProtLink); + TranStack.Push(&TranLink); } /******************************************************************************/ diff --git a/src/XrdXrootd/XrdXrootdTransit.hh b/src/XrdXrootd/XrdXrootdTransit.hh index fc9f4a8a443..da12679c69d 100644 --- a/src/XrdXrootd/XrdXrootdTransit.hh +++ b/src/XrdXrootd/XrdXrootdTransit.hh @@ -45,6 +45,7 @@ //----------------------------------------------------------------------------- class XrdOucSFVec; +class XrdScheduler; class XrdXrootdTransPend; struct iovec; @@ -77,6 +78,12 @@ static int Attn(XrdLink *lP, short *theSID, int rcode, bool Disc(); +//----------------------------------------------------------------------------- +//! Perform one-time initialization +//----------------------------------------------------------------------------- + +static void Init(XrdScheduler *schedP, int qMax, int qTTL); + //----------------------------------------------------------------------------- //! Handle link activation (replaces parent activation). //----------------------------------------------------------------------------- @@ -149,7 +156,7 @@ void SetWait(int wtime, bool notify=false) //! Constructor & Destructor //----------------------------------------------------------------------------- - XrdXrootdTransit() : waitJob(this) {} + XrdXrootdTransit() : TranLink(this), waitJob(this) {} virtual ~XrdXrootdTransit() {} private: @@ -179,8 +186,8 @@ class WaitReq : public XrdJob XrdXrootdTransit *spanP; }; -static XrdObjectQ ProtStack; -XrdObject ProtLink; +static XrdObjectQ TranStack; +XrdObject TranLink; WaitReq waitJob; XrdSysMutex runMutex;