1#ifndef __XRDPFC_FILE_HH__
2#define __XRDPFC_FILE_HH__
45struct ReadVBlockListRAM;
46struct ReadVChunkListRAM;
47struct ReadVBlockListDisk;
48struct ReadVChunkListDisk;
134 Block(
File *f,
IO *io,
void *rid,
char *buf,
long long off,
int size,
int rsize,
185 void Done(
int result)
override;
204 void Done(
int result)
override;
218 static File*
FileOpen(
const std::string &path,
long long offset,
long long fileSize,
XrdOucCacheIO* inputIO);
227 int Read(
IO *io,
char* buff,
long long offset,
int size,
ReadReqRH *rh);
267 const char*
lPath()
const;
302 File(
const std::string &path,
long long offset,
long long fileSize);
312 void parse_pfc_url_args(
XrdOucCacheIO* inputIO,
long long &pfc_blocksize,
int &pfc_prefetch)
const;
314 static const char *m_traceID;
322 const std::string m_filename;
323 const long long m_offset;
324 const long long m_file_size;
328 typedef std::set<IO*> IoSet_t;
329 typedef IoSet_t::iterator IoSet_i;
332 IoSet_i m_current_io;
337 std::vector<int> m_writes_during_sync;
338 int m_non_flushed_cnt;
340 bool m_detach_time_logged;
345 typedef std::list<int> IntList_t;
346 typedef IntList_t::iterator IntList_i;
348 typedef std::map<int, Block*> BlockMap_t;
349 typedef BlockMap_t::iterator BlockMap_i;
351 BlockMap_t m_block_map;
353 long long m_block_size;
360 long long m_st_blocks;
361 long long m_resmon_report_threshold;
364 void check_delta_stats();
365 void report_and_merge_delta_stats();
367 std::set<std::string> m_remote_locations;
368 void insert_remote_location(
const std::string &loc);
372 enum PrefetchState_e { kOff=-1, kOn, kHold, kStopped, kComplete };
374 PrefetchState_e m_prefetch_state;
375 int m_prefetch_max_blocks_in_flight;
377 long long m_prefetch_bytes;
378 int m_prefetch_read_cnt;
379 int m_prefetch_hit_cnt;
380 float m_prefetch_score;
382 void inc_prefetch_read_cnt(
int prc) {
if (prc) { m_prefetch_read_cnt += prc; calc_prefetch_score(); } }
383 void inc_prefetch_hit_cnt (
int phc) {
if (phc) { m_prefetch_hit_cnt += phc; calc_prefetch_score(); } }
384 void calc_prefetch_score() { m_prefetch_score = float(m_prefetch_hit_cnt) / m_prefetch_read_cnt; }
388 bool overlap(
int blk,
399 Block* PrepareBlockRequest(
int i, IO *io,
void *req_id,
bool prefetch);
401 void ProcessBlockRequest (Block *b);
404 void RequestBlocksDirect(IO *io, ReadRequest *read_req, std::vector<XrdOucIOVec>& ioVec,
int expected_size);
406 int ReadBlocksFromDisk(std::vector<XrdOucIOVec>& ioVec,
int expected_size);
408 int ReadOpusCoalescere(IO *io,
const XrdOucIOVec *readV,
int readVnum,
409 ReadReqRH *rh,
const char *tpfx);
411 void ProcessDirectReadFinished(ReadRequest *rreq,
int bytes_read,
int error_cond);
412 void ProcessBlockError(Block *b, ReadRequest *rreq);
413 void ProcessBlockSuccess(Block *b, ChunkRequest &creq);
414 void FinalizeReadRequest(ReadRequest *rreq);
416 void ProcessBlockResponse(Block *b,
int res);
420 void inc_ref_count(Block* b);
421 void dec_ref_count(Block* b,
int count = 1);
422 void free_block(Block*);
424 bool select_current_io_or_disable_prefetching(
bool skip_current);
426 int offsetIdx(
int idx)
const;
431inline void File::inc_ref_count(
Block* b)
439inline void File::dec_ref_count(
Block* b,
int count)
442 assert(b->is_finished());
443 b->m_refcnt -= count;
444 assert(b->m_refcnt >= 0);
446 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)
float GetPrefetchScore() const
friend class BlockResponseHandler
void StopPrefetchingOnIO(IO *io)
std::string GetRemoteLocations() const
size_t GetAccessCnt() const
int Fstat(struct stat &sbuff)
static File * FileOpen(const std::string &path, long long offset, long long fileSize, XrdOucCacheIO *inputIO)
Static constructor that also does Open. Returns null ptr if Open fails.
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.
friend class DirectResponseHandler
int GetPrefetchCountOnIO(IO *io)
const Stats & RefStats() const
void Sync()
Sync file cache inf o and output data with disk.
XrdSysTrace * GetTrace() const
void ioUpdated(IO *io)
Notification from IO that it has been updated (remote open).
long long initiate_emergency_shutdown()
long long GetFileSize() const
const std::string & GetLocalPath() const
void BlockRemovedFromWriteQ(Block *)
Handle removal of a block from Cache's write queue.
bool is_in_emergency_shutdown()
XrdSysError * GetLog() const
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.
Statistics of cache utilisation by a File object.
std::list< Block * > BlockList_t
std::vector< ChunkRequest >::iterator vChunkRequest_i
constexpr int kReadPending
std::vector< ChunkRequest > vChunkRequest_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)