XRootD
XrdOssCsiFileAioJob Class Reference

#include <XrdOssCsiFileAio.hh>

+ Inheritance diagram for XrdOssCsiFileAioJob:
+ Collaboration diagram for XrdOssCsiFileAioJob:

Public Member Functions

 XrdOssCsiFileAioJob ()
 
virtual ~XrdOssCsiFileAioJob ()
 
void DoIt ()
 
void DoItRead1 ()
 
void DoItRead2 ()
 
void DoItWrite1 ()
 
void DoItWrite2 ()
 
void Init (XrdOssCsiFile *fp, XrdOssCsiFileAio *nio, XrdSfsAio *aiop, bool isPg, bool read)
 
void PrepareRead2 ()
 
void PrepareWrite2 ()
 
- Public Member Functions inherited from XrdJob
 XrdJob (const char *desc="")
 
virtual ~XrdJob ()
 

Additional Inherited Members

- Public Attributes inherited from XrdJob
const char * Comment
 
XrdJobNextJob
 

Detailed Description

Definition at line 42 of file XrdOssCsiFileAio.hh.

Constructor & Destructor Documentation

◆ XrdOssCsiFileAioJob()

XrdOssCsiFileAioJob::XrdOssCsiFileAioJob ( )
inline

Definition at line 46 of file XrdOssCsiFileAio.hh.

46 { }

◆ ~XrdOssCsiFileAioJob()

virtual XrdOssCsiFileAioJob::~XrdOssCsiFileAioJob ( )
inlinevirtual

Definition at line 47 of file XrdOssCsiFileAio.hh.

47 { }

Member Function Documentation

◆ DoIt()

void XrdOssCsiFileAioJob::DoIt ( )
inlinevirtual

Implements XrdJob.

Definition at line 69 of file XrdOssCsiFileAio.hh.

70  {
71  switch(jobtype_)
72  {
73  case JobReadStep1:
74  // take rangelock, then submit aio read
75  DoItRead1();
76  break;
77 
78  case JobReadStep2:
79  // fetch any extra bytes then verify/fetch csvec
80  DoItRead2();
81  break;
82 
83  case JobWriteStep1:
84  // lock byte range, update/store csvec and queue aio write
85  DoItWrite1();
86  break;
87 
88  case JobWriteStep2:
89  // check return from aio write, write any extra
90  DoItWrite2();
91  break;
92  }
93  }

References DoItRead1(), DoItRead2(), DoItWrite1(), and DoItWrite2().

+ Here is the call graph for this function:

◆ DoItRead1()

void XrdOssCsiFileAioJob::DoItRead1 ( )

Definition at line 285 of file XrdOssCsiFileAio.hh.

286 {
287  // this job takes rangelock and then queues aio read
288 
289  // lock range
290  fp_->Pages()->LockTrackinglen(nio_->rg_, (off_t)aiop_->sfsAio.aio_offset,
291  (off_t)(aiop_->sfsAio.aio_offset+aiop_->sfsAio.aio_nbytes), true);
292 
293  const int ret = fp_->successor_->Read(nio_);
294  if (ret<0)
295  {
296  aiop_->Result = ret;
297  aiop_->doneRead();
298  nio_->Recycle();
299  return;
300  }
301 }
off_t aio_offset
Definition: XrdSfsAio.hh:49
size_t aio_nbytes
Definition: XrdSfsAio.hh:48
XrdOssCsiRangeGuard rg_
virtual void Recycle()
XrdOssCsiPages * Pages()
Definition: XrdOssCsi.hh:140
void LockTrackinglen(XrdOssCsiRangeGuard &, off_t, off_t, bool)
XrdOssDF * successor_
virtual ssize_t Read(off_t offset, size_t size)
Definition: XrdOss.hh:281
ssize_t Result
Definition: XrdSfsAio.hh:65
virtual void doneRead()=0
struct aiocb sfsAio
Definition: XrdSfsAio.hh:62

References aiocb::aio_nbytes, aiocb::aio_offset, XrdSfsAio::doneRead(), XrdOssCsiPages::LockTrackinglen(), XrdOssCsiFile::Pages(), XrdOssDF::Read(), XrdOssCsiFileAio::Recycle(), XrdSfsAio::Result, XrdOssCsiFileAio::rg_, XrdSfsAio::sfsAio, and XrdOssDFHandler::successor_.

Referenced by DoIt().

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

◆ DoItRead2()

void XrdOssCsiFileAioJob::DoItRead2 ( )

Definition at line 218 of file XrdOssCsiFileAio.hh.

