40 const char *f_tpf, *f_tdir, *f_tfile , *f_tmsg;
43 TraceHeader(
const char *tpf,
const char *tdir,
const char *tfile = 0,
const char *tmsg = 0) :
44 f_tpf(tpf), f_tdir(tdir), f_tfile(tfile), f_tmsg(tmsg) {}
49 s << th.f_tpf <<
" " << th.f_tdir;
50 if (th.f_tfile) s << th.f_tfile;
51 if (th.f_tmsg) s <<
" " << th.f_tmsg;
61 const char *m_traceID;
62 const TraceHeader &f_trace_hdr;
66 FpHelper(
XrdOssDF* fp, off_t off,
XrdSysTrace *trace,
const char *tid,
const TraceHeader &thdr) :
67 f_fp(fp), f_off(off), f_trace(trace), m_traceID(tid), f_trace_hdr(thdr)
71 bool ReadRaw(
void *buf, ssize_t size,
bool warnp =
true)
73 ssize_t ret = f_fp->
Read(buf, f_off, size);
78 TRACE(
Warning, f_trace_hdr <<
"Oss Read failed at off=" << f_off <<
" size=" << size
79 <<
" ret=" << ret <<
" error=" << ((ret < 0) ?
XrdSysE2T(-ret) :
"<no error>"));
87 template<
typename T>
bool Read(T &loc,
bool warnp =
true)
89 return ReadRaw(&loc,
sizeof(T), warnp);
93 bool WriteRaw(
const void *buf, ssize_t size)
95 ssize_t ret = f_fp->
Write(buf, f_off, size);
98 TRACE(
Warning, f_trace_hdr <<
"Oss Write failed at off=" << f_off <<
" size=" << size
99 <<
" ret=" << ret <<
" error=" << ((ret < 0) ?
XrdSysE2T(ret) :
"<no error>"));
106 template<
typename T>
bool Write(
const T &loc)
108 return WriteRaw(&loc,
sizeof(T));
125 m_buff_synced(0), m_buff_written(0), m_buff_prefetch(0),
127 m_bitvecSizeInBits(0),
130 m_hasPrefetchBuffer(prefetchBuffer),
153 for (
int i = 0; i < nb; ++i)
241 m_cksCalcMd5->
Init();
246 memcpy(digest, m_cksCalcMd5->
Final(), 16);
256 default :
return "unknown";
268 TraceHeader trace_pfx(
"Write()", dname, fname);
299 TraceHeader trace_pfx(
"Read()", dname, fname);
309 return ReadV2(fp, r.f_off, dname, fname);
313 return ReadV3(fp, r.f_off, dname, fname);
324 if (r.Read(
m_store) || r.Read(cksum))
return false;
328 TRACE(
Error, trace_pfx <<
"Checksum Store mismatch.");
344 TRACE(
Error, trace_pfx <<
"Checksum Synced or AStats mismatch.");
381 time_t now = time(0);
385 for (
int i = 0; i < (int) v.size() - 1; ++i)
387 if (v[i].DetachTime == 0)
388 v[i].DetachTime = std::min(v[i].AttachTime + v[i].Duration / v[i].NumIos, v[i+1].AttachTime);
396 int M = (int) v.size() - 2;
397 for (
int i = 0; i < M; ++i)
399 AStat &a = v[i], &b = v[i + 1];
401 time_t t = std::max((time_t) 1, (now - b.AttachTime) / 2 + (now - a.
DetachTime) / 2);
402 double s = (double) (b.AttachTime - a.
DetachTime) / t;
412 v[min_i].MergeWith(v[min_i + 1]);
414 v.erase(v.begin() + (min_i + 1));
440 m_astats.back().DetachTime = time(0);
498 bool Info::ReadV3(
XrdOssDF* fp, off_t off,
const char *dname,
const char *fname)
500 TraceHeader trace_pfx(
"ReadV3()", dname, fname);
511 char fileCksum[16], tmpCksum[16];
512 if (r.ReadRaw(&fileCksum[0], 16))
return false;
515 if (memcmp(&fileCksum[0], &tmpCksum[0], 16))
517 TRACE(
Error, trace_pfx <<
"buffer cksum and saved cksum don't match.");
533 while ( ! r.Read(as,
false))
536 if (as.NumIos <= 0 || as.AttachTime < 3600*24*365 ||
537 (as.DetachTime != 0 && (as.DetachTime < 3600*24*365 || as.DetachTime < as.AttachTime)))
539 TRACE(
Warning, trace_pfx <<
"Corrupted access record, skipping.");
553 bool Info::ReadV2(
XrdOssDF* fp, off_t off,
const char *dname,
const char *fname)
560 long long BytesMissed;
561 long long BytesBypassed;
564 TraceHeader trace_pfx(
"ReadV2()", dname, fname);
575 char fileCksum[16], tmpCksum[16];
576 if (r.ReadRaw(&fileCksum[0], 16))
return false;
579 if (memcmp(&fileCksum[0], &tmpCksum[0], 16))
581 TRACE(
Error, trace_pfx <<
"buffer cksum and saved cksum don't match.");
597 while ( ! r.ReadRaw(&av2,
sizeof(AStatV2),
false))
600 as.AttachTime = av2.AttachTime;
601 as.DetachTime = av2.DetachTime;
603 as.Duration = av2.DetachTime - av2.AttachTime;
606 as.BytesHit = av2.BytesHit;
607 as.BytesMissed = av2.BytesMissed;
608 as.BytesBypassed = av2.BytesBypassed;
611 if (as.AttachTime < 3600*24*365 ||
612 (as.DetachTime != 0 && (as.DetachTime < 3600*24*365 || as.DetachTime < as.AttachTime)))
614 TRACE(
Warning, trace_pfx <<
"Corrupted access record, skipping.");
628 #ifdef XRDPFC_CKSUM_TEST
630 void Info::TestCksumStuff()
632 static const char* names[] = {
"--",
"-C",
"N-",
"NC" };
636 printf(
"Doing cksum tests for config %s\n", names[conf.
m_cs_Chk]);
639 printf(
"cksum %d, raw %x\n", cfi.m_store.m_status.f_cksum_check, cfi.m_store.m_status._raw_);
642 printf(
"cksum %d, raw %x\n", cfi.m_store.m_status.f_cksum_check, cfi.m_store.m_status._raw_);
644 cfi.m_store.m_status._raw_ |= 0xff0000;
645 printf(
"cksum %d, raw %x\n", cfi.m_store.m_status.f_cksum_check, cfi.m_store.m_status._raw_);
647 cfi.ResetCkSumCache();
648 printf(
"cksum %d, raw %x\n", cfi.m_store.m_status.f_cksum_check, cfi.m_store.m_status._raw_);
651 printf(
"cksum %d, raw %x\n", cfi.m_store.m_status.f_cksum_check, cfi.m_store.m_status._raw_);
658 printf(
"-- File conf %s -- does_cschk_have_missing_bits:%d, downgraded_state:%s\n",
659 names[cs], hasmb, names[cfi.GetCkSumState()]);
uint32_t crc32c(uint32_t crc, void const *buf, size_t len)
std::ostream & operator<<(std::ostream &os, const XrdOucString s)
const char * XrdSysE2T(int errcode)
virtual void Update(const char *Buff, int BLen)=0
virtual ssize_t Read(off_t offset, size_t size)
virtual ssize_t Write(const void *buffer, off_t offset, size_t size)
const Configuration & RefConfiguration() const
Reference XrdPfc configuration.
static Cache & GetInstance()
Singleton access.
Status of cached file. Can be read from and written into a binary file.
void UpdateDownloadCompleteStatus()
Update complete status.
static const char * s_infoExtension
uint32_t CalcCksumStore()
Get cksum, MD5 is for backward compatibility with V2 and V3.
void ResizeBits()
Reserve bit vectors for file_size / buffer_size bytes.
static const int s_defaultVersion
void WriteIOStatSingle(long long bytes_disk)
Write single open/close time for given bytes read from disk.
Info(XrdSysTrace *trace, bool prefetchBuffer=false)
Constructor.
int GetBitvecSizeInBytes() const
Get size of download-state bit-vector in bytes.
unsigned char * m_buff_prefetch
prefetch statistics
static const size_t s_infoExtensionLen
const AStat * GetLastAccessStats() const
Get latest access stats.
void WriteIOStatAttach()
Write open time in the last entry of access statistics.
bool GetLatestDetachTime(time_t &t) const
Get latest detach time.
bool Write(XrdOssDF *fp, const char *dname, const char *fname=0)
void CompactifyAccessRecords()
Compactify access records to the configured maximum.
uint32_t CalcCksumSyncedAndAStats()
unsigned char * m_buff_written
download state vector
unsigned char * m_buff_synced
disk written state vector
bool m_complete
cached; if false, set to true when missingBlocks hit zero
void ResetAllAccessStats()
Reset IO Stats.
bool IsCkSumCache() const
int m_missingBlocks
cached, updated in SetBitWritten()
void WriteIOStat(Stats &s)
Write bytes missed, hits, and disk.
int m_bitvecSizeInBits
cached
std::vector< AStat > m_astats
access records
void SetAllBitsSynced()
Mark all blocks as synced to disk.
bool Read(XrdOssDF *fp, const char *dname, const char *fname=0)
Read content of cinfo file into this object.
const char * GetCkSumStateAsText() const
void SetBufferSizeFileSizeAndCreationTime(long long bs, long long fs)
void WriteIOStatDetach(Stats &s)
Write close time together with bytes missed, hits, and disk.
static size_t s_maxNumAccess
static const char * m_traceID
void CalcCksumMd5(unsigned char *buff, char *digest)
bool m_hasPrefetchBuffer
constains current prefetch score
bool HasNoCkSumTime() const
Statistics of cache utilisation by a File object.
long long m_BytesMissed
number of bytes served from remote and cached
long long m_BytesBypassed
number of bytes served directly through XrdCl
int m_Duration
total duration of all IOs attached
int m_NumIos
number of IO objects attached during this access
long long m_BytesHit
number of bytes served from disk
Contains parameters configurable from the xrootd config file.
bool does_cschk_have_missing_bits(CkSumCheck_e cks_on_file) const
CkSumCheck_e get_cs_Chk() const
int m_cs_Chk
Checksum check.
long long BytesHit
read from cache
long long BytesBypassed
read from remote and dropped
void MergeWith(const AStat &a)
int Duration
total duration of all IOs attached
int NumIos
number of IO objects attached during this access
time_t DetachTime
close time
long long BytesMissed
read from remote and cached
time_t AttachTime
open time
int NumMerged
number of times the record has been merged
int m_astatSize
size of AStat vector
Status m_status
status information
long long m_buffer_size
buffer / block size
time_t m_noCkSumTime
time when first non-cksummed block was detected
size_t m_accessCnt
total access count for the file
long long m_file_size
size of file in bytes
time_t m_creationTime
time the info file was created