XRootD
Loading...
Searching...
No Matches
XrdFrcReqFile Class Reference

#include <XrdFrcReqFile.hh>

+ Collaboration diagram for XrdFrcReqFile:

Public Member Functions

 XrdFrcReqFile (const char *fn, int aVal)
 
 ~XrdFrcReqFile ()
 
void Add (XrdFrcRequest *rP)
 
void Can (XrdFrcRequest *rP)
 
void Del (XrdFrcRequest *rP)
 
int Get (XrdFrcRequest *rP)
 
int Init ()
 
char * List (char *Buff, int bsz, int &Offs, XrdFrcRequest::Item *ITList=0, int ITNum=0)
 
void ListL (XrdFrcRequest &tmpReq, char *Buff, int bsz, XrdFrcRequest::Item *ITList, int ITNum)
 

Detailed Description

Definition at line 36 of file XrdFrcReqFile.hh.

Constructor & Destructor Documentation

◆ XrdFrcReqFile()

XrdFrcReqFile::XrdFrcReqFile ( const char * fn,
int aVal )

Definition at line 60 of file XrdFrcReqFile.cc.

61{
62 char buff[1200];
63
64 memset((void *)&HdrData, 0, sizeof(HdrData));
65 reqFN = strdup(fn);
66 strcpy(buff, fn); strcat(buff, ".lock");
67 lokFN = strdup(buff);
68 lokFD = reqFD = -1;
69 isAgent = aVal;
70}

◆ ~XrdFrcReqFile()

XrdFrcReqFile::~XrdFrcReqFile ( )
inline

Definition at line 57 of file XrdFrcReqFile.hh.

57{}

Member Function Documentation

◆ Add()

void XrdFrcReqFile::Add ( XrdFrcRequest * rP)

Definition at line 76 of file XrdFrcReqFile.cc.

77{
78 rqMonitor rqMon(isAgent);
79 XrdFrcRequest tmpReq;
80 int fP;
81
82// Lock the file
83//
84 if (!FileLock()) {FailAdd(rP->LFN, 0); return;}
85
86// Obtain a free slot
87//
88 if ((fP = HdrData.Free))
89 {if (!reqRead((void *)&tmpReq, fP)) {FailAdd(rP->LFN, 1); return;}
90 HdrData.Free = tmpReq.Next;
91 } else {
92 struct stat buf;
93 if (fstat(reqFD, &buf))
94 {Say.Emsg("Add",errno,"stat",reqFN); FailAdd(rP->LFN, 1); return;}
95 fP = buf.st_size;
96 }
97
98// Chain in the request (registration requests go fifo)
99//
101 {if (!(rP->Next = HdrData.First)) HdrData.Last = fP;
102 HdrData.First = fP;
103 } else {
104 if (HdrData.First && HdrData.Last)
105 {if (!reqRead((void *)&tmpReq, HdrData.Last))
106 {FailAdd(rP->LFN, 1); return;}
107 tmpReq.Next = fP;
108 if (!reqWrite((void *)&tmpReq, HdrData.Last, 0))
109 {FailAdd(rP->LFN, 1); return;}
110 } else HdrData.First = fP;
111 HdrData.Last = fP; rP->Next = 0;
112 }
113
114// Write out the file
115//
116 rP->This = fP;
117 if (!reqWrite(rP, fP)) FailAdd(rP->LFN, 0);
118 FileLock(lkNone);
119}
XrdOucPup XrdCmsParser::Pup & Say
#define fstat(a, b)
Definition XrdPosix.hh:57
#define stat(a, b)
Definition XrdPosix.hh:96
char LFN[3072]
static const int Register

References fstat, XrdFrcRequest::LFN, XrdFrcRequest::Next, XrdFrcRequest::Options, XrdFrcRequest::Register, Say, stat, and XrdFrcRequest::This.

Referenced by XrdFrcReqAgent::Start().

+ Here is the caller graph for this function:

◆ Can()

void XrdFrcReqFile::Can ( XrdFrcRequest * rP)

Definition at line 125 of file XrdFrcReqFile.cc.

