1#ifndef __XRDPFC_FILE_HH__
2#define __XRDPFC_FILE_HH__
45class BlockResponseHandler;
46class DirectResponseHandler;
49struct ReadVBlockListRAM;
50struct ReadVChunkListRAM;
51struct ReadVBlockListDisk;
52struct ReadVChunkListDisk;
137 Block(
File *f,
IO *io,
void *rid,
char *buf,
long long off,
int size,
int rsize,
188 void Done(
int result)
override;
207 void Done(
int result)
override;
220 static File*
FileOpen(
const std::string &path,
long long offset,
long long fileSize);
232 int Read(
IO *io,
char* buff,
long long offset,
int size,
ReadReqRH *rh);
272 const char*
lPath()
const;
306 File(
const std::string &path,
long long offset,
long long fileSize);
311 static const char *m_traceID;
319 std::string m_filename;
321 long long m_file_size;
325 typedef std::set<IO*> IoSet_t;
326 typedef IoSet_t::iterator IoSet_i;
329 IoSet_i m_current_io;
334 std::vector<int> m_writes_during_sync;
335 int m_non_flushed_cnt;
337 bool m_detach_time_logged;
342 typedef std::list<int> IntList_t;
343 typedef IntList_t::iterator IntList_i;
345 typedef std::map<int, Block*> BlockMap_t;
346 typedef BlockMap_t::iterator BlockMap_i;
348 BlockMap_t m_block_map;
350 long long m_block_size;
358 std::set<std::string> m_remote_locations;
359 void insert_remote_location(
const std::string &loc);
363 enum PrefetchState_e { kOff=-1, kOn, kHold, kStopped, kComplete };
365 PrefetchState_e m_prefetch_state;
367 int m_prefetch_read_cnt;
368 int m_prefetch_hit_cnt;
369 float m_prefetch_score;
371 void inc_prefetch_read_cnt(
int prc) {
if (prc) { m_prefetch_read_cnt += prc; calc_prefetch_score(); } }
372 void inc_prefetch_hit_cnt (
int phc) {
if (phc) { m_prefetch_hit_cnt += phc; calc_prefetch_score(); } }
373 void calc_prefetch_score() { m_prefetch_score = float(m_prefetch_hit_cnt) / m_prefetch_read_cnt; }
377 bool overlap(
int blk,
388 Block* PrepareBlockRequest(
int i, IO *io,
void *req_id,
bool prefetch);
390 void ProcessBlockRequest (Block *b);
393 void RequestBlocksDirect(IO *io, ReadRequest *read_req, std::vector<XrdOucIOVec>& ioVec,
int expected_size);
395 int ReadBlocksFromDisk(std::vector<XrdOucIOVec>& ioVec,
int expected_size);
397 int ReadOpusCoalescere(IO *io,
const XrdOucIOVec *readV,
int readVnum,
398 ReadReqRH *rh,
const char *tpfx);
400 void ProcessDirectReadFinished(ReadRequest *rreq,
int bytes_read,
int error_cond);
401 void ProcessBlockError(Block *b, ReadRequest *rreq);
402 void ProcessBlockSuccess(Block *b, ChunkRequest &creq);
403 void FinalizeReadRequest(ReadRequest *rreq);
405 void ProcessBlockResponse(Block *b,
int res);
409 void inc_ref_count(Block* b);
410 void dec_ref_count(Block* b,
int count = 1);
411 void free_block(Block*);
413 bool select_current_io_or_disable_prefetching(
bool skip_current);
415 int offsetIdx(
int idx)
const;
420inline void File::inc_ref_count(Block* b)
428inline void File::dec_ref_count(Block* b,
int count)
431 assert(b->is_finished());
432 b->m_refcnt -= count;
433 assert(b->m_refcnt >= 0);
435 if (b->m_refcnt == 0)
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)
vCkSum_t & ref_cksum_vec()
long long get_offset() const
vChunkRequest_t m_chunk_reqs
void * get_req_id() const
bool req_cksum_net() const
void reset_error_and_set_io(IO *io, void *rid)
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)
std::string & GetLocalPath()
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
size_t GetAccessCnt() const
void RequestSyncOfDetachStats()
Flags that detach stats should be written out in final sync. Called from CacheIO upon Detach.
int GetNDownloadedBlocks() const
const Info::AStat * GetLastAccessStats() const
void BlocksRemovedFromWriteQ(std::list< Block * > &)
Handle removal of a set of blocks from Cache's write queue.
void initiate_emergency_shutdown()
int GetPrefetchCountOnIO(IO *io)
const Stats & RefStats() const
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).
void BlockRemovedFromWriteQ(Block *)
Handle removal of a block from Cache's write queue.
Stats DeltaStatsFromLastCall()
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.
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)