-
Notifications
You must be signed in to change notification settings - Fork 149
/
XrdFileCacheFile.hh
146 lines (103 loc) · 4.2 KB
/
XrdFileCacheFile.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef __XRDFILECACHE_FILE_HH__
#define __XRDFILECACHE_FILE_HH__
#include "XrdCl/XrdClXRootDResponses.hh"
#include <string>
#include <map>
namespace XrdFileCache
{
class RefCounted
{
int m_refcnt;
RefCounted() : m_refcnt(0) {}
};
class File;
class Block
{
public:
std::vector<char> m_buff;
long long m_offset;
File *m_file;
int m_refcnt;
int m_errno;
bool m_downloaded;
bool m_on_disk;
Block(File *f, long long off, int size) :
m_offset(off), m_file(f), m_refcnt(0),
m_errno(0), m_downloaded(false), m_on_disk(false)
{
mbuff.resize(size);
}
char* get_buff(long long pos = 0) const { return &m_buff[pos]; }
bool is_finished() { return m_downloaded || m_errno != 0; }
bool is_ok() { return m_downloaded; }
bool is_failed() { return m_errno != 0; }
void set_error_and_free(int err)
{
m_errno = err;
m_buff.resize(0);
}
};
class File
{
XrdOucCacheIO *m_input; //!< original data source
XrdOssDF *m_output; //!< file handle for data file on disk
XrdOssDF *m_infoFile; //!< file handle for data-info file on disk
Info m_cfi; //!< download status of file blocks and access statistics
std::string m_temp_filename; //!< filename of data file on disk
long long m_offset; //!< offset of cached file for block-based operation
long long m_fileSize; //!< size of cached disk file for block-based operation
typedef std::list<int> IntList_t;
typedef IntList_t::iterator IntList_i;
typedef std::list<Block*> BlockList_t;
typedef BlockList_t::iterator BlockList_i;
typedef std::map<int, Block*> BlockMap_t;
typedef BlockMap_t::iterator BlockMap_i;
BlockMap_t m_block_map;
XrdSysCondVar m_block_cond;
int m_num_reads;
Stats m_stats; //!< cache statistics, used in IO detach
public:
//------------------------------------------------------------------------
//! Constructor.
//------------------------------------------------------------------------
File(XrdOucCacheIO &io, std::string &path,
long long offset, long long fileSize);
//------------------------------------------------------------------------
//! Destructor.
//------------------------------------------------------------------------
~File();
//! Open file handle for data file and info file on local disk.
bool Open();
int Read(char* buff, off_t offset, size_t size);
private:
Block* RequestBlock(int i);
int RequestBlocksDirect(DirectRH *handler, IntList_t& blocks,
long long req_buf, long long req_off, long long req_size);
int ReadBlocksFromDisk(IntList_t& blocks,
long long req_buf, long long req_off, long long req_size);
void ProcessBlockResponse(Block* b, XrdCl::XRootDStatus *status);
};
// ================================================================
class BlockResponseHandler : public XrdCl::ResponseHandler
{
public:
Block *m_block;
BlockResponseHandler(Block *b) : m_block(b) {}
void HandleResponse(XrdCl::XRootDStatus *status,
XrdCl::AnyObject *response);
};
class DirectResponseHandler : public XrdCl::ResponseHandler
{
public:
XrdSysCondVar m_cond;
int m_to_wait;
int m_errno;
DirectResponseHandler(int to_wait) : m_cond(0), m_to_wait(to_wait), m_errno(0) {}
bool is_finished() { XrdSysCondVarHelper _lck(m_cond); return m_to_wait == 0; }
bool is_ok() { XrdSysCondVarHelper _lck(m_cond); return m_to_wait == 0 && m_errno == 0; }
bool is_failed() { XrdSysCondVarHelper _lck(m_cond); return m_errno != 0; }
void HandleResponse(XrdCl::XRootDStatus *status,
XrdCl::AnyObject *response);
};
}
#endif