126{
127 rqMonitor rqMon(isAgent);
128 XrdFrcRequest tmpReq;
129 int Offs, numCan = 0, numBad = 0;
130 struct stat buf;
131 char txt[128];
132
133// Lock the file and get its size
134//
135 if (!FileLock() || fstat(reqFD, &buf)) {FailCan(rP->ID, 0); return;}
136
137// Run through all of the file entries removing matching requests
138//
139 for (Offs = ReqSize; Offs < buf.st_size; Offs += ReqSize)
140 {if (!reqRead((void *)&tmpReq, Offs)) return FailCan(rP->ID);
141 if (!strcmp(tmpReq.ID, rP->ID))
142 {tmpReq.LFN[0] = '\0';
143 if (!reqWrite((void *)&tmpReq, Offs, 0)) numBad++;
144 else numCan++;
145 }
146 }
147
148// Make sure this is written to disk
149//
150 if (numCan) fsync(reqFD);
151
152// Document the action
153//
154 if (numCan || numBad)
155 {sprintf(txt, "has %d entries; %d removed (%d failures).",
156 numCan+numBad, numCan, numBad);
157 Say.Emsg("Can", rP->ID, txt);
158 }
159 FileLock(lkNone);
160}
#define fsync(a)
Definition XrdPosix.hh:59

References fstat, fsync, XrdFrcRequest::ID, Say, and stat.

◆ Del()

void XrdFrcReqFile::Del ( XrdFrcRequest * rP)

Definition at line 166 of file XrdFrcReqFile.cc.

167{
168 rqMonitor rqMon(isAgent);
169 XrdFrcRequest tmpReq;
170
171// Lock the file
172//
173 if (!FileLock()) {FailDel(rP->LFN, 0); return;}
174
175// Put entry on the free chain
176//
177 memset(&tmpReq, 0, sizeof(tmpReq));
178 tmpReq.Next = HdrData.Free;
179 HdrData.Free = rP->This;
180 if (!reqWrite((void *)&tmpReq, rP->This)) FailDel(rP->LFN, 0);
181 FileLock(lkNone);
182}

References XrdFrcRequest::LFN, XrdFrcRequest::Next, and XrdFrcRequest::This.

Referenced by XrdFrmXfrQueue::Add(), and XrdFrmXfrQueue::Done().

+ Here is the caller graph for this function:

◆ Get()

int XrdFrcReqFile::Get ( XrdFrcRequest * rP)

Definition at line 188 of file XrdFrcReqFile.cc.

189{
190 int fP, rc;
191
192// Lock the file
193//
194 if (!FileLock()) return 0;
195
196// Get the next request
197//
198 while((fP = HdrData.First))
199 {if (!reqRead((void *)rP, fP)) {FileLock(lkNone); return 0;}
200 HdrData.First= rP->Next;
201 if (*(rP->LFN)) {reqWrite(0,0,1); break;}
202 rP->Next = HdrData.Free;
203 HdrData.Free = fP;
204 if (!reqWrite(rP, fP)) {fP = 0; break;}
205 }
206 if (fP) rc = (HdrData.First ? 1 : -1);
207 else rc = 0;
208 FileLock(lkNone);
209 return rc;
210}

◆ Init()

int XrdFrcReqFile::Init ( )

Definition at line 216 of file XrdFrcReqFile.cc.