219 {
220  // this job runs after async Read
221  // range was already locked read-only before the read
222 
223  if (aiop_->Result<0 || nio_->sfsAio.aio_nbytes==0)
224  {
225  aiop_->doneRead();
226  nio_->Recycle();
227  return;
228  }
229 
230  // if this is a pg operation and this was a short read, try to complete,
231  // otherwise caller will have to deal with joining csvec values from repeated reads
232 
233  ssize_t toread = nio_->sfsAio.aio_nbytes - nio_->Result;
234  ssize_t nread = nio_->Result;
235 
236  if (!pg_)
237  {
238  // not a pg operation, no need to read more
239  toread = 0;
240  }
241  char *p = (char*)nio_->sfsAio.aio_buf;
242  while(toread>0)
243  {
244  const ssize_t rret = fp_->successor_->Read(&p[nread], nio_->sfsAio.aio_offset+nread, toread);
245  if (rret == 0) break;
246  if (rret<0)
247  {
248  aiop_->Result = rret;
249  aiop_->doneRead();
250  nio_->Recycle();
251  return;
252  }
253  toread -= rret;
254  nread += rret;
255  }
256  aiop_->Result = nread;
257 
258  ssize_t puret;
259  if (pg_)
260  {
261  puret = fp_->Pages()->FetchRange(fp_->successor_,
262  (void *)nio_->sfsAio.aio_buf,
263  (off_t)nio_->sfsAio.aio_offset,
264  (size_t)nio_->Result,
265  (uint32_t*)nio_->cksVec,
266  nio_->pgOpts_,
267  nio_->rg_);
268  }
269  else
270  {
271  puret = fp_->Pages()->VerifyRange(fp_->successor_,
272  (void *)nio_->sfsAio.aio_buf,
273  (off_t)nio_->sfsAio.aio_offset,
274  (size_t)nio_->Result,
275  nio_->rg_);
276  }
277  if (puret<0)
278  {
279  aiop_->Result = puret;
280  }
281  aiop_->doneRead();
282  nio_->Recycle();
283 }
void * aio_buf
Definition: XrdSfsAio.hh:47
int FetchRange(XrdOssDF *, const void *, off_t, size_t, uint32_t *, uint64_t, XrdOssCsiRangeGuard &)
int VerifyRange(XrdOssDF *, const void *, off_t, size_t, XrdOssCsiRangeGuard &)
uint32_t * cksVec
Definition: XrdSfsAio.hh:63

References aiocb::aio_buf, aiocb::aio_nbytes, aiocb::aio_offset, XrdSfsAio::cksVec, XrdSfsAio::doneRead(), XrdOssCsiPages::FetchRange(), XrdOssCsiFile::Pages(), XrdOssCsiFileAio::pgOpts_, XrdOssDF::Read(), XrdOssCsiFileAio::Recycle(), XrdSfsAio::Result, XrdOssCsiFileAio::rg_, XrdSfsAio::sfsAio, XrdOssDFHandler::successor_, and XrdOssCsiPages::VerifyRange().

Referenced by DoIt().

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

◆ DoItWrite1()

void XrdOssCsiFileAioJob::DoItWrite1 ( )

Definition at line 303 of file XrdOssCsiFileAio.hh.

304 {
305  // this job runs before async Write
306 
307  // lock range
308  fp_->Pages()->LockTrackinglen(nio_->rg_, (off_t)aiop_->sfsAio.aio_offset,
309  (off_t)(aiop_->sfsAio.aio_offset+aiop_->sfsAio.aio_nbytes), false);
310  int puret;
311  if (pg_) {
312  puret = fp_->Pages()->StoreRange(fp_->successor_,
313  (const void *)aiop_->sfsAio.aio_buf, (off_t)aiop_->sfsAio.aio_offset,
314  (size_t)aiop_->sfsAio.aio_nbytes, (uint32_t*)aiop_->cksVec, nio_->pgOpts_, nio_->rg_);
315 
316  }
317  else
318  {
319  puret = fp_->Pages()->UpdateRange(fp_->successor_,
320  (const void *)aiop_->sfsAio.aio_buf, (off_t)aiop_->sfsAio.aio_offset,
321  (size_t)aiop_->sfsAio.aio_nbytes, nio_->rg_);
322  }
323  if (puret<0)
324  {
325  nio_->rg_.ReleaseAll();
326  fp_->resyncSizes();
327  aiop_->Result = puret;
328  aiop_->doneWrite();
329  nio_->Recycle();
330  return;
331  }
332 
333  const int ret = fp_->successor_->Write(nio_);
334  if (ret<0)
335  {
336  nio_->rg_.ReleaseAll();
337  fp_->resyncSizes();
338  aiop_->Result = ret;
339  aiop_->doneWrite();
340  nio_->Recycle();
341  return;
342  }
343 }
int StoreRange(XrdOssDF *, const void *, off_t, size_t, uint32_t *, uint64_t, XrdOssCsiRangeGuard &)
int UpdateRange(XrdOssDF *, const void *, off_t, size_t, XrdOssCsiRangeGuard &)
virtual ssize_t Write(const void *buffer, off_t offset, size_t size)
Definition: XrdOss.hh:345
virtual void doneWrite()=0

