1#ifndef __XRDPFC_FILE_HH__
2#define __XRDPFC_FILE_HH__
45class BlockResponseHandler;
46class DirectResponseHandler;
49struct ReadVBlockListRAM;
50struct ReadVChunkListRAM;
51struct ReadVBlockListDisk;
52struct ReadVChunkListDisk;
138 Block(
File *f,
IO *io,
void *rid,
char *buf,
long long off,
int size,
int rsize,
189 void Done(
int result)
override;
208 void Done(
int result)
override;
221 static File*
FileOpen(
const std::string &path,
long long offset,
long long fileSize);
233 int Read(
IO *io,
char* buff,
long long offset,
int size,
ReadReqRH *rh);
273 const char*
lPath()
const;
310 File(
const std::string &path,
long long offset,
long long fileSize);
315 static const char *m_traceID;
323 std::string m_filename;
325 long long m_file_size;
329 typedef std::set<IO*> IoSet_t;
330 typedef IoSet_t::iterator IoSet_i;
333 IoSet_i m_current_io;
338 std::vector<int> m_writes_during_sync;
339 int m_non_flushed_cnt;
341 bool m_detach_time_logged;
346 typedef std::list<int> IntList_t;
347 typedef IntList_t::iterator IntList_i;
349 typedef std::map<int, Block*> BlockMap_t;
350 typedef BlockMap_t::iterator BlockMap_i;
352 BlockMap_t m_block_map;
354 long long m_block_size;
362 std::set<std::string> m_remote_locations;
363 void insert_remote_location(
const std::string &loc);
367 enum PrefetchState_e { kOff=-1, kOn, kHold, kStopped, kComplete };
369 PrefetchState_e m_prefetch_state;
371 long long m_prefetch_bytes;
372 int m_prefetch_read_cnt;
373 int m_prefetch_hit_cnt;
374 float m_prefetch_score;
376 void inc_prefetch_read_cnt(
int prc) {
if (prc) { m_prefetch_read_cnt += prc; calc_prefetch_score(); } }
377 void inc_prefetch_hit_cnt (
int phc) {
if (phc) { m_prefetch_hit_cnt += phc; calc_prefetch_score(); } }
378 void calc_prefetch_score() { m_prefetch_score = float(m_prefetch_hit_cnt) / m_prefetch_read_cnt; }
382 bool overlap(
int blk,
393 Block* PrepareBlockRequest(
int i, IO *io,
void *req_id,
bool prefetch);
395 void ProcessBlockRequest (Block *b);
398 void RequestBlocksDirect(IO *io, ReadRequest *read_req, std::vector<XrdOucIOVec>& ioVec,
int expected_size);
400 int ReadBlocksFromDisk(std::vector<XrdOucIOVec>& ioVec,
int expected_size);
402 int ReadOpusCoalescere(IO *io,
const XrdOucIOVec *readV,
int readVnum,
403 ReadReqRH *rh,
const char *tpfx);
405 void ProcessDirectReadFinished(ReadRequest *rreq,
int bytes_read,
int error_cond);
406 void ProcessBlockError(Block *b, ReadRequest *rreq);
407 void ProcessBlockSuccess(Block *b, ChunkRequest &creq);
408 void FinalizeReadRequest(ReadRequest *rreq);
410 void ProcessBlockResponse(Block *b,
int res);
414 void inc_ref_count(Block* b);
415 void dec_ref_count(Block* b,
int count = 1);
416 void free_block(Block*);
418 bool select_current_io_or_disable_prefetching(
bool skip_current);
420 int offsetIdx(
int idx)
const;
425inline void File::inc_ref_count(Block* b)
433inline void File::dec_ref_count(Block* b,
int count)
436 assert(b->is_finished());
437 b->m_refcnt -= count;
438 assert(b->m_refcnt >= 0);
440 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
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
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)