217{
218 EPNAME("Init");
219 static const int Mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
220 XrdFrcRequest tmpReq;
221 struct stat buf;
222 recEnt *RegList = 0, *First = 0, *rP, *pP, *tP;
223 int Offs, rc, numreq = 0;
224
225// Open the lock file first in r/w mode
226//
227 if ((lokFD = XrdSysFD_Open(lokFN, O_RDWR|O_CREAT, Mode)) < 0)
228 {Say.Emsg("Init",errno,"open",lokFN); return 0;}
229
230// Obtain a lock
231//
232 if (!FileLock(lkInit)) return 0;
233
234// Open the file first in r/w mode
235//
236 if ((reqFD = XrdSysFD_Open(reqFN, O_RDWR|O_CREAT, Mode)) < 0)
237 {FileLock(lkNone);
238 Say.Emsg("Init",errno,"open",reqFN);
239 return 0;
240 }
241
242// Check for a new file here
243//
244 if (fstat(reqFD, &buf)) return FailIni("stat");
245 if (buf.st_size < ReqSize)
246 {memset(&tmpReq, 0, sizeof(tmpReq));
247 HdrData.Free = ReqSize;
248 if (!reqWrite((void *)&tmpReq, ReqSize)) return FailIni("init file");
249 FileLock(lkNone);
250 return 1;
251 }
252
253// We are done if this is a agent
254//
255 if (isAgent)
256 {FileLock(lkNone);
257 return 1;
258 }
259
260// Read the full file
261//
262 for (Offs = ReqSize; Offs < buf.st_size; Offs += ReqSize)
263 {if (!reqRead((void *)&tmpReq, Offs)) return FailIni("read file");
264 if (*tmpReq.LFN == '\0' || !tmpReq.addTOD
265 || tmpReq.Opaque >= int(sizeof(tmpReq.LFN))) continue;
266 pP = 0; rP = First; tP = new recEnt(tmpReq); numreq++;
267 if (tmpReq.Options & XrdFrcRequest::Register)
268 {tP->Next = RegList; RegList = tP;
269 } else {
270 while(rP && rP->reqData.addTOD < tmpReq.addTOD) {pP=rP;rP=rP->Next;}
271 if (pP) pP->Next = tP;
272 else First = tP;
273 tP->Next = rP;
274 }
275 }
276
277// Plase registration requests in the front
278//
279 while((rP = RegList))
280 {RegList = rP->Next;
281 rP->Next = First;
282 First = rP;
283 }
284
285// Now write out the file
286//
287 DEBUG(numreq <<" request(s) recovered from " <<reqFN);
288 rc = ReWrite(First);
289
290// Delete all the entries in memory while referencing known instance names
291//
292 while((tP = First))
293 {First = tP->Next;
294 CID.Ref(tP->reqData.iName);
295 delete tP;
296 }
297
298// All done
299//
300 FileLock(lkNone);
301 return rc;
302}
#define DEBUG(x)
#define EPNAME(x)
int Mode
void Ref(const char *iName)
Definition XrdFrcCID.cc:248
XrdFrcCID CID
Definition XrdFrcCID.cc:56

References XrdFrc::CID, DEBUG, EPNAME, fstat, Mode, XrdFrcCID::Ref(), XrdFrcRequest::Register, Say, and stat.

+ Here is the call graph for this function:

◆ List()

char * XrdFrcReqFile::List ( char * Buff,
int bsz,
int & Offs,
XrdFrcRequest::Item * ITList = 0,
int ITNum = 0 )

Definition at line 308 of file XrdFrcReqFile.cc.

310{
311 rqMonitor rqMon(isAgent);
312 XrdFrcRequest tmpReq;
313 int rc;
314
315// Set Offs argument
316//
317 if (Offs < ReqSize) Offs = ReqSize;
318
319// Lock the file
320//
321 if (!FileLock(lkShare)) return 0;
322
323// Return next valid filename
324//
325 do{do {rc = pread(reqFD, (void *)&tmpReq, ReqSize, Offs);}
326 while(rc < 0 && errno == EINTR);
327 if (rc == ReqSize)
328 {Offs += ReqSize;
329 if (*tmpReq.LFN == '\0' || !tmpReq.addTOD
330 || tmpReq.Opaque >= int(sizeof(tmpReq.LFN))
331 || tmpReq.Options & XrdFrcRequest::Register) continue;
332 FileLock(lkNone);
333 if (!ITNum || !ITList) strlcpy(Buff, tmpReq.LFN, bsz);
334 else ListL(tmpReq, Buff, bsz, ITList, ITNum);
335 return Buff;
336 }
337 } while(rc == ReqSize);
338
339// Diagnose ending condition
340//
341 if (rc < 0) Say.Emsg("List",errno,"read",reqFN);
342
343// Return end of list
344//
345 FileLock(lkNone);
346 return 0;
347}
#define pread(a, b, c, d)
Definition XrdPosix.hh:75
size_t strlcpy(char *dst, const char *src, size_t sz)
void ListL(XrdFrcRequest &tmpReq, char *Buff, int bsz, XrdFrcRequest::Item *ITList, int ITNum)
long long addTOD

References XrdFrcRequest::addTOD, XrdFrcRequest::LFN, ListL(), XrdFrcRequest::Opaque, XrdFrcRequest::Options, pread, XrdFrcRequest::Register, Say, and strlcpy().

Referenced by XrdFrcReqAgent::NextLFN().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ ListL()

void XrdFrcReqFile::ListL ( XrdFrcRequest & tmpReq,
char * Buff,
int bsz,
XrdFrcRequest::Item * ITList,
int ITNum )

