34 #include <netinet/in.h>
35 #include <sys/types.h>
74 XrdCmsNode *XrdCmsManager::MastTab[MTMax] = {0};
75 char XrdCmsManager::MastSID[MTMax] = {0};
76 int XrdCmsManager::MTHi = -1;
86 void DoIt() {nodeP->Delete(XrdCmsManager::MTMutex);
130 lp->
setID(
"manager",0);
131 if (newManList) {MTMutex.UnLock(); xit =
true;
return 0;}
136 for (i = 0; i < MTMax; i++)
if (!MastTab[i])
break;
142 Say.
Emsg(
"Manager",
"Login to", lp->
Name(),
"failed; too many managers");
148 if (!(nP =
new XrdCmsNode(lp, 0, 0, 0, Lvl, i)))
149 {
Say.
Emsg(
"Manager",
"Unable to obtain node object.");
return 0;}
155 if (i > MTHi) MTHi = i;
167 DEBUG(nP->
Name() <<
" to manager config; id=" <<i);
191 sprintf(mbuff,
":%d", mPort);
192 Say.
Say(
"Config ",
"Manager ", manP, mbuff,
" unconfigured.");
202 if (curManCnt > 0 || !newManList) {MTMutex.UnLock();
return;}
206 for (
int i = 0; i <= MTHi; i++)
207 {
if (MastSID[i] == siteID) {MastTab[i] = 0; MastSID[i] = 0;}}
211 while(MTHi >= 0 && !MastTab[MTHi]) MTHi--;
215 while((mP = curManList)) {curManList = curManList->next;
delete mP;}
216 curManList = newManList;
221 Say.
Say(
"Config ",
"Manager subsystem reconfiguration completed; restarting.");
245 for (i = 0; i <= MTHi; i++)
250 nP->
Send(Data, Dlen);
272 for (i = 0; i <= MTHi; i++)
277 nP->
Send(vP, vN, vT);
288 const char *Arg,
int Alen)
291 htons(
static_cast<unsigned short>(Alen))};
292 struct iovec ioV[2] = {{(
char *)&Hdr,
sizeof(Hdr)},
293 {(
char *)Arg, (
size_t)Alen}};
295 Inform(
Router.
getName((
int)rCode), ioV, (Arg ? 2 : 1), Alen+
sizeof(Hdr));
302 struct iovec ioV[2] = {{(
char *)&Hdr,
sizeof(Hdr)},
303 {(
char *)Arg, (
size_t)Alen}};
305 Hdr.
datalen = htons(
static_cast<unsigned short>(Alen));
317 int sinst, sent = nP->
ID(sinst);
325 if (!(nP == MastTab[sent]))
327 DEBUG(
"manager " <<sent <<
'.' <<sinst <<
" failed.");
336 DEBUG(
"completed " <<nP->
Name() <<
" manager " <<sent <<
'.' <<sinst);
340 if (sent == MTHi)
while(MTHi >= 0 && !MastTab[MTHi]) MTHi--;
345 if (reason)
Say.
Emsg(
"Manager", nP->
Ident,
"removed;", reason);
367 if (newManList) {MTMutex.UnLock();
return;}
371 Say.
Say(
"Config ",
"Manager subsystem reconfiguring using ", newMans);
384 {
if ((eText = manAddr.
Set(hP)))
385 {
Say.
Emsg(
"Config",
"Ignoring manager", hP, eText);
continue;}
387 while(tP && strcmp(hP, tP->
text)) tP = tP->
next;
388 if (tP) {
Say.
Emsg(
"Config",
"Ignoring duplicate manager", hP);
391 if (newManCnt >=MTMax)
392 {
Say.
Emsg(
"Config",
"Ignoring manager", hP,
393 "and remaining entries; limit exceeded!");
403 if (newManCnt) ManTree->Abort();
410 {
for (
int i = 0; i <= MTHi; i++)
411 if (MastTab[i] && (MastSID[i] == siteID))
413 MastTab[i]->Send((
char *)&discRequest,
sizeof(discRequest));
441 for (i = 0; i <= MTHi; i++)
447 nP->
Send((
char *)&myState, szReqst);
462 XrdJob *jP, *jFirst = 0, *jLast = 0;
480 if (!jFirst) jFirst = jLast = jP;
481 else {jLast->
NextJob = jP; jLast = jP;}
485 sprintf(buff,
"%s:%d", tP->
text, tP->val);
486 Say.
Emsg(
"Config",
"Circular connection to", buff,
"ignored.");
494 {
Say.
Emsg(
"Config",
"No managers can be started; we are now unreachable!");
501 if (myMans)
delete myMans;
503 if (ManTree)
delete ManTree;
505 if (theSID) {free(theSID); theSID = 0;}
506 if (theSite) {free(theSite); theSite = 0;}
527 int n, sid, snum = 0, mtot = 0, mnum = 0, xnum = 0;
531 if (!mL)
return true;
537 {sid = mL->ival[1]; mtot++;
539 {sprintf(buff,
"%d", sid);
540 Say.
Say(
"Config ",
"Invalid site ID ", buff,
" for ", mL->
text);
550 for (n = 0; n < MTMax; n++)
if (manVec[n]) snum++;
554 snprintf(buff,
sizeof(buff),
"%d manager%s and %d site%s.", mnum,
555 (mnum != 1 ?
"s":
""), snum, (snum != 1 ?
"s":
""));
556 Say.
Say(
"Config Connecting to ", buff);
560 for (n = 0; n < MTMax; n++)
563 xnum += manP->Run(manVec[n]);
570 {snprintf(buff,
sizeof(buff),
"%d of %d", xnum, mtot);
571 Say.
Say(
"Config Warning! Only ", buff,
" manager(s) will be contacted!");
590 if ((
sidP = index(sid,
' ')))
sidP++;
596 {theSID = strdup(
sidP);
597 if (theSite) free(theSite);
598 theHost = strdup(lP->
Host());
599 theSite = (sname ? strdup(sname) : strdup(
"anonymous"));
605 if (!strcmp(theSID,
sidP))
return true;
610 snprintf(mBuff,
sizeof(mBuff),
"%s for site %s; "
611 "making file location unpredictable!", theHost,
616 Say.
Emsg(
"Manager", lP->
Host(),
"manager configuration differs from", mBuff);
XrdCmsDelNode(XrdCmsNode *nP)
static void Inform(const char *What, const char *Data, int Dlen)
XrdCmsNode * Add(XrdLink *lp, int Lvl, bool &xit)
void Rerun(char *newMans)
void Finished(const char *manP, int mPort)
static bool Start(const XrdOucTList *mL)
void Delete(XrdCmsNode *nodeP)
XrdCmsManager(XrdOucTList *mlP, int snum)
void Remove(XrdCmsNode *nP, const char *reason=0)
bool Verify(XrdLink *lP, const char *sid, const char *sname)
void setManager(XrdCmsManager *mP)
int Send(const char *buff, int blen=0)
static const char isDoomed
static const char isBlisted
static XrdCmsProtocol * Alloc(const char *theRole="", XrdCmsManager *mP=0, const char *theMan=0, int thePort=0)
const char * getName(int Code)
static const char * SiteName(int snum)
const char * Host() const
void setID(const char *userid, int procid)
const char * Name() const
const char * Name(const char *eName=0, const char **eText=0)
const char * Set(const char *hSpec, int pNum=PortInSpec)
char * GetToken(char **rest=0, int lowcase=0)
void Schedule(XrdJob *jp)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
void Say(const char *text1, const char *text2=0, const char *txt3=0, const char *text4=0, const char *text5=0, const char *txt6=0)