Skip to content

Commit

Permalink
Fix memory leak in Bridge protocol (affects HTTP).
Browse files Browse the repository at this point in the history
  • Loading branch information
abh3 committed Jan 8, 2017
1 parent 9adef38 commit 4abb295
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 11 deletions.
7 changes: 5 additions & 2 deletions src/XrdXrootd/XrdXrootdConfig.cc
Expand Up @@ -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"
Expand Down Expand Up @@ -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
//
Expand Down
20 changes: 14 additions & 6 deletions src/XrdXrootd/XrdXrootdTransit.cc
Expand Up @@ -65,7 +65,7 @@ extern XrdOucTrace *XrdXrootdTrace;
const char *XrdXrootdTransit::reqTab = XrdXrootdTransit::ReqTable();

XrdObjectQ<XrdXrootdTransit>
XrdXrootdTransit::ProtStack("ProtStack",
XrdXrootdTransit::TranStack("TranStack",
"transit protocol anchor");

/******************************************************************************/
Expand All @@ -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;
}
Expand Down Expand Up @@ -182,7 +182,7 @@ bool XrdXrootdTransit::Disc()

// Now just free up our object.
//
ProtStack.Push(&ProtLink);
TranStack.Push(&TranLink);
return true;
}

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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);
}

/******************************************************************************/
Expand Down
13 changes: 10 additions & 3 deletions src/XrdXrootd/XrdXrootdTransit.hh
Expand Up @@ -45,6 +45,7 @@
//-----------------------------------------------------------------------------

class XrdOucSFVec;
class XrdScheduler;
class XrdXrootdTransPend;
struct iovec;

Expand Down Expand Up @@ -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).
//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -149,7 +156,7 @@ void SetWait(int wtime, bool notify=false)
//! Constructor & Destructor
//-----------------------------------------------------------------------------

XrdXrootdTransit() : waitJob(this) {}
XrdXrootdTransit() : TranLink(this), waitJob(this) {}
virtual ~XrdXrootdTransit() {}

private:
Expand Down Expand Up @@ -179,8 +186,8 @@ class WaitReq : public XrdJob
XrdXrootdTransit *spanP;
};

static XrdObjectQ<XrdXrootdTransit> ProtStack;
XrdObject<XrdXrootdTransit> ProtLink;
static XrdObjectQ<XrdXrootdTransit> TranStack;
XrdObject<XrdXrootdTransit> TranLink;

WaitReq waitJob;
XrdSysMutex runMutex;
Expand Down

0 comments on commit 4abb295

Please sign in to comment.