1 #ifndef __XRDPFC_FILE_HH__
2 #define __XRDPFC_FILE_HH__
41 class BlockResponseHandler;
42 class DirectResponseHandler;
45 struct ReadVBlockListRAM;
46 struct ReadVChunkListRAM;
47 struct ReadVBlockListDisk;
48 struct 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;
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;
431 inline void File::inc_ref_count(Block* b)
439 inline 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)
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)
const char * lPath() const
Log path.
int Read(IO *io, char *buff, long long offset, int size, ReadReqRH *rh)
Normal read.
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 ioUpdated(IO *io)
Notification from IO that it has been updated (remote open).
int ReadV(IO *io, const XrdOucIOVec *readV, int readVnum, ReadReqRH *rh)
Vector read.
void StopPrefetchingOnIO(IO *io)
void RequestSyncOfDetachStats()
Flags that detach stats should be written out in final sync. Called from CacheIO upon Detach.
const Info::AStat * GetLastAccessStats() const
size_t GetAccessCnt() const
void BlocksRemovedFromWriteQ(std::list< Block * > &)
Handle removal of a set of blocks from Cache's write queue.
bool ioActive(IO *io)
Initiate close. Return true if still IO active. Used in XrdPosixXrootd::Close()
void Sync()
Sync file cache inf o and output data with disk.
long long GetPrefetchedBytes() const
float GetPrefetchScore() const
int GetNDownloadedBlocks() const
int Fstat(struct stat &sbuff)
int GetPrefetchCountOnIO(IO *io)
void WriteBlockToDisk(Block *b)
long long initiate_emergency_shutdown()
XrdSysError * GetLog() const
long long GetFileSize() const
std::string GetRemoteLocations() const
const Stats & RefStats() const
bool FinalizeSyncBeforeExit()
Returns true if any of blocks need sync. Called from Cache::dec_ref_cnt on zero ref cnt.
void BlockRemovedFromWriteQ(Block *)
Handle removal of a block from Cache's write queue.
const std::string & GetLocalPath() const
bool is_in_emergency_shutdown()
XrdSysTrace * GetTrace() const
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, time_t timeout=0)
Factory for creating ReadImpl objects.
CloseImpl< false > Close(Ctx< File > file, time_t timeout=0)
Factory for creating CloseImpl objects.
std::vector< ChunkRequest > vChunkRequest_t
std::vector< ChunkRequest >::iterator vChunkRequest_i
constexpr int kReadPending
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)