References aiocb::aio_buf, aiocb::aio_nbytes, aiocb::aio_offset, XrdSfsAio::cksVec, XrdSfsAio::doneWrite(), XrdOssCsiPages::LockTrackinglen(), XrdOssCsiFile::Pages(), XrdOssCsiFileAio::pgOpts_, XrdOssCsiFileAio::Recycle(), XrdOssCsiRangeGuard::ReleaseAll(), XrdSfsAio::Result, XrdOssCsiFileAio::rg_, XrdSfsAio::sfsAio, XrdOssCsiPages::StoreRange(), XrdOssDFHandler::successor_, XrdOssCsiPages::UpdateRange(), and XrdOssDF::Write().

Referenced by DoIt().

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

◆ DoItWrite2()

void XrdOssCsiFileAioJob::DoItWrite2 ( )

Definition at line 345 of file XrdOssCsiFileAio.hh.

346 {
347  // this job runs after the async Write
348 
349  if (aiop_->Result<0)
350  {
351  nio_->rg_.ReleaseAll();
352  fp_->resyncSizes();
353  aiop_->doneWrite();
354  nio_->Recycle();
355  return;
356  }
357 
358  // in case there was a short write during the async write, finish
359  // writing the data now, otherwise the crc values will be inconsistent
360  ssize_t towrite = nio_->sfsAio.aio_nbytes - nio_->Result;
361  ssize_t nwritten = nio_->Result;
362  const char *p = (const char*)nio_->sfsAio.aio_buf;
363  while(towrite>0)
364  {
365  const ssize_t wret = fp_->successor_->Write(&p[nwritten], nio_->sfsAio.aio_offset+nwritten, towrite);
366  if (wret<0)
367  {
368  aiop_->Result = wret;
369  nio_->rg_.ReleaseAll();
370  fp_->resyncSizes();
371  aiop_->doneWrite();
372  nio_->Recycle();
373  return;
374  }
375  towrite -= wret;
376  nwritten += wret;
377  }
378  aiop_->Result = nwritten;
379  aiop_->doneWrite();
380  nio_->Recycle();
381 }

References aiocb::aio_buf, aiocb::aio_nbytes, aiocb::aio_offset, XrdSfsAio::doneWrite(), XrdOssCsiFileAio::Recycle(), XrdOssCsiRangeGuard::ReleaseAll(), XrdSfsAio::Result, XrdOssCsiFileAio::rg_, XrdSfsAio::sfsAio, XrdOssDFHandler::successor_, and XrdOssDF::Write().

Referenced by DoIt().

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

◆ Init()

void XrdOssCsiFileAioJob::Init ( XrdOssCsiFile fp,
XrdOssCsiFileAio nio,
XrdSfsAio aiop,
bool  isPg,
bool  read 
)
inline

Definition at line 49 of file XrdOssCsiFileAio.hh.

50  {
51  fp_ = fp;
52  nio_ = nio;
53  aiop_ = aiop;
54  pg_ = isPg;
55  read_ = read;
56  jobtype_ = (read_) ? JobReadStep1 : JobWriteStep1;
57  }
ssize_t read(int fildes, void *buf, size_t nbyte)

References read().

Referenced by XrdOssCsiFileAio::Init().

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

◆ PrepareRead2()

void XrdOssCsiFileAioJob::PrepareRead2 ( )
inline

Definition at line 64 of file XrdOssCsiFileAio.hh.

65  {
66  jobtype_ = JobReadStep2;
67  }

Referenced by XrdOssCsiFileAio::SchedReadJob2().

+ Here is the caller graph for this function:

◆ PrepareWrite2()

void XrdOssCsiFileAioJob::PrepareWrite2 ( )
inline

Definition at line 59 of file XrdOssCsiFileAio.hh.

60  {
61  jobtype_ = JobWriteStep2;
62  }

Referenced by XrdOssCsiFileAio::SchedWriteJob2().

+ Here is the caller graph for this function:

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