Definition at line 353 of file XrdFrcReqFile.cc.

355{
356 char What, tbuf[32];
357 long long tval;
358 int i, k, n, bln = bsz-2, Lfo;
359
360 for (i = 0; i < ITNum && bln > 0; i++)
361 {Lfo = tmpReq.LFO;
362 switch(ITList[i])
364 Lfo = 0;
365 n = strlen(tmpReq.LFN);
366 strlcpy(Buff, tmpReq.LFN, bln);
367 break;
368
370 n = strlen(tmpReq.LFN+Lfo);
371 strlcpy(Buff, tmpReq.LFN+Lfo, bln);
372 break;
373
375 Lfo = 0;
376 n = strlen(tmpReq.LFN); tmpReq.LFN[n] = '?';
377 if (!tmpReq.Opaque) tmpReq.LFN[n+1] = '\0';
378 strlcpy(Buff, tmpReq.LFN, bln);
379 k = strlen(tmpReq.LFN);
380 tmpReq.LFN[n] = '\0'; n = k;
381 break;
382
384 n = strlen(tmpReq.LFN); tmpReq.LFN[n] = '?';
385 if (!tmpReq.Opaque) tmpReq.LFN[n+1] = '\0';
386 strlcpy(Buff, tmpReq.LFN+Lfo, bln);
387 k = strlen(tmpReq.LFN+Lfo);
388 tmpReq.LFN[n] = '\0'; n = k;
389 break;
390
392 n = 0;
393 What = (tmpReq.Options & XrdFrcRequest::makeRW
394 ? 'w' : 'r');
395 if (bln) {Buff[n] = What; n++;}
396 if (tmpReq.Options & XrdFrcRequest::msgFail)
397 if (bln-n > 0) {Buff[n] = 'f'; n++;}
398 if (tmpReq.Options & XrdFrcRequest::msgSucc)
399 if (bln-n > 0) {Buff[n] = 'n'; n++;}
400 break;
401
403 n = strlen(tmpReq.Notify);
404 strlcpy(Buff, tmpReq.Notify, bln);
405 break;
406
408 *Buff = tmpReq.OPc;
409 n = 1;
410 break;
411
413 if (tmpReq.Prty == 2) What = '2';
414 else if (tmpReq.Prty == 1) What = '1';
415 else What = '0';
416 n = 1;
417 if (bln) *Buff = What;
418 break;
419
422 tval = tmpReq.addTOD;
423 if (ITList[i] == XrdFrcRequest::getQWT) tval = time(0)-tval;
424 if ((n = sprintf(tbuf, "%lld", tval)) >= 0)
425 strlcpy(Buff, tbuf, bln);
426 break;
427
429 n = strlen(tmpReq.ID);
430 strlcpy(Buff, tmpReq.ID, bln);
431 break;
432
434 n = strlen(tmpReq.User);
435 strlcpy(Buff, tmpReq.User, bln);
436 break;
437
438 default: n = 0; break;
439 }
440 if (bln > 0) {bln -= n; Buff += n;}
441 if (bln > 0) {*Buff++ = ' '; bln--;}
442 }
443 *Buff = '\0';
444}
static const int msgFail
static const int makeRW
static const int msgSucc
signed char Prty
char Notify[512]

References XrdFrcRequest::addTOD, XrdFrcRequest::getLFN, XrdFrcRequest::getLFNCGI, XrdFrcRequest::getMODE, XrdFrcRequest::getNOTE, XrdFrcRequest::getOBJ, XrdFrcRequest::getOBJCGI, XrdFrcRequest::getOP, XrdFrcRequest::getPRTY, XrdFrcRequest::getQWT, XrdFrcRequest::getRID, XrdFrcRequest::getTOD, XrdFrcRequest::getUSER, XrdFrcRequest::ID, XrdFrcRequest::LFN, XrdFrcRequest::LFO, XrdFrcRequest::makeRW, XrdFrcRequest::msgFail, XrdFrcRequest::msgSucc, XrdFrcRequest::Notify, XrdFrcRequest::Opaque, XrdFrcRequest::OPc, XrdFrcRequest::Options, XrdFrcRequest::Prty, strlcpy(), and XrdFrcRequest::User.

Referenced by List().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

The documentation for this class was generated from the following files: