34 #include <netinet/in.h>
35 #include <sys/types.h>
102 prevState = ~currState;
114 int RTsend, theState, Changes, myPort;
118 do {mySemaphore.
Wait();
120 Changes = currState ^ prevState;
121 theState = currState;
122 prevState = currState;
126 if (Changes && (myStatus.
Hdr.
modifier = Status(Changes, theState)))
127 {
if (myStatus.
Hdr.
modifier & CmsStatusRequest::kYR_Resume)
128 {myStatus.
Hdr.
streamid = htonl(myPort); RTsend = 1;}
130 RTsend = (isMan > 0 ? (theState &
SRV_Suspend) : 0);
133 RTable.
Send(
"status", (
char *)&myStatus,
sizeof(myStatus));
167 ? CmsStatusRequest::kYR_Suspend
168 : CmsStatusRequest::kYR_Resume;
171 ? CmsStatusRequest::kYR_noStage
172 : CmsStatusRequest::kYR_Stage;
174 lp->
Send((
char *)&myStatus.
Hdr,
sizeof(myStatus.
Hdr));
203 i = strlen(AdminPath);
204 strcpy(fnbuff, AdminPath);
205 if (AdminPath[i-1] !=
'/') fnbuff[i++] =
'/';
206 strcpy(fnbuff+i,
"NOSTAGE");
207 NoStageFile = strdup(fnbuff);
208 strcpy(fnbuff+i,
"SUSPEND");
209 SuspendFile = strdup(fnbuff);
216 unsigned char XrdCmsState::Status(
int Changes,
int theState)
218 const char *SRstate = 0, *SNstate = 0;
219 unsigned char rrModifier;
225 {rrModifier = CmsStatusRequest::kYR_Suspend;
226 SRstate =
"suspended";
228 rrModifier = CmsStatusRequest::kYR_Resume;
237 {rrModifier |= CmsStatusRequest::kYR_noStage;
238 SNstate =
"+ nostaging";
240 rrModifier |= CmsStatusRequest::kYR_Stage;
241 SNstate =
"+ staging";
248 {
if (!SRstate && SNstate) SNstate += 2;
249 Say.
Emsg(
"State",
"Status changed to", SRstate, SNstate);
268 {
case Active:
if ((newVal = ActivCnt ? 0 : 1) != adminSuspend)
269 {
if ( newVal && !StageCnt)
unlink(SuspendFile);
270 else if (!newVal || !StageCnt)
unlink(SuspendFile);
271 else close(
open(SuspendFile, O_WRONLY|O_CREAT,
273 adminSuspend = newVal;
277 case Counts: numStaging += StageCnt;
278 numActive += ActivCnt;
281 case FrontEnd:
if ((feOK = (ActivCnt ? 1 : 0)) && StageCnt >= 0)
285 case Space: noSpace = (ActivCnt ? 0 : 1);
288 case Stage:
if ((newVal = ActivCnt ? 0 : 1) != adminNoStage)
289 {
if (newVal)
unlink(NoStageFile);
290 else close(
open(NoStageFile, O_WRONLY|O_CREAT,
292 adminNoStage = newVal;
296 default:
Say.
Emsg(
"State",
"Invalid state update");
301 DEBUG(What <<
" Parm1=" <<ActivCnt <<
" Parm2=" <<StageCnt);
302 currState=(numActive < minNodeCnt || adminSuspend ?
SRV_Suspend:0)
303 |(numStaging < 1 || noSpace || adminNoStage ?
All_NoStage:0)
311 if (currState != prevState && Enabled) mySemaphore.
Post();
int stat(const char *path, struct stat *buf)
int open(const char *path, int oflag,...)
int unlink(const char *path)
static void Inform(const char *What, const char *Data, int Dlen)
void Send(const char *What, const char *data, int dlen)
static const char FES_Suspend
static const char All_NoStage
void Update(StateType StateT, int ActivVal, int StageVal=0)
static const char All_Suspend
static const char SRV_Suspend
void sendState(XrdLink *Link)
int Send(const char *buff, int blen)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)