65 char *XrdLinkCtl::LinkBat = 0;
66 unsigned int XrdLinkCtl::LinkAlloc= 0;
67 int XrdLinkCtl::LTLast = -1;
68 int XrdLinkCtl::maxFD = 0;
73 const char *XrdLinkCtl::TraceID =
"LinkCtl";
78 unsigned int myInstance = 1;
82static const int XRDLINK_USED = 0x01;
83static const int XRDLINK_FREE = 0x00;
85class LinkScan :
public XrdJob
92 LinkScan() :
XrdJob(
"Idle link scan") {}
104 char hName[1024], *unp, buff[32];
105 int bl, peerFD = peer.
SockFD();
109 if (peerFD < 0 || peerFD >= maxFD)
110 {snprintf(hName,
sizeof(hName),
"%d", peerFD);
111 Log.Emsg(
"Link",
"attempt to alloc out of range FD -",hName);
120 snprintf(hName,
sizeof(hName),
"%d", peerFD);
121 Log.Emsg(
"Link",
"attempt to reuse active link FD -",hName);
128 if (!(lp = LinkTab[peerFD]))
131 if (LinkAlloc <= std::size_t(-1) / 2 /
sizeof(
XrdLinkCtl))
135 Log.Emsg(
"Link", ENOMEM,
"create link");
138 blp = &LinkTab[peerFD/LinkAlloc*LinkAlloc];
139 for (i = 0; i < LinkAlloc; i++, blp++) *blp = &nlp[i];
140 lp = LinkTab[peerFD];
143 LinkBat[peerFD] = XRDLINK_USED;
144 if (peerFD > LTLast) LTLast = peerFD;
160 lp->
HNlen = strlen(hName);
164 bl = sprintf(buff,
"anon.0:%d", peerFD);
166 memcpy(unp, buff, bl);
169 lp->
Comment = (
const char *)unp;
199 const int MaxSeek = 16;
201 int i, seeklim = MaxSeek;
206 if (curr >= 0 && LinkTab[curr]) LinkTab[curr]->setRef(-1);
213 for (i = curr+1; i <= LTLast; i++)
214 {
if ((lp = LinkTab[i]) && LinkBat[i] && lp->
HostName)
221 if (myINS == lp->
Instance)
return lp;
224 if (!seeklim--) {LTMutex.UnLock(); seeklim = MaxSeek; LTMutex.Lock();}
245 const int MaxSeek = 16;
246 int i, ulen = 0, seeklim = MaxSeek;
253 for (i = curr+1; i <= LTLast; i++)
254 {
if ((lp = LinkTab[i]) && LinkBat[i] && lp->
HostName)
257 {ulen = lp->
Client(nbuf, nbsz);
262 if (!seeklim--) {LTMutex.UnLock(); seeklim = MaxSeek; LTMutex.Lock();}
282 int i, ltlast, lnum = 0, tmo = 0, tmod = 0;
293 for (i = 0; i <= ltlast; i++)
294 {
if (LinkBat[i] != XRDLINK_USED
295 || !(lp = LinkTab[i]))
continue;
300 if ((
int(lp->
isIdle)) < idleTicks)
304 Log.Emsg(
"LinkScan",
"Link",lp->
ID,
"is disabled and idle.");
314 TRACE(CONN, lnum <<
" links; " <<tmo <<
" idle; " <<tmod <<
" force closed");
323 if (wkSec > 0)
waitKill =
static_cast<short>(wkSec);
324 if (kwSec > 0)
killWait =
static_cast<short>(kwSec);
339 numalloc = 8192 /
sizeof(
XrdLink);
341 while((numalloc = numalloc/2)) LinkAlloc = LinkAlloc*2;
342 TRACE(
DEBUG,
"Allocating " <<LinkAlloc <<
" link objects at a time");
347 {
Log.Emsg(
"Link", ENOMEM,
"create LinkTab");
return 0;}
348 memset((
void *)LinkTab, 0, maxfds*
sizeof(
XrdLinkCtl *));
352 if (!(LinkBat = (
char *)malloc(maxfds*
sizeof(
char)+LinkAlloc)))
353 {
Log.Emsg(
"Link", ENOMEM,
"create LinkBat");
return 0;}
354 memset((
void *)LinkBat, XRDLINK_FREE, maxfds*
sizeof(
char));
359 {
if ((idleCheck = idlewait/3)) idleTicks = 3;
361 idleCheck = idlewait;
363 LinkScan *ls =
new LinkScan;
382 LTMutex.Lock(); myLTLast = LTLast; LTMutex.UnLock();
386 for (
int i = 0; i <= myLTLast; i++)
387 {
if (LinkBat[i] == XRDLINK_USED && LinkTab[i]) LinkTab[i]->syncStats();}
400 LinkBat[fd] = XRDLINK_FREE;
401 if (fd == LTLast)
while(LTLast && !(LinkBat[LTLast])) LTLast--;
int DoIt(int argpnt, int argc, char **argv, bool singleshot)
XrdJob(const char *desc="")
static XrdLink * Alloc(XrdNetAddr &peer, int opts=0)
static void SyncAll()
Synchronize statustics for ll links.
static int Setup(int maxfds, int idlewt)
static XrdLink * Find(int &curr, XrdLinkMatch *who=0)
static void setKWT(int wkSec, int kwSec)
static void idleScan()
Look for idle links and close hem down.
static short killWait
Link destruction control constants.
static int getName(int &curr, char *bname, int blen, XrdLinkMatch *who=0)
static void Unhook(int fd)
Unhook a link from the active table of links.
int Match(const char *uname, int unlen, const char *hname, int hnlen)
int Client(char *buff, int blen)
static long long LinkCountTot
static XrdSysMutex statsMutex
char * ID
Pointer to the client's link identity.
static const int noPort
Do not add port number.
static const int old6Map4
Use deprecated IPV6 mapped format.
int Format(char *bAddr, int bLen, fmtUse fmtType=fmtAuto, int fmtOpts=0)
@ fmtAuto
Hostname if already resolved o/w use fmtAddr.
virtual void Disable(XrdPollInfo &pInfo, const char *etxt=0)=0