XRootD
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 }
int stat(const char *path, struct stat *buf)
int fstat(int fildes, struct stat *buf)
char LFN[3072]
static const int Register
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
Definition: XrdSysError.cc:95
XrdSysError Say

References XrdSysError::Emsg(), fstat(), XrdFrcRequest::LFN, XrdFrcRequest::Next, XrdFrcRequest::Options, XrdFrcRequest::Register, XrdFrc::Say, stat(), and XrdFrcRequest::This.

Referenced by XrdFrcReqAgent::Start().

+ Here is the call graph for this function:
+ 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 }
int fsync(int fildes)

References XrdSysError::Emsg(), fstat(), fsync(), XrdFrcRequest::ID, XrdFrc::Say, and stat().

+ Here is the call graph for this function:

◆ 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)
Definition: XrdBwmTrace.hh:54
#define EPNAME(x)
Definition: XrdBwmTrace.hh:56
int Mode
void Ref(const char *iName)
Definition: XrdFrcCID.cc:248
XrdFrcCID CID
Definition: XrdFrcCID.cc:56

References XrdFrc::CID, DEBUG, XrdSysError::Emsg(), EPNAME, fstat(), Mode, XrdFrcCID::Ref(), XrdFrcRequest::Register, XrdFrc::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 }
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset)
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, XrdSysError::Emsg(), XrdFrcRequest::LFN, XrdFrcRequest::Opaque, XrdFrcRequest::Options, pread(), XrdFrcRequest::Register, XrdFrc::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])
363  {case XrdFrcRequest::getOBJ:
364  Lfo = 0;
365  n = strlen(tmpReq.LFN);
366  strlcpy(Buff, tmpReq.LFN, bln);
367  break;
368 
369  case XrdFrcRequest::getLFN:
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
char User[256]
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.

+ Here is the call graph for this function:

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