XRootD
Loading...
Searching...
No Matches
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 }
#define read(a, b, c)
Definition XrdPosix.hh:82

References read.

Referenced by XrdOssCsiFileAio::Init().

+ 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: