1 #ifndef __XRDPFC_FILE_HH__
2 #define __XRDPFC_FILE_HH__
40 class BlockResponseHandler;
41 class DirectResponseHandler;
44 struct ReadVBlockListRAM;
45 struct ReadVChunkListRAM;
46 struct ReadVBlockListDisk;
47 struct ReadVChunkListDisk;
127 Block(
File *f,
IO *io,
void *rid,
char *buf,
long long off,
int size,
int rsize,
178 void Done(
int result)
override;
197 void Done(
int result)
override;
211 static File*
FileOpen(
const std::string &path,
long long offset,
long long fileSize);
220 int Read(
IO *io,
char* buff,
long long offset,
int size,
ReadReqRH *rh);
260 const char*
lPath()
const;
295 File(
const std::string &path,
long long offset,
long long fileSize);
306 static const char *m_traceID;
314 const std::string m_filename;
315 const long long m_offset;
316 const long long m_file_size;
320 typedef std::set<IO*> IoSet_t;
321 typedef IoSet_t::iterator IoSet_i;
324 IoSet_i m_current_io;
329 std::vector<int> m_writes_during_sync;
330 int m_non_flushed_cnt;
332 bool m_detach_time_logged;
337 typedef std::list<int> IntList_t;
338 typedef IntList_t::iterator IntList_i;
340 typedef std::map<int, Block*> BlockMap_t;
341 typedef BlockMap_t::iterator BlockMap_i;
343 BlockMap_t m_block_map;
345 long long m_block_size;
352 long long m_st_blocks;
353 long long m_resmon_report_threshold;
356 void check_delta_stats();
357 void report_and_merge_delta_stats();
359 std::set<std::string> m_remote_locations;
360 void insert_remote_location(
const std::string &loc);
364 enum PrefetchState_e { kOff=-1, kOn, kHold, kStopped, kComplete };
366 PrefetchState_e m_prefetch_state;
368 long long m_prefetch_bytes;
369 int m_prefetch_read_cnt;
370 int m_prefetch_hit_cnt;
371 float m_prefetch_score;
373 void inc_prefetch_read_cnt(
int prc) {
if (prc) { m_prefetch_read_cnt += prc; calc_prefetch_score(); } }
374 void inc_prefetch_hit_cnt (
int phc) {
if (phc) { m_prefetch_hit_cnt += phc; calc_prefetch_score(); } }
375 void calc_prefetch_score() { m_prefetch_score = float(m_prefetch_hit_cnt) / m_prefetch_read_cnt; }
379 bool overlap(
int blk,
390 Block* PrepareBlockRequest(
int i, IO *io,
void *req_id,
bool prefetch);
392 void ProcessBlockRequest (Block *b);
395 void RequestBlocksDirect(IO *io, ReadRequest *read_req, std::vector<XrdOucIOVec>& ioVec,
int expected_size);
397 int ReadBlocksFromDisk(std::vector<XrdOucIOVec>& ioVec,
int expected_size);
399 int ReadOpusCoalescere(IO *io,
const XrdOucIOVec *readV,
int readVnum,
400 ReadReqRH *rh,
const char *tpfx);
402 void ProcessDirectReadFinished(ReadRequest *rreq,
int bytes_read,
int error_cond);
403 void ProcessBlockError(Block *b, ReadRequest *rreq);
404 void ProcessBlockSuccess(Block *b, ChunkRequest &creq);
405 void FinalizeReadRequest(ReadRequest *rreq);
407 void ProcessBlockResponse(Block *b,
int res);
411 void inc_ref_count(Block* b);
412 void dec_ref_count(Block* b,
int count = 1);
413 void free_block(Block*);
415 bool select_current_io_or_disable_prefetching(
bool skip_current);
417 int offsetIdx(
int idx)
const;
422 inline void File::inc_ref_count(Block* b)
430 inline void File::dec_ref_count(Block* b,
int count)
433 assert(b->is_finished());
434 b->m_refcnt -= count;
435 assert(b->m_refcnt >= 0);
437 if (b->m_refcnt == 0)
int stat(const char *path, struct stat *buf)
void Done(int result) override
BlockResponseHandler(Block *b)
int * ptr_n_cksum_errors()
Block(File *f, IO *io, void *rid, char *buf, long long off, int size, int rsize, bool m_prefetch, bool cks_net)
void * get_req_id() const
long long get_offset() const
vChunkRequest_t m_chunk_reqs
vCkSum_t & ref_cksum_vec()
bool req_cksum_net() const
void reset_error_and_set_io(IO *io, void *rid)
Attaches/creates and detaches/deletes cache-io objects for disk based cache.
void Done(int result) override
DirectResponseHandler(File *file, ReadRequest *rreq, int to_wait)
bool FinalizeSyncBeforeExit()
Returns true if any of blocks need sync. Called from Cache::dec_ref_cnt on zero ref cnt.
const char * lPath() const
Log path.
int ReadV(IO *io, const XrdOucIOVec *readV, int readVnum, ReadReqRH *rh)
Vector read.
void WriteBlockToDisk(Block *b)
static File * FileOpen(const std::string &path, long long offset, long long fileSize)
Static constructor that also does Open. Returns null ptr if Open fails.
float GetPrefetchScore() const
void StopPrefetchingOnIO(IO *io)
std::string GetRemoteLocations() const
const Info::AStat * GetLastAccessStats() const
size_t GetAccessCnt() const
int Fstat(struct stat &sbuff)
void RequestSyncOfDetachStats()
Flags that detach stats should be written out in final sync. Called from CacheIO upon Detach.
long long GetPrefetchedBytes() const
int GetNDownloadedBlocks() const
void BlocksRemovedFromWriteQ(std::list< Block * > &)
Handle removal of a set of blocks from Cache's write queue.
int GetPrefetchCountOnIO(IO *io)
void Sync()
Sync file cache inf o and output data with disk.
int Read(IO *io, char *buff, long long offset, int size, ReadReqRH *rh)
Normal read.
void ioUpdated(IO *io)
Notification from IO that it has been updated (remote open).
long long initiate_emergency_shutdown()
long long GetFileSize() const
const Stats & RefStats() const
void BlockRemovedFromWriteQ(Block *)
Handle removal of a block from Cache's write queue.
const std::string & GetLocalPath() const
bool is_in_emergency_shutdown()
bool ioActive(IO *io)
Initiate close. Return true if still IO active. Used in XrdPosixXrootd::Close()
Base cache-io class that implements some XrdOucCacheIO abstract methods.
Status of cached file. Can be read from and written into a binary file.
const AStat * GetLastAccessStats() const
Get latest access stats.
long long GetBufferSize() const
Get prefetch buffer size.
int GetNDownloadedBlocks() const
Get number of downloaded blocks.
size_t GetAccessCnt() const
Get number of accesses.
int GetNBlocks() const
Get number of blocks represented in download-state bit-vector.
Statistics of cache utilisation by a File object.
OpenImpl< false > Open(Ctx< File > file, Arg< std::string > url, Arg< OpenFlags::Flags > flags, Arg< Access::Mode > mode=Access::None, uint16_t timeout=0)
Factory for creating ReadImpl objects.
CloseImpl< false > Close(Ctx< File > file, uint16_t timeout=0)
Factory for creating CloseImpl objects.
std::vector< ChunkRequest > vChunkRequest_t
std::vector< ChunkRequest >::iterator vChunkRequest_i
std::list< Block * > BlockList_t
std::vector< uint32_t > vCkSum_t
std::list< Block * >::iterator BlockList_i
ChunkRequest(ReadRequest *rreq, char *buf, long long off, int size)
ReadReqRH(unsigned short sid, XrdOucCacheIOCB *iocb)
void update_error_cond(int ec)
ReadRequest(IO *io, ReadReqRH